编写石头剪刀布游戏时,while循环内printf重复输出问题求助
石头剪刀布C程序printf重复输出问题解决
问题描述
编写石头剪刀布游戏的C语言程序时,首次运行正常,但进入while循环第二次迭代时,printf("enter r 3 for rock or c 1 for scissors or p 2 for paper :\n");语句会重复输出。
原代码
#include <stdlib.h> #include <time.h> #include <stdio.h> int choicep(char choice){ if (choice=='c') { return 1; }else if (choice=='p') { return 2; } else if(choice=='r'){ return 3; } } int main(){ srand(time(NULL)); char player choice; int playerscore=0,computer=0; int choice,computer choice; while (playerscore != 3 && computer!= 3) { printf("enter r 3 for rock or c 1 for scissors or p 2 for paper :\n"); scanf("%c",&player choice); choice = choice p(player choice); computer choice = (rand() % 3 )+1; if (computer choice==1) { switch (choice) { case 1: printf("draw !\n"); break; case 2: printf("computer win \n"); break; case 3: printf("player win \n"); break; default: break; } } if (computerchoice==2) { switch (choice) { case 2: printf("draw !\n"); break; case 3: printf("computer win\n "); break; case 1: printf("player win "); break; default: break; } } if (computer choice==3)//r { switch (choice) { case 3: printf("draw !\n"); break; case 1: printf("computer win \n"); break; case 2: printf("player win\n "); break; default: break; } } } return 0; }
问题原因
- 输入缓冲区残留换行符:使用
scanf("%c", &player_choice)读取字符时,第一次输入字符后按下的换行符\n会留在输入缓冲区。第二次循环时,scanf直接读取这个换行符,而非等待用户输入,导致printf重复输出。 - 语法错误:原代码中变量名包含空格(如
player choice、computer choice),属于非法命名,无法通过编译;choicep函数未处理非法输入,会引发未定义行为;没有更新得分的逻辑,循环永远无法终止。
解决方案
- 清除输入缓冲区空白字符:将
scanf格式改为" %c"(%c前的空格会自动跳过所有空白字符,包括换行、空格)。 - 修正非法变量名:将带空格的变量名改为下划线连接的合法命名(如
player_choice、computer_choice)。 - 完善函数逻辑:给
choicep函数添加非法输入的返回值,避免未定义行为。 - 补充得分更新逻辑:让循环能正常终止,完善游戏流程。
修正后的代码
#include <stdlib.h> #include <time.h> #include <stdio.h> int choice_p(char choice){ if (choice == 'c') { return 1; } else if (choice == 'p') { return 2; } else if (choice == 'r') { return 3; } // 返回0标识无效选择 return 0; } int main(){ srand(time(NULL)); char player_choice; int player_score = 0, computer_score = 0; int player_choice_num, computer_choice; while (player_score != 3 && computer_score != 3) { printf("enter r (3) for rock or c (1) for scissors or p (2) for paper:\n"); // 跳过空白字符,读取有效输入 scanf(" %c", &player_choice); player_choice_num = choice_p(player_choice); // 处理无效输入 if (player_choice_num == 0) { printf("Invalid choice! Please enter r, c, or p.\n"); continue; } computer_choice = (rand() % 3) + 1; // 判断胜负并更新得分 if (computer_choice == 1) { // 电脑出剪刀 switch (player_choice_num) { case 1: printf("Draw!\n"); break; case 2: printf("Computer wins!\n"); computer_score++; break; case 3: printf("Player wins!\n"); player_score++; break; } } else if (computer_choice == 2) { // 电脑出布 switch (player_choice_num) { case 2: printf("Draw!\n"); break; case 3: printf("Computer wins!\n"); computer_score++; break; case 1: printf("Player wins!\n"); player_score++; break; } } else if (computer_choice == 3) { // 电脑出石头 switch (player_choice_num) { case 3: printf("Draw!\n"); break; case 1: printf("Computer wins!\n"); computer_score++; break; case 2: printf("Player wins!\n"); player_score++; break; } } printf("Current Score - Player: %d, Computer: %d\n\n", player_score, computer_score); } // 输出最终结果 if (player_score == 3) { printf("Congratulations! You won the game!\n"); } else { printf("Computer won the game! Better luck next time.\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Abdel djalil Boulebbina
相关产品推荐
相关产品推荐

