While循环每次迭代两次,CPU只在选择“S”作为剪刀时得分。另一个问题是,我如何使它更好,我在哪里添加该函数?我必须使用字符“r”,“s”和“p”,而不是1,2,3来接受用户输入。不知道如何继续修复这个问题
#include <stdlib.h>
#include<time.h>
int main () {
char player1;
int player2;
int userScore = 0, cpuScore = 0;
player2 = rand ( ) % 3 + 1;
srand ((int) time (NULL));
int count = 0;
while(count <= 10) {
printf("\nEnter p for Paper, r for rock, or S for scissor: ");
scanf("%c", &player1);
switch(player1) {
case 'P' :
if(player1 == 'P' && player2 == 1) {
printf("Draw!");
break;
} else if(player1 == 'P' && player2 == 2) {
userScore++;
printf("User won this one!");
break;
} else {
cpuScore++;
printf("CPU won this one!");
break;
}
case 'R':
if(player1 == 'R' && player2 == 2) {
printf("Draw!");
break;
} else if(player1 == 'R' && player2 == 3) {
userScore++;
printf("User won this one!");
break;
} else {
cpuScore++;
printf("CPU won this one!");
break;
}
case 'S':
if(player1 == 'S' && player2 == 3) {
printf("Draw!");
break;
} else if(player1 == 'S' && player2 == 1) {
userScore++;
break;
printf("User won this one!");
} else {
cpuScore++;
printf("CPU won this one!");
break;
}
default :
printf("\nInvalid Input");
break;
}
printf("\nUser Score: %d", userScore);
printf("\nCPU Score: %d", cpuScore);
count++;
}
if(userScore == cpuScore) {
printf("\nDraw game!");
} else if(userScore > cpuScore) {
printf("\nYou win!");
} else {
printf("\nCPU wins!");
}
return 0;
} ```
3条答案
按热度按时间mv1qrgav1#
我建议你把它变得简单一些。石头剪刀布的赢家可以用算术来决定。
比较同类比较更简单,使用整数值可以实现更简单的算术解决方案,而且从算术上讲,使用0,1,2比使用1,2,3更简单,因此,首先将用户输入转换为0,1,2:
然后,计算机游戏应确定如下:
不过请注意,您只需要调用
srand()
一次,因此如果您将游戏放入循环中以重复播放,srand()
调用应该出现在repeat循环 * 之前 *。然后,您可以按以下方式报告该播放:
则
human
和computer
是直接的和算术上可比较的,使得:或(记入@HAL9000):
把所有这些放在一起:
输出示例:
pgpifvop2#
试试这个:
我还应该补充一点,这个程序是敏感的。例如,输入"r"将不起作用,但"r"将起作用。请酌情更改此设置。
wydwbb8l3#
问题是您在循环外设置了
player2
,而没有更新它;它总是相同的。这可能是一个典型的情况,不需要通过toupper
将其转换为中间值,直接将其转换为enum
将是合适的。不需要用if
转换switch
,这将问题空间缩小到3个值,这很容易适合查找表。我还将
userScore
和cpuScore
放入以enum Outcome
为索引的数组中。