3x3 Bingo游戏C#代码异常:应输出line却返回nothing
问题诊断与解决方法
根据你描述的场景,程序应该输出line但实际返回nothing,大概率是以下几个常见问题导致的,逐一排查即可:
1. 抽取数字的解析错误
你提供的抽取数字用了中文顿号(、),如果代码中直接用英文逗号(,)分割字符串,会导致无法正确拆分数字,最终抽取集合中没有正确的数字,自然无法匹配卡片上的行。
解决方法:
解析抽取数字时,先将中文顿号替换为英文逗号,再拆分转换为整数集合,推荐使用HashSet<int>来存储抽取数字,因为它的Contains方法查找效率远高于List<int>:
string drawnInput = "1、2、3、4、5、6、7、8、10、11、12、13、14、15、16"; HashSet<int> drawnNumbers = new HashSet<int>( drawnInput.Replace("、", ",").Split(',') .Select(str => int.Parse(str.Trim())) );
2. 行匹配逻辑错误
如果代码中判断行是否完成的逻辑有误,比如只检查了行内部分数字是否存在,而非全部三个数字,就会漏掉第一行的匹配。
正确的行匹配逻辑:
遍历卡片的每一行,对每行的三个数字逐一检查是否都在抽取集合中,只要有一行满足条件,就标记为hasLine:
bool hasLine = false; foreach (var row in bingoCard) { bool isLineComplete = true; foreach (int num in row) { if (!drawnNumbers.Contains(num)) { isLineComplete = false; break; } } if (isLineComplete) { hasLine = true; break; } }
3. Bingo与Line的优先级顺序错误
必须先判断是否达成bingo(所有数字都在抽取集合中),再判断是否有line,避免逻辑顺序颠倒导致错误输出。
完整的判断流程示例:
// 初始化Bingo卡片 int[][] bingoCard = new int[][] { new int[] {1, 2, 3}, new int[] {90, 91, 92}, new int[] {93, 94, 95} }; // 解析抽取数字 string drawnInput = "1、2、3、4、5、6、7、8、10、11、12、13、14、15、16"; HashSet<int> drawnNumbers = new HashSet<int>( drawnInput.Replace("、", ",").Split(',') .Select(str => int.Parse(str.Trim())) ); // 判断是否Bingo bool isBingo = true; foreach (var row in bingoCard) { foreach (int num in row) { if (!drawnNumbers.Contains(num)) { isBingo = false; break; } } if (!isBingo) break; } // 判断是否有Line bool hasLine = false; foreach (var row in bingoCard) { bool isLineComplete = true; foreach (int num in row) { if (!drawnNumbers.Contains(num)) { isLineComplete = false; break; } } if (isLineComplete) { hasLine = true; break; } } // 输出结果 if (isBingo) { Console.WriteLine("bingo"); } else if (hasLine) { Console.WriteLine("line"); } else { Console.WriteLine("nothing"); }
快速排查步骤
- 打印抽取数字集合,确认里面包含1、2、3这三个数字;
- 单独测试第一行的匹配逻辑,看是否能正确识别该行已完成;
- 检查Bingo判断逻辑是否会错误地覆盖Line的判断。
内容的提问来源于stack exchange,提问作者Dragos Bogdan
相关产品推荐
相关产品推荐

