如何让我的简易Hangman游戏实现重启功能?
解决Hangman游戏重启问题
问题核心是全局变量未重置。你当前的游戏状态(正确答案、占位符、错误字母、剩余猜测次数)都是全局变量,第一次游戏结束后这些值会保留,导致重启时直接使用旧状态,无法重新开始游戏。
以下是针对playgame()和main()函数的修改方案,同时优化代码结构,消除全局变量依赖:
1. 重构playgame():初始化局部游戏状态
将游戏状态变量移到playgame()内部作为局部变量,确保每次调用该函数时都从头初始化全新的游戏状态:
void playgame() { // 每次游戏启动时重置所有状态 std::string correcans = "coding"; std::string placeholder = "------"; std::string wrongans = ""; int amountguess = 6; while (placeholder != correcans && amountguess > 0) { title(); hangdraw(amountguess); guessdisplay(placeholder, wrongans, amountguess); char letter = input(); guess(letter, correcans, placeholder, amountguess, wrongans); system("cls"); } winorlose(correcans, placeholder, amountguess, wrongans); }
2. 修改依赖状态的函数:改用参数传递
原来的函数依赖全局变量,现在需要将状态变量作为参数传入,确保每个函数只处理当前游戏的状态:
修改guessdisplay函数
void guessdisplay(const std::string& placeholder, const std::string& wrongans, int amountguess) { std::cout << std::endl; std::cout << placeholder; std::cout << std::endl; std::cout << "\n------------------------------------------" << std::endl; std::cout << "| Wrong Letters |"; std::cout << "\n------------------------------------------" << std::endl; std::cout << wrongans; std::cout << "\n------------------------------------------" << std::endl; std::cout << "Guesses Left: " << amountguess << std::endl; }
修改guess函数
void guess(char letter, const std::string& correcans, std::string& placeholder, int& amountguess, std::string& wrongans) { bool sameletter = false; for (int i = 0; i < placeholder.size(); i++) { if (correcans[i] == letter) { placeholder[i] = correcans[i]; sameletter = true; } } if (!sameletter) { amountguess -= 1; wrongans += letter; } }
修改winorlose函数
void winorlose(const std::string& correcans, const std::string& placeholder, int amountguess, const std::string& wrongans) { title(); hangdraw(amountguess); guessdisplay(placeholder, wrongans, amountguess); if (placeholder == correcans) { std::cout << "\n------------------------------------------" << std::endl; std::cout << "| YOU WIN!!! |"; std::cout << "\n------------------------------------------" << std::endl; } else { std::cout << "\n------------------------------------------" << std::endl; std::cout << "| YOU LOSE!!! |"; std::cout << "\n------------------------------------------" << std::endl; } }
3. 优化main()函数(可选)
保留原有循环逻辑,可添加清屏操作提升体验:
int main() { bool isRunning = true; while (isRunning) { playgame(); std::cout << "Would you like to play again (y/n)? "; char userChoice; std::cin >> userChoice; if (userChoice == 'y' || userChoice == 'Y') { isRunning = true; system("cls"); // 清屏后启动新游戏 } else { isRunning = false; } } return 0; }
完整修改后的代码
#include <iostream> #include <string> void title() { std::cout << "##########################################" << std::endl; std::cout << "# HANGMAN #" << std::endl; std::cout << "##########################################\n" << std::endl; } void hangdraw(int amountguess) { if (amountguess == 6) { std::cout << " |-----------------|" << std::endl; std::cout << " | " << std::endl; std::cout << " |" << std::endl; std::cout << " |" << std::endl; std::cout << "_|__________________|" << std::endl; } else if(amountguess == 5) { std::cout << " |-----------------|" << std::endl; std::cout << " | 0" << std::endl; std::cout << " | " << std::endl; std::cout << " |" << std::endl; std::cout << "_|__________________|" << std::endl; } else if (amountguess == 4) { std::cout << " |-----------------|" << std::endl; std::cout << " | 0" << std::endl; std::cout << " | |" << std::endl; std::cout << " | " << std::endl; std::cout << "_|__________________|" << std::endl; } else if (amountguess == 3) { std::cout << " |-----------------|" << std::endl; std::cout << " | 0" << std::endl; std::cout << " | |" << std::endl; std::cout << " | /" << std::endl; std::cout << "_|__________________|" << std::endl; } else if (amountguess == 2) { std::cout << " |-----------------|" << std::endl; std::cout << " | 0" << std::endl; std::cout << " | |" << std::endl; std::cout << " | / \\" << std::endl; std::cout << "_|__________________|" << std::endl; } else if (amountguess == 1) { std::cout << " |-----------------|" << std::endl; std::cout << " | 0 /" << std::endl; std::cout << " | |" << std::endl; std::cout << " | / \\" << std::endl; std::cout << "_|__________________|" << std::endl; } else if (amountguess == 0) { std::cout << " |-----------------|" << std::endl; std::cout << " | \\ 0 /" << std::endl; std::cout << " | |" << std::endl; std::cout << " | / \\" << std::endl; std::cout << "_|__________________|" << std::endl; } } void guessdisplay(const std::string& placeholder, const std::string& wrongans, int amountguess) { std::cout << std::endl; std::cout << placeholder; std::cout << std::endl; std::cout << "\n------------------------------------------" << std::endl; std::cout << "| Wrong Letters |"; std::cout << "\n------------------------------------------" << std::endl; std::cout << wrongans; std::cout << "\n------------------------------------------" << std::endl; std::cout << "Guesses Left: " << amountguess << std::endl; } char input() { std::cout << "Guess Letter: "; char letter; std::cin >> letter; std::cin.clear(); std::cin.ignore(); return letter; } void guess(char letter, const std::string& correcans, std::string& placeholder, int& amountguess, std::string& wrongans) { bool sameletter = false; for (int i = 0; i < placeholder.size(); i++) { if (correcans[i] == letter) { placeholder[i] = correcans[i]; sameletter = true; } } if (!sameletter) { amountguess -= 1; wrongans += letter; } } void winorlose(const std::string& correcans, const std::string& placeholder, int amountguess, const std::string& wrongans) { title(); hangdraw(amountguess); guessdisplay(placeholder, wrongans, amountguess); if (placeholder == correcans) { std::cout << "\n------------------------------------------" << std::endl; std::cout << "| YOU WIN!!! |"; std::cout << "\n------------------------------------------" << std::endl; } else { std::cout << "\n------------------------------------------" << std::endl; std::cout << "| YOU LOSE!!! |"; std::cout << "\n------------------------------------------" << std::endl; } } void playgame() { std::string correcans = "coding"; std::string placeholder = "------"; std::string wrongans = ""; int amountguess = 6; while (placeholder != correcans && amountguess > 0) { title(); hangdraw(amountguess); guessdisplay(placeholder, wrongans, amountguess); char letter = input(); guess(letter, correcans, placeholder, amountguess, wrongans); system("cls"); } winorlose(correcans, placeholder, amountguess, wrongans); } int main() { bool isRunning = true; while (isRunning) { playgame(); std::cout << "Would you like to play again (y/n)? "; char userChoice; std::cin >> userChoice; if (userChoice == 'y' || userChoice == 'Y') { isRunning = true; system("cls"); } else { isRunning = false; } } return 0; }
关键说明
- 移除全局变量后,每次调用
playgame()都会创建全新的游戏状态,彻底解决重启时状态残留的问题。 - 改用参数传递状态,代码更模块化,避免全局变量带来的状态污染风险。
- 新增的清屏操作可提升游戏重启时的视觉体验。
内容的提问来源于stack exchange,提问作者Shaye
相关产品推荐
相关产品推荐

