public boolean isWin()
{
boolean winner= false;
//checks rows first
if(gameBoard[currentRow][0]==playerOne&&gameBoard[currentRow][1]==playerOne&&gameBoard[currentRow][2]==playerOne)
{
winner= true;
}
else if(gameBoard[currentRow][0]==playerTwo&&gameBoard[currentRow][1]==playerTwo&&gameBoard[currentRow][2]==playerTwo)
{
winner= true;
}
//checks columns next
if(gameBoard[0][currentCol]==playerOne&&gameBoard[1][currentCol]==playerOne&&gameBoard[2][currentCol]==playerOne)
{
winner=true;
}
else if(gameBoard[0][currentCol]==playerTwo&&gameBoard[1][currentCol]==playerTwo&&gameBoard[2][currentCol]==playerTwo)
{
winner=true;
}
//checks one diagonal
if(gameBoard[0][0]==playerOne&&gameBoard[1][1]==playerOne&&gameBoard[2][2]==playerOne)
{
winner=true;
}
else if(gameBoard[0][0]==playerTwo&&gameBoard[1][1]==playerTwo&&gameBoard[2][2]==playerTwo)
{
winner=true;
}
//checks other diagonal
if(gameBoard[2][0]==playerOne&&gameBoard[1][1]==playerOne&&gameBoard[0][2]==playerOne)
{
winner=true;
}
else if(gameBoard[2][0]==playerTwo&&gameBoard[1][1]==playerTwo&&gameBoard[0][2]==playerTwo)
{
winner=true;
}
return winner;
}
此代码测试标准3 x 3 tic tac toe游戏中的胜利。我的问题是,如何更改内部数字以匹配任何大小的棋盘游戏,例如n x n?
目前它会检查第一行,第二行和第三行,以检查任何一个玩家是否在任何一行中获胜,然后是列和对角线。但是,当电路板尺寸改变为其他任何东西时,这不再成立,因为它不会检查每个可能的行/列/对角线。那么我如何才能为尺寸为n x n的电路板做到这一点。请不要编码,因为我不想抄袭,但如果有人能提供意见,我们将不胜感激吗?
答案 0 :(得分:0)
如果你逐步完成数组,那么保证工作方法非常缓慢但是很强大,如果单元格不为空,请检查所有周围的单元格 - 如果找到由相同单元格类型组成的线条图案(圆形或x),然后你找到了胜利者。如果它没有找到线条图案,请移至下一个单元格并重复此过程,直到您覆盖整个板块或找到胜利者。
例如,从单元格0, 0
开始并找到x。 0, 0
检查0, 1; 1, 0; 1, 1
。未找到获胜模式,因此请转到0, 1
并再次检查所有相邻单元格。
答案 1 :(得分:0)
我这样做的方法是编写一个单独的函数,它具有字段维度和播放器输入,例如:
String whoWinner(int d, int p1, int p2)
一旦你完成了覆盖,将3个嵌套用于循环(水平,垂直,对角线),并以下列方式检查每个玩家的获胜条件:
if (arr[i][j]='x') p1+=1;
if (arr[i][j]='o') p2+=1;
if (p1==d) return "P1 wins!";
if (p2==d) return "P2 wins!";
这是一种缓慢的方法,但是在字段尺寸达到,我不知道,1000,我认为你应该没有任何问题。
答案 2 :(得分:0)
你可以有四个循环 - 一个循环检查水平,垂直,NE-SW对角线和NW-SE对角线。
考虑水平情况:假设你仍然只需要连续三次获胜,你需要检查每一行是否有可能获胜(即检查同一个玩家是否连续三次)。水平三行需要在列 n -3之前开始,否则它将超过电路板的边界。因此,通过检查从0到 n -3列开始的每个可能的水平三行,对于每一行,将找到任何水平获胜。
水平情况的示例:
for (int j = 0; j < n; j++) {
for (int i = 0; i < n-3; i++) {
if (gameBoard[i][j] == gameBoard[i+1][j] && gameBoard[i][j] == gameBoard[i+2][j]) {
return true;
}
}
}
使用此概念,您还可以检查垂直和对角线的胜利。
答案 3 :(得分:0)
如果你被允许在你的任务中使用Java 8,那么这是一个非常好用的流。流解决方案看起来像:
n
的数字的整数流(提示:IntStream.range
)Stream.flatMap
)Stream.concat
)Stream.findAny
)如果你不知道溪流,那么这可能会有点令人困惑,但它最终会以一个非常优雅的方式表示获胜的棋盘(也就是说,让我排成一行并告诉我是否有任何一个一个值)。
这样做的一个很好的功能是,如果非常大的电路板需要,它可以简单地转换为并行流。