我正在为nxn板上的n个玩家制作一个tic tac toe游戏,但获胜条件是连续3个。 我到目前为止解决这个问题的方法是:当一个移动时,程序将检查以下方块是否连续3个。
(x-1,y+1) (x,y+1) (x+1,y+1)
(x-1,y) (x,y) (x+1,y)
(x-1,y-1) (x,y-1) (x+1,y-1)
其中(x,y)是正在进行的移动。我们这里有4个案例进行检查:一排胜利,一场胜利,一场对角胜利和一场反对角胜利。然后程序将检查将检查下一个方块连续3个。
(x-2,y+2) 0 (x,y+1) 0 (x+2,y+2)
0 (x-1,y+1) (x,y+1) (x+1,y+1) 0
(x-2,y) (x-1,y) (x,y) (x+1,y) (x+2,y)
0 (x-1,y-1) (x,y-1) (x+1,y-1) 0
(x-2,y-2) 0 (x,y-2) 0 (x+2,y-2)
再次(x,y)是正在进行的移动。我们这里有8个案例,因为我们检查!移动坐标作为连续3的终点。上面的0表示未检查的那些。
检查这段代码的代码很长很多文本。 代码示例:
public int checkWinning(Coordinate c) {
if (board[c.getX()][c.getY()] == board[c.getX()+1][c.getY()] && board[c.getX()][c.getY()] == board[c.getX()-1][c.getY()]){
return board[c.getX()][c.getY()];
}else if(board[c.getX()][c.getY()] == board[c.getX()][c.getY()+1] && board[c.getX()][c.getY()] == board[c.getX()][c.getY()-1]){
return board[c.getX()][c.getY()];
}else if(board[c.getX()][c.getY()] == board[c.getX()-1][c.getY()+1] && board[c.getX()][c.getY()] == board[c.getX()+1][c.getY()-1]){
return board[c.getX()][c.getY()];
}
}
这是坐标c已经发生的“移动”(X和Y来自另一个类,这就是我使用getter的原因)并注意:
Board [x] [y] - >表示板的二维数组,坐标从左上角(0,0)到右下角(大小-1,大小-1)计数,板[x] [y] == 0表示位置自由( x,y),board [x] [y] == i for i> 0表示玩家我在(x,y)上移动
有更聪明的方法吗?
答案 0 :(得分:1)
我唯一要做的就是将if
更改为循环。考虑到在某些时候你可能想要将获胜条件从3改为5.在if
s的情况下,你将不得不重写很多代码,循环它将保持不变。
我不建议您寻找比此更“智能”的解决方案,因为您的代码应该易于理解和支持。此外,我怀疑任何智能解决方案都会比现有解决方案更快。
答案 1 :(得分:0)
我看到了一个重大缺陷:
<强> 1 强> 这里的第一个问题是这些数组将超出界限,因此通过使用“第一个方法”查看3x3数组然后循环所有内部大小为+ 1和size-1的元素将消除但是:
我错过了最顶级,最底部最左侧和右侧要检查。即我需要检查
(x-1,y + 1),(x,y + 1),(x + 1,y + 1),(x-1,y-1)(x,y-1)(x + 1,y -1),(x-1,y + 1)(x-1,y)(x-1,y-1),(x + 1,y + 1)(x + 1,y)(x + 1) ,y-1)获奖者......