如何判断Tic-tac-toe游戏是否已经结束?

时间:2017-07-01 11:54:47

标签: algorithm tic-tac-toe

tic-tac-toe游戏规则如下: 当有三个连续的x或者o,或者所有的地方都被占用时,游戏就结束了。

例如,下图显示了此规则:

this picture

这可以通过首先使用for循环分别检查列,行,对角线,反诊断然后检查整个板是否已满来实现。但我认为这可能导致代码非常冗长。有没有更好的解决方案?

2 个答案:

答案 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,那么所有字段都已设置。