C#复刻Wordle时如何让循环停留当前迭代直至满足条件?
解决Wordle复刻版中无效输入占用数组行的问题
核心问题是当前for循环会无条件递增迭代变量i,不管输入是否有效。要让循环停留在当前行,直到输入有效单词,你需要在获取用户输入时加入一个校验循环,确保只有有效输入才会推进迭代、更新数组和猜测次数。
修改后的关键代码部分
// Convert user word to char to display in board if word is valid for (int i = 0; i < userGuessChars2D.GetLength(0); i++) { Console.Clear(); displayBoard(); string validGuess = null; // 循环获取输入,直到得到有效单词 do { Console.Write("请输入猜测单词:"); var input = Console.ReadLine()?.ToLower(); // 校验输入有效性:非空、在有效词库中 if (!string.IsNullOrEmpty(input) && (answers.Contains(input) || extras.Contains(input))) { validGuess = input; } else { Console.WriteLine("无效单词,请重新输入!"); Console.Clear(); displayBoard(); // 重新显示棋盘,避免提示信息打乱界面 } } while (validGuess == null); // 处理正确猜测逻辑 if (validGuess == answerWord) { // 将正确单词存入当前行数组 for (int j = 0; j < userGuessChars2D.GetLength(1); j++) { userGuessChars2D[i, j] = validGuess[j]; } Console.Clear(); displayBoard(); Console.WriteLine($"\n恭喜!你猜对了正确单词 {answerWord}!"); Console.WriteLine("按 [3] + 回车查看统计数据"); return; // 猜对后直接结束游戏 } // 有效输入存入数组,更新猜测次数 guessNum++; switchColour(); for (int j = 0; j < userGuessChars2D.GetLength(1); j++) { userGuessChars2D[i, j] = validGuess[j]; } } // 如果循环结束还没猜对,显示失败信息 Console.Clear(); displayBoard(); Console.WriteLine($"\n游戏结束!正确单词是 {answerWord}");
关键修改说明
- 新增
do-while循环包裹输入逻辑:只有当输入的单词在answers或extras中时,才会退出这个小循环,确保无效输入不会推进外层的for循环。 - 调整正确猜测的判断时机:放在有效输入获取之后,避免初始时
userGuesses为空导致的错误判断。 - 将数组赋值和
guessNum递增逻辑移到有效输入确认之后:无效输入不会修改数组,也不会消耗猜测次数。
额外优化建议
- 文件读取可以简化,用
File.ReadAllLines替代逐行读取,同时用using语句自动管理文件流,避免手动关闭的风险:
// 替换原文件读取代码 var answers = new List<string>(File.ReadAllLines("WordleAnswers.txt")); var extras = new List<string>(File.ReadAllLines("WordleExtras.txt"));
- 可以提前合并有效词库,减少重复判断:
var validWords = new HashSet<string>(answers); validWords.UnionWith(extras); // 后续校验直接用validWords.Contains(input)
内容的提问来源于stack exchange,提问作者12345678i9
相关产品推荐
相关产品推荐

