You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

3x3 Bingo游戏C#代码重构求助:解决S134嵌套控制流错误

3x3 Bingo游戏代码重构方案(解决S134嵌套控制流问题)

问题背景

实现3x3 Bingo游戏的校验逻辑,需判断结果为bingo(全中)、linie(整行匹配)或nimic(无匹配)。原代码中CheckForBingo和CheckForLine函数因三层嵌套循环触发代码分析器S134规则错误,需重构以减少嵌套层数。

核心重构思路

  1. 用HashSet优化数字查找:将抽取的数字存入HashSet<int>,把原本O(n)的数组查找转为O(1)的哈希查找,同时简化判断逻辑。
  2. 抽取辅助方法消除内层循环:把“判断卡片数字是否在抽取列表中”的逻辑抽成独立方法,直接替代最内层循环,将嵌套层数从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:10:43