如何修复C#控制台Hangman游戏重复字母显示异常问题?
C# Hangman游戏重复字母不显示问题修复
你的问题出在那串冗长的else if逻辑上——它是互斥的,每次用户猜字母时,只会检查目标单词的某一个索引位置,匹配到第一个符合的位置后就停止后续检查,导致重复字母只能更新第一个出现的位置,后面的相同字母永远不会被填充。
修复方案
把原来的else if分支替换成遍历整个目标单词字符数组的逻辑,逐个检查每个位置是否和用户输入的字母一致,只要匹配就更新进度数组对应的位置。同时可以加一个布尔变量标记是否命中,用来输出正确的提示。
修改后的完整代码
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine("主题是食物"); string[] words = new string[5]; words[0] = "potato"; words[1] = "radish"; words[2] = "raisin"; words[3] = "almond"; words[4] = "lychee"; Random random = new Random(); int randomNumber = random.Next(0, 5); char[] hangman = words[randomNumber].ToCharArray(); // 初始化进度数组,适配目标单词长度 char[] userinput = new char[hangman.Length]; for (int i = 0; i < userinput.Length; i++) { userinput[i] = '_'; } Console.WriteLine("游戏开始!你有10次机会猜出所有字母。输入一个你认为在单词里的字母。"); Console.WriteLine($"提示:单词有{hangman.Length}个字母"); for (int i = 0; i < 10; i++) { Console.Write($"第{i+1}次猜测:"); char user = char.Parse(Console.ReadLine().ToLower()); // 统一转小写,支持不区分大小写猜测 bool isHit = false; // 遍历整个目标单词,更新所有匹配的字母位置 for (int j = 0; j < hangman.Length; j++) { if (user == char.ToLower(hangman[j])) { userinput[j] = hangman[j]; isHit = true; } } // 根据命中情况输出提示 if (isHit) { Console.WriteLine("猜对了!当前进度:"); foreach (char c in userinput) { Console.Write(c + " "); } Console.WriteLine("\n再试一个字母!"); } else { Console.WriteLine("哎呀,这个字母不在单词里,再试试!"); } // 判断是否提前完成游戏 if (new string(userinput) == new string(hangman)) { Console.WriteLine("恭喜你!猜对了所有字母,游戏胜利!"); break; } } // 10次机会用完后的提示 if (new string(userinput) != new string(hangman)) { Console.WriteLine($"游戏结束!正确单词是:{new string(hangman)}"); } } } }
关键改进点
- 去掉硬编码的数组长度,用
hangman.Length适配不同长度的单词 - 遍历整个目标单词数组,一次性更新所有匹配的字母位置,彻底解决重复字母不显示的问题
- 增加不区分大小写的猜测逻辑,提升用户体验
- 加入游戏胜利的提前判断,不用等10次机会用完
- 优化了提示信息的可读性和交互流程
内容的提问来源于stack exchange,提问作者Shayre Chakraborty
相关产品推荐
相关产品推荐

