用于检查宾果的C#宾果算法

用于检查宾果的C#宾果算法,c#,C#,我有一个5x5的布尔型2D数组,我想检查垂直、水平和对角线宾果 如果这些特定单元格中的值设置为“true”,我会得到一个宾果。否则,我继续玩这个游戏。我一直在寻求帮助来改进,或者获得反馈来完全重新使用这个方法来检查宾果游戏 public int checkForBingo(int rowID,int colID) { bool-winner=false; 对于(int i=0;i

我有一个5x5的布尔型2D数组,我想检查垂直、水平和对角线宾果

如果这些特定单元格中的值设置为“true”,我会得到一个宾果。否则,我继续玩这个游戏。我一直在寻求帮助来改进,或者获得反馈来完全重新使用这个方法来检查宾果游戏

public int checkForBingo(int rowID,int colID)
{    
bool-winner=false;
对于(int i=0;i<4;i++)
{
//检查垂直和水平
if(winner=(boardState[i,0])==true&(boardState[i,1]==true)
&&(boardState[i,2]==true)和&(boardState[i,3]==true)
&&(boardState[i,4]==真)
打破
else if(winner=(boardState[0,i]==true)&(boardState[1,i]==true)
&&(boardState[2,i]==true)和&(boardState[3,i]==true)&&
(boardState[4,i]==真)
打破
//检查对角线
如果(!获胜者)
{
if(boardState[2,2]==true)
如果((winner=(boardState[0,0]==true)和(&(boardState[1,1]==true)&&
(boardState[3,3]==true)和&(boardState[4,4]==true))
打破
否则如果(!(获胜者=(boardState[0,4]==true)和&(boardState[1,3]==true)&&
(boardState[3,1]==true)和&(boardState[4,0]==true))
打破
}
}
返回0;
}
用于从i=0到3的循环运行 这意味着它只检查4行,如果您检查的是所有5列的正确性。 将for循环条件更改为

i <= 4
i需要注意的几点:

  • 主for循环应该是
    for(inti=0;i<5;i++)
    less 少于5(数组基于0)
  • 您不需要检查==true,布尔值可以很简单 封装在if语句中,例如:

    if(boardState[0,4]&&boardState[1,3]&&boardState[3,1]&&boardState[4,0])

  • if
    中的赋值可能导致不必要的行为(侧 效果)很容易忘记
  • 方法签名应大写,因为
    CheckForBingo
  • 如果不使用这些参数,请将它们从方法中删除 签名
  • 如前所述,代码有点难以理解
出于比较和学习目的(包括我自己),我写了如下方法:

public bool CheckForBingo(bool[,] boardState)
        {
            bool haveWeWon = false;

            //check horizotal
            for (int i = 0; i < 5; i++)
            {
                haveWeWon = true;

                for (int y = 0; y < 5; y++)
                {
                    if (!boardState[i, y])
                    {
                        haveWeWon = false;
                        break;
                    }
                }

                if(haveWeWon)
                {
                    return haveWeWon;
                }
            }

            if (!haveWeWon)
            {
                //check vertical
                for (int i = 0; i < 5; i++)
                {
                    haveWeWon = true;

                    for (int y = 0; y < 5; y++)
                    {
                        if (boardState[y, i])
                        {
                            haveWeWon = false;
                            break;
                        }
                    }

                    if (haveWeWon)
                    {
                        return haveWeWon;
                    }
                }
            }

            //check the middle - if false dont bother checking diagonal
            if (boardState[2, 2])
            {
                if (!haveWeWon)
                {
                    //check top left diagonal 
                    for (int i = 0; i < 5; i++)
                    {
                        haveWeWon = true;

                        if (!boardState[i, i])
                        {
                            haveWeWon = false;
                            break;
                        }
                    }

                    if (haveWeWon)
                    {
                        return haveWeWon;
                    }
                }

                if (!haveWeWon)
                {
                    //check top right diagonal 
                    for (int i = 4; i >= 0; i--)
                    {
                        haveWeWon = true;

                        if (!boardState[i, i])
                        {
                            haveWeWon = false;
                            break;
                        }
                    }

                    if (haveWeWon)
                    {
                        return haveWeWon;
                    }
                }
            }
            return false;
        }
public bool CheckForBingo(bool[,]boardState)
{
bool-haveWeWon=假;
//检查水平
对于(int i=0;i<5;i++)
{
haveWeWon=正确;
对于(int y=0;y<5;y++)
{
如果(!boardState[i,y])
{
haveWeWon=假;
打破
}
}
如果(haveWeWon)
{
返回哈维温;
}
}
如果(!haveWeWon)
{
//垂直检查
对于(int i=0;i<5;i++)
{
haveWeWon=正确;
对于(int y=0;y<5;y++)
{
如果(董事会状态[y,i])
{
haveWeWon=假;
打破
}
}
如果(haveWeWon)
{
返回哈维温;
}
}
}
//检查中间-如果为false,不要麻烦检查对角线
如果(boardState[2,2])
{
如果(!haveWeWon)
{
//检查左上角对角线
对于(int i=0;i<5;i++)
{
haveWeWon=正确;
如果(!boardState[i,i])
{
haveWeWon=假;
打破
}
}
如果(haveWeWon)
{
返回哈维温;
}
}
如果(!haveWeWon)
{
//检查右上角的对角线
对于(int i=4;i>=0;i--)
{
haveWeWon=正确;
如果(!boardState[i,i])
{
haveWeWon=假;
打破
}
}
如果(haveWeWon)
{
返回哈维温;
}
}
}
返回false;
}

这真的很难阅读-如果
中的作业?几乎是一个副作用-如果你不小心,很容易错过。为什么不使用两个循环:1行0..4和1列0..4-至少
是比
i
更好的名称。同样适用于5x5数组中的
i<4
?我认为这个问题更适合。就代码审查而言,Alex的回答似乎涵盖了大部分要点。除了前面提到的代码之外,我的主要问题是它不容易修改。如果您想切换到10x10板,该怎么办?有许多神奇的数字,你必须通过外科手术来替换,以实现这一点或任何类型的改变