C++轮盘赌程序无法退出while循环,求问题排查与解决
C++轮盘赌程序无限循环问题修复
问题分析
你的程序陷入无限循环的核心原因是末尾的do-while循环逻辑错误,同时还有几个隐藏问题:
- 外层
while(true)无退出条件,当前do-while仅重复询问直到输入非j/J,但无论用户选什么,都会回到外层循环继续执行 - 数字投注时,
char val和int vinst直接比较,类型不匹配导致永远无法触发中奖逻辑 srand(time(0))放在循环内,每次循环重置随机种子,导致随机数生成异常- 下注后未及时更新余额,显示的余额和实际值不符
- 颜色选择时未处理无效输入,会跳过逻辑导致余额计算错误
修复步骤
- 调整循环退出逻辑:do-while仅校验用户输入有效性,之后根据输入决定是否退出外层循环
- 修复数字投注类型不匹配:新增int变量存储用户选择的数字,避免char与int直接比较
- 优化随机种子初始化:将
srand(time(0))移到main开头,仅初始化一次 - 及时更新余额:下注后立即扣除赌注,保证显示与实际余额一致
- 处理无效输入:为所有输入分支添加错误处理,避免逻辑跳过
修正后的完整代码
#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
相关产品推荐
相关产品推荐

