tic-tac-toe游戏规则如下: 当有三个连续的x或者o,或者所有的地方都被占用时,游戏就结束了。
例如,下图显示了此规则:
这可以通过首先使用for循环分别检查列,行,对角线,反诊断然后检查整个板是否已满来实现。但我认为这可能导致代码非常冗长。有没有更好的解决方案?
答案 0 :(得分:1)
胜利只有在一名球员转弯时才会发生。转弯只会影响行和列,有时会影响对角线。这意味着您只需要检查一些行,列和对角线而不是所有行。
答案 1 :(得分:0)
计算时间快,就是直接检查每个获胜位置。当然,您可以通过修复一轮来加快速度,然后只检查包含用户在本轮中放置标记的位置的获胜位置。
以下是所有获胜职位和工作方法:
public boolean hasWinner() {
return
(board[0] != null && board[0] == board[1] && board[0] == board[2])
||(board[3] != null && board[3] == board[4] && board[3] == board[5])
||(board[6] != null && board[6] == board[7] && board[6] == board[8])
||(board[0] != null && board[0] == board[3] && board[0] == board[6])
||(board[1] != null && board[1] == board[4] && board[1] == board[7])
||(board[2] != null && board[2] == board[5] && board[2] == board[8])
||(board[0] != null && board[0] == board[4] && board[0] == board[8])
||(board[2] != null && board[2] == board[4] && board[2] == board[6]);
}
指数将董事会确定为:
0 1 2
3 4 5
6 7 8
如上所述,如果玩家将标记放在board[4]
(即中心),您只需要检查:
(board[3] != null && board[3] == board[4] && board[3] == board[5])
||(board[1] != null && board[1] == board[4] && board[1] == board[7])
||(board[0] != null && board[0] == board[4] && board[0] == board[8])
||(board[2] != null && board[2] == board[4] && board[2] == board[6])
这是两个直线和两个对角线获胜场景。其他获胜场景不受board[4]
的影响,并且无法在本轮中获得胜利。
您可以使用Map<Index, Set<WinningScenarios>>
访问所有方案,以便根据索引或类似内容进行检查。如果您的电路板很大,您也可以直接计算需要检查的其他位置。
为了检查游戏是否停止并且两者都松动,您只需记住放置的标记(或圆形)的数量,并且每轮都增加它。如果计数器达到board.length
,那么所有字段都已设置。