用于检查宾果的C#宾果算法
我有一个5x5的布尔型2D数组,我想检查垂直、水平和对角线宾果 如果这些特定单元格中的值设置为“true”,我会得到一个宾果。否则,我继续玩这个游戏。我一直在寻求帮助来改进,或者获得反馈来完全重新使用这个方法来检查宾果游戏用于检查宾果的C#宾果算法,c#,C#,我有一个5x5的布尔型2D数组,我想检查垂直、水平和对角线宾果 如果这些特定单元格中的值设置为“true”,我会得到一个宾果。否则,我继续玩这个游戏。我一直在寻求帮助来改进,或者获得反馈来完全重新使用这个方法来检查宾果游戏 public int checkForBingo(int rowID,int colID) { bool-winner=false; 对于(int i=0;i
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板,该怎么办?有许多神奇的数字,你必须通过外科手术来替换,以实现这一点或任何类型的改变