C++胜负游戏启动异常:输入y值后执行两轮而非一轮求助
问题原因及解决方案
问题出在输入y值后的换行符残留:当你输入数字并按下回车时,cin >> y仅读取了整数,回车键对应的\n会留在标准输入缓冲区中。第一次循环执行完游戏逻辑后,getch()会直接读取这个残留的换行符,而该字符既不是q/Q也不是r/R,导致循环直接进入下一轮,触发了第二次游戏判定。
修复代码
只需在读取y值后,清空输入缓冲区里的残留字符即可。修改后的代码如下:
#include <iostream> #include <ctime> #include <conio.h> #include <limits> // 新增头文件,用于清空缓冲区 using namespace std; int main() { int x, y, wins = 0, fails = 0; char key; srand(time(NULL)); // 初始化随机数种子 cout << "Enter the value of y (1-200): "; cin >> y; // 清空输入缓冲区中残留的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); while (true) { double prob = (double)y / 20.0; // 计算获胜概率 double rand_num = (double)rand() / RAND_MAX; // 生成0-1之间的随机数 x = (rand_num < prob) ? 1 : 0; // 判断胜负 if (x == 1) { cout << "Congratulations, you won 100000 dollars!!!\n"; wins++; } else { cout << "You lost, try again...\n"; fails++; } cout << "Wins: " << wins << ", Fails: " << fails << endl; key = getch(); // 等待用户按键 if (key == 'q' || key == 'Q') { continue; // 直接进入下一轮游戏 } else if (key == 'r' || key == 'R') { wins = fails = 0; // 重置胜负计数 } } return 0; }
关键改动说明
- 新增
<limits>头文件:为numeric_limits提供定义,用于清空输入缓冲区。 - 添加
cin.ignore(numeric_limits<streamsize>::max(), '\n');:该语句会读取并丢弃输入缓冲区中直到换行符的所有字符,确保后续的getch()只会读取用户主动按下的按键,不会触发意外的循环迭代。
内容的提问来源于stack exchange,提问作者VSCDesktop
相关产品推荐
相关产品推荐

