This question already has answers here:
Why doesn't getchar() wait for me to press enter after scanf()?
                                
                                    (10个回答)
                                
                        
                                2年前关闭。
            
                    
#include <stdio.h>
#include <stdlib.h> //for random()
#include <time.h>

void RockPaperScissors(char usrVal);

main(){

char input;
int i;
        for (i = 0; i < 3; ++i){
            printf("\nEnter r, p, or s for rock paper scissors: ");
            input = getchar();
            RockPaperScissors(input);
    }
    printf("\n\n\nTHE GAME IS OVER\n\n");
}




void RockPaperScissors(char usrVal){

    const int rock = 0;
    const int paper = 1;
    const int scissors = 2;

    srand(time(NULL));
    int comVal = rand() % 2 + 0;

    int usrScore = 0;
    int comScore = 0;
    int tie = 0;

    switch (usrVal){
            case 'r':
                    if (comVal == paper)
                            printf("\nYOU LOSE!!!\n");
                            ++comScore;
                            break;
                    if (comVal == scissors)
                            printf("\nYOU WIN!!!\n");
                            ++usrScore;
                            break;
            case 'p':
                    if (comVal == rock)
                            printf("\nYOU WIN!!!\n");
                            ++usrScore;
                            break;
                    if (comVal == scissors)
                            printf("\nYOU LOSE!!!\n");
                            ++comScore;
                            break;
            case 's':
                     if (comVal == rock)
                            printf("\nYOU LOSE!!!\n");
                            ++comScore;
                            break;
                    if (comVal == scissors)
                            printf("\nYOU WIN!!!\n");
                            ++usrScore;
                            break;
            default:
                    printf("\nTIE\n");
                    ++tie;
                     printf("\ncomVal: %d  usrVal: %c\n", comVal, usrVal);


           }

    printf("\nscore is user: %d   computer: %d  Tie: %d \n\n\n\n", usrScore, comScore, tie);
}


 // ISSUES: need way to store score count.. need to fix rando()..sometimes printf() is skipped in switch statement
  //Need to fix the for loop (it does not ask for input every time)


我已经在这个问题上停留了几个小时。我浏览了多个论坛,但没有发现任何能真正解释我问题的内容。程序将进入循环的一个迭代,然后跳过用户输入。但是之后,它将要求输入。



输入用于剪刀石头布的r,p或s:r

得分是用户:0计算机:1领带:0



输入剪刀石头布的r,p或s:
领带

comVal:0 usrVal:

得分是用户:0计算机:0领带:1



输入用于剪刀石头布的r,p或s:r

得分是用户:0计算机:1领带:0

游戏结束了

最佳答案

input = getchar();设置为scanf("\n%c", &input);。您的问题是不受管理的\n(换行)。\n也被视为字符,因此您按下的输入用于下一个getchar()

还要将main()更改为int main()(主要应该通常使用一些int类型的返回值)并改进代码缩进。(如果使用的是return 0;,请不要忘记添加int main()

修改后的代码:-

#include <stdio.h>
#include <stdlib.h> //for random()
#include <time.h>

void RockPaperScissors(char usrVal);

int main() // make it int main()
{

        char input;
        int i;
        for (i = 0; i < 3; ++i)
        {
                printf("\nEnter r, p, or s for rock paper scissors: ");
                scanf("\n%c", &input);  // not input = getchar();
                RockPaperScissors(input);
        }
        printf("\n\n\nTHE GAME IS OVER\n\n");
        return 0;
}

void RockPaperScissors(char usrVal)
{

        const int rock = 0;
        const int paper = 1;
        const int scissors = 2;

        srand(time(NULL));
        int comVal = rand() % 2 + 0;

        int usrScore = 0;
        int comScore = 0;
        int tie = 0;

        switch (usrVal)
        {
        case 'r':
                if (comVal == paper)
                        printf("\nYOU LOSE!!!\n");
                ++comScore;
                break;
                if (comVal == scissors)
                        printf("\nYOU WIN!!!\n");
                ++usrScore;
                break;
        case 'p':
                if (comVal == rock)
                        printf("\nYOU WIN!!!\n");
                ++usrScore;
                break;
                if (comVal == scissors)
                        printf("\nYOU LOSE!!!\n");
                ++comScore;
                break;
        case 's':
                if (comVal == rock)
                        printf("\nYOU LOSE!!!\n");
                ++comScore;
                break;
                if (comVal == scissors)
                        printf("\nYOU WIN!!!\n");
                ++usrScore;
                break;
        default:
                printf("\nTIE\n");
                ++tie;
                printf("\ncomVal: %d  usrVal: %c\n", comVal, usrVal);
        }

        printf("\nscore is user: %d   computer: %d  Tie: %d \n\n\n\n", usrScore, comScore, tie);
}

10-08 15:13