石头剪刀布游戏中Player1与Player2分数变量无法递增问题
石头剪刀布游戏分数无法递增的问题排查与修复
核心问题:分数计算逻辑从未执行
在main函数的循环中,当玩家输入有效选择(0/1/2)时,代码执行了continue语句——这会直接跳过循环体剩余的所有代码(包括关键的gamelogic(Pl1choice, Pl2choice);调用),导致分数更新逻辑完全没机会运行,所以Player1和Player2的分数始终保持初始值0。
修复方法
调整输入验证逻辑,移除错误的continue,确保有效输入时能执行分数计算:
// 替换原输入验证代码 if (Pl1choice < 0 || Pl1choice > 2) { printf("You entered an invalid number so you have to restart the game.\n"); break; } // 有效输入才执行胜负判断 gamelogic(Pl1choice, Pl2choice);
游戏胜负逻辑完全颠倒
gamelogic函数中的条件判断不仅存在运算符优先级错误,还完全颠倒了胜负规则:
- 原逻辑中,玩家1选布(1)赢石头(0)时,反而给玩家2加分;
- 运算符优先级问题导致
Pl2choice == 0 && Pl1choice == 1 || Pl1choice == 2等价于(Pl2choice==0 && Pl1choice==1) || Pl1choice==2,即只要玩家1选剪刀(2),不管电脑选什么,都会给玩家2加分。
修复后的gamelogic函数
按照石头剪刀布的正确规则(石头赢剪刀,布赢石头,剪刀赢布)重构逻辑:
int gamelogic(int Pl1choice, int Pl2choice) { // 平局处理 if (Pl1choice == Pl2choice) { return 0; } // 玩家1获胜的情况 if ((Pl1choice == 0 && Pl2choice == 2) || (Pl1choice == 1 && Pl2choice == 0) || (Pl1choice == 2 && Pl2choice == 1)) { Player1++; return 1; } // 剩余情况均为玩家2获胜 Player2++; return 2; }
随机数生成重复问题
generatearandomnumber函数中每次调用srand(time(NULL)),由于循环迭代速度远快于秒级时间更新,会导致多次生成相同的随机数。应将随机数种子初始化放在main函数开头,只执行一次:
int main() { srand(time(NULL)); // 仅初始化一次随机数种子 printf("Hey! You are the player no.1 and Computer is Player no.2\n"); // ... 剩余代码 }
同时删除generatearandomnumber中的srand(time(NULL)):
void generatearandomnumber(void) { Pl2choice = rand() % 3; }
修复后的完整代码
#include <stdio.h> #include <time.h> #include <stdlib.h> // Globally declared variables here int Pl1choice, Pl2choice; int Player1 = 0, Player2 = 0; // Declarations of the functions here void generatearandomnumber(void); void Player1choicedisp(void); int gamelogic(int Pl1choice, int Pl2choice); void pl1choices(int Pl1choice); void pl2choices(int Pl2choice); int main() { srand(time(NULL)); printf("Hey! You are the player no.1 and Computer is Player no.2\n"); for (int i = 1; i <= 3; i++) { Player1choicedisp(); scanf("%d", &Pl1choice); generatearandomnumber(); pl1choices(Pl1choice); pl2choices(Pl2choice); // 输入验证 if (Pl1choice < 0 || Pl1choice > 2) { printf("You entered an invalid number so you have to restart the game.\n"); break; } gamelogic(Pl1choice, Pl2choice); } if(Player1 > Player2) { printf("Winner is Player1\n"); } else if(Player1 == Player2) { printf("Its a tie\n"); } else { printf("Winner is Player2\n"); } printf("Scores :-\n"); printf("Player1 = %d\n", Player1); printf("Player2 = %d\n", Player2); return 0; } void generatearandomnumber(void) { Pl2choice = rand() % 3; } void Player1choicedisp(void) { printf("Enter your choice for the Rock/Paper/scissors\n"); printf("Enter 0 for ROCK\n"); printf("Enter 1 for PAPER\n"); printf("Enter 2 for SCISSORS\n"); } int gamelogic(int Pl1choice, int Pl2choice) { if (Pl1choice == Pl2choice) { return 0; } if ((Pl1choice == 0 && Pl2choice == 2) || (Pl1choice == 1 && Pl2choice == 0) || (Pl1choice == 2 && Pl2choice == 1)) { Player1++; return 1; } Player2++; return 2; } void pl1choices(int Pl1choice) { switch(Pl1choice) { case 0: printf("Player 1 chose ROCK\n"); break; case 1: printf("Player 1 chose PAPER\n"); break; case 2: printf("Player 1 chose SCISSORS\n"); break; } } void pl2choices(int Pl2choice) { switch(Pl2choice) { case 0: printf("Player 2 chose ROCK\n"); break; case 1: printf("Player 2 chose PAPER\n"); break; case 2: printf("Player 2 chose SCISSORS\n"); break; } }
内容的提问来源于stack exchange,提问作者SWAYAM DALAL
相关产品推荐
相关产品推荐

