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

C++轮盘赌程序无法退出while循环,求问题排查与解决

C++轮盘赌程序无限循环问题修复

问题分析

你的程序陷入无限循环的核心原因是末尾的do-while循环逻辑错误,同时还有几个隐藏问题:

  • 外层while(true)无退出条件,当前do-while仅重复询问直到输入非j/J,但无论用户选什么,都会回到外层循环继续执行
  • 数字投注时,char val和int vinst直接比较,类型不匹配导致永远无法触发中奖逻辑
  • srand(time(0))放在循环内,每次循环重置随机种子,导致随机数生成异常
  • 下注后未及时更新余额,显示的余额和实际值不符
  • 颜色选择时未处理无效输入,会跳过逻辑导致余额计算错误

修复步骤

  1. 调整循环退出逻辑:do-while仅校验用户输入有效性,之后根据输入决定是否退出外层循环
  2. 修复数字投注类型不匹配:新增int变量存储用户选择的数字,避免char与int直接比较
  3. 优化随机种子初始化:将srand(time(0))移到main开头,仅初始化一次
  4. 及时更新余额:下注后立即扣除赌注,保证显示与实际余额一致
  5. 处理无效输入:为所有输入分支添加错误处理,避免逻辑跳过

修正后的完整代码

#include <iostream>
#include <ctime>
using namespace std;

int main() {
    locale swedish("swedish"); 
    locale::global(swedish);

    srand(time(0)); // 仅初始化一次随机种子
    int saldo = 1000;
    int bet;
    int vinst;
    char val;
    int user_number; // 存储用户选择的数字
    char spelaigen;
    
    cout << "Username: Användare" << endl;
    cout << "Password: ********" << endl;
    cout << "Logging in: " << endl;
    cout << "Searching for a live room: " << endl;
    cout << "Initializing mainframe: \n" << endl;
    cout << "Välkommen till Save7heCasino" << endl;
    cout << "Här spelar du Roulette " << endl;
    cout << "Du har " << saldo << " att spela för." << endl;

    while (true)
    {
        cout << "Du får välja mellan 100, 300 eller 500 att spela för." << endl;
        cin >> bet;

        if (saldo < bet)
        {
            cout << "Ditt saldo är för lågt." << endl;
            break;
        }

        bool valid_bet = false;
        if (bet == 100 || bet == 300 || bet == 500)
        {
            valid_bet = true;
            saldo -= bet; // 下注后立即扣除赌注
            cout << "Du valde insatsen " << bet << ":-" << endl;
            cout << "Ditt saldo är " << saldo << endl;
        }
        else
        {
            cout << "Ogiltig insats, välj 100, 300 eller 500!" << endl;
            continue; // 重新选择赌注
        }

        vinst = rand() % 36 + 1;
        cout << "\n";
        cout << "-Vinsttabell: " << endl;
        cout << "-Vinst: Färg ger 2x din insats." << endl;
        cout << "-Vinst: Nummer ger 10x din insats." << endl;
        cout << "\n";
        cout << "Vill spela på färg [1] eller nummer [2]: " << endl;
        cin >> val;

        if (val == '1')
        {
            cout << "Vilken färg vill du spela? [r] för Röd och [b] för Svart " << endl;
            cin >> val;

            if (val == 'b')
            {
                if (vinst % 2 == 0)
                {
                    cout << "Resultatet blev Svart: " << vinst << endl;
                    saldo += bet * 2; // 赢了获得2倍赌注(已扣过一次,直接加2倍)
                    cout << "Du vann: " << bet * 2 << endl;
                    cout << "Ditt nya saldo är: " << saldo << endl;
                }
                else
                {
                    cout << "Du förlorade resultatet blev Rött: " << vinst << endl;
                    cout << "Ditt nya saldo är: " << saldo << endl;
                }
            }
            else if (val == 'r')
            {
                if (vinst % 2 != 0)
                {
                    cout << "Resultatet blev Rött: " << vinst << endl;
                    saldo += bet * 2;
                    cout << "Du vann: " << bet * 2 << endl;
                    cout << "Ditt nya saldo är: " << saldo << endl;
                }
                else
                {
                    cout << "Du förlorade resultatet blev Svart: " << vinst << endl;
                    cout << "Ditt nya saldo är: " << saldo << endl;
                }
            }
            else
            {
                cout << "Ogiltig färgval, du förlorar insatsen!" << endl;
                cout << "Ditt nya saldo är: " << saldo << endl;
            }
        }
        else if (val == '2')
        {
            cout << "Vilket nummer?: ";
            cin >> user_number; // 用int存储用户选择的数字

            if (user_number >= 1 && user_number <= 36)
            {
                if (vinst == user_number)
                {
                    cout << "Grattis du vann! Rätt nummer var: " << vinst << endl;
                    saldo += bet * 10; // 赢了获得10倍赌注
                    cout << "Du vann: " << bet * 10 << endl;
                    cout << "Ditt nya saldo är " << saldo << endl;
                }
                else
                {
                    cout << "Fel nummer, det rätta nummret var: " << vinst << " - Ditt nya saldo är: " << saldo << endl;
                }
            }
            else
            {
                cout << "Ogiltigt nummer (1-36), du förlorar insatsen!" << endl;
                cout << "Ditt nya saldo är: " << saldo << endl;
            }
        }
        else
        {
            cout << "Ogiltigt val, du förlorar insatsen!" << endl;
            cout << "Ditt nya saldo är: " << saldo << endl;
        }

        // 询问是否继续游戏,校验输入有效性
        do
        {
            cout << "Vill du spela igen?: j/n?: " << endl;
            cin >> spelaigen;
        } while (spelaigen != 'j' && spelaigen != 'J' && spelaigen != 'n' && spelaigen != 'N');

        // 判断是否退出外层循环
        if (spelaigen == 'n' || spelaigen == 'N')
        {
            cout << "Tack för spel! Ditt slutliga saldo är: " << saldo << endl;
            break;
        }
    }
    return 0;
}

关键修复说明

  • 循环退出逻辑:do-while仅确保用户输入j/J或n/N,若输入n/N则break外层while(true),程序正常退出
  • 数字投注类型匹配:用int user_number存储用户选的数字,与vinst(int类型)直接比较,解决ASCII码匹配错误
  • 随机种子优化:srand(time(0))仅调用一次,保证随机数序列正常生成
  • 余额更新:下注后立即扣除赌注,避免显示与实际余额不一致
  • 无效输入处理:为所有输入分支添加错误处理,避免逻辑跳过导致的异常

内容的提问来源于stack exchange,提问作者ZweKashi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:20:21