C++战舰游戏playAgain函数未获取用户输入就提前清屏问题咨询
你的代码存在两个核心问题导致没有等待用户输入就直接清屏:
问题1:playAgain函数缺失用户输入读取逻辑
你在playAgain中定义了yn变量,但没有编写任何读取用户输入的代码,yn默认是初始空值,不满足y或n的判断条件,函数会直接执行结束返回外层逻辑,全程没有任何等待用户输入的步骤,并不是你猜测的“无输入被识别为有效输入”。
问题2:获胜分支未终止后续逻辑执行
就算playAgain逻辑正常,调用完playAgain后,程序还会继续执行外层的system("CLS")和clearBoard代码,导致清屏操作依旧会被触发。另外注意C++标准不允许手动调用main()函数,属于未定义行为,不要这么写。
修复方案
第一步:重写playAgain函数,增加输入读取和非法输入处理
提前把你的游戏主逻辑封装成独立函数,比如void startGame(),不要直接调用main:
void playAgain() { string yn; while (true) { cout << "Play again? (y/n)" << endl; // 等待用户输入 cin >> yn; if (yn == "y") { system("CLS"); // 调用封装好的游戏启动函数 startGame(); return; } else if (yn == "n") { exit(0); } cout << "输入无效,请输入y或n" << endl; } }
第二步:修改获胜分支逻辑,避免执行后续清屏代码
if (attackShip == true) { board[guessRow][guessCol] = "x"; cout << "Oops, you sunk my ship!" << endl; numShips--; if (numShips == 0) { cout << "Shiver me timbers! You have won!" << endl; playAgain(); // 直接返回,不再执行后面的清屏和重置棋盘逻辑 return; } system("CLS"); clearBoard(board, numShips, ships); }
内容的提问来源于stack exchange,提问作者Ada
相关产品推荐
相关产品推荐

