3x3 Bingo游戏C#代码重构求助:解决S134嵌套控制流错误
3x3 Bingo游戏代码重构方案(解决S134嵌套控制流问题)
问题背景
实现3x3 Bingo游戏的校验逻辑,需判断结果为bingo(全中)、linie(整行匹配)或nimic(无匹配)。原代码中CheckForBingo和CheckForLine函数因三层嵌套循环触发代码分析器S134规则错误,需重构以减少嵌套层数。
核心重构思路
- 用HashSet优化数字查找:将抽取的数字存入
HashSet<int>,把原本O(n)的数组查找转为O(1)的哈希查找,同时简化判断逻辑。 - 抽取辅助方法消除内层循环:把“判断卡片数字是否在抽取列表中”的逻辑抽成独立方法,直接替代最内层循环,将嵌套层数从3层降到2层,符合S134规则要求。
重构后的完整代码
using System; using System.Collections.Generic; class Program { static void Main() { const int numberOfRows = 3; const int numberOfColumns = 3; const int numbersExtracted = 15; int[,] bingoCard = ReadBingoCard(numberOfRows, numberOfColumns); int[] extractedNumbers = ReadNumbersExtracted(numbersExtracted); HashSet<int> extractedNumberSet = new HashSet<int>(extractedNumbers); PrintResult(bingoCard, extractedNumberSet); } static int[,] ReadBingoCard(int rowsNumber, int columnNumber) { int[,] card = new int[rowsNumber, columnNumber]; for (int i = 0; i < rowsNumber; i++) { string[] array = Console.ReadLine().Split(' '); for (int j = 0; j < columnNumber; j++) { card[i, j] = Convert.ToInt32(array[j]); } } return card; } static int[] ReadNumbersExtracted(int numbersExtracted) { int[] numbers = new int[numbersExtracted]; for (int i = 0; i < numbersExtracted; i++) { numbers[i] = Convert.ToInt32(Console.ReadLine()); } return numbers; } // 辅助方法:判断卡片数字是否在抽取集合中 static bool IsNumberMatched(int cardNumber, HashSet<int> extractedNumbers) { return extractedNumbers.Contains(cardNumber); } static bool CheckForBingo(int[,] bingoCard, HashSet<int> extractedNumbers) { for (int row = 0; row < bingoCard.GetLength(0); row++) { for (int col = 0; col < bingoCard.GetLength(1); col++) { if (!IsNumberMatched(bingoCard[row, col], extractedNumbers)) { // 存在未匹配数字,直接返回false return false; } } } return true; } static bool CheckForLine(int[,] bingoCard, HashSet<int> extractedNumbers) { for (int row = 0; row < bingoCard.GetLength(0); row++) { bool isRowComplete = true; for (int col = 0; col < bingoCard.GetLength(1); col++) { if (!IsNumberMatched(bingoCard[row, col], extractedNumbers)) { isRowComplete = false; // 当前行已不符合,跳出列循环 break; } } if (isRowComplete) { return true; } } return false; } static void PrintResult(int[,] bingoCard, HashSet<int> extractedNumbers) { if (CheckForBingo(bingoCard, extractedNumbers)) { Console.WriteLine("bingo"); } else if (CheckForLine(bingoCard, extractedNumbers)) { Console.WriteLine("linie"); } else { Console.WriteLine("nimic"); } } }
重构细节说明
- HashSet优化:相比原数组遍历查找,
HashSet.Contains方法效率更高,同时让代码逻辑更简洁。 - 辅助方法解耦:
IsNumberMatched方法抽离了最内层的查找逻辑,使CheckForBingo和CheckForLine的嵌套层数降至2层,完全符合S134规则。 - 提前终止逻辑:在
CheckForBingo中发现未匹配数字直接返回;CheckForLine中发现当前行不满足时立即跳出列循环,避免无效遍历,提升性能。
内容的提问来源于stack exchange,提问作者Bobolino123
相关产品推荐
相关产品推荐

