This question already has answers here:
Why doesn't getchar() wait for me to press enter after scanf()?
(10个回答)
2年前关闭。
我已经在这个问题上停留了几个小时。我浏览了多个论坛,但没有发现任何能真正解释我问题的内容。程序将进入循环的一个迭代,然后跳过用户输入。但是之后,它将要求输入。
输入用于剪刀石头布的r,p或s:r
得分是用户:0计算机:1领带:0
输入剪刀石头布的r,p或s:
领带
comVal:0 usrVal:
得分是用户:0计算机:0领带:1
输入用于剪刀石头布的r,p或s:r
得分是用户:0计算机:1领带:0
游戏结束了
(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