You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:25:03