【问题标题】:How to decide whether a Tic-tac-toe game has ended? [closed]如何判断井字游戏是否结束? [关闭]
【发布时间】:2017-07-01 11:54:46
【问题描述】:

井字游戏规则如下: 当连续三个x或o,或所有位置都被占据时,游戏结束。

例如下图显示了这个规则:

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

【问题讨论】:

  • 这可能有两种答案。首先是基于执行。你正在使用什么实现?第二个一般的答案。但是我认为您必须至少遍历每个块一次

标签: algorithm tic-tac-toe


【解决方案1】:

只有在一名玩家回合后才能获胜。转向只会影响一行和一列,有时会影响对角线。这意味着您只需要检查一些而不是所有行、列和对角线。

【讨论】:

    【解决方案2】:

    就计算时间而言,更快的是直接检查每个获胜位置。当然,您可以通过固定一轮来加快速度,然后只检查包含用户在这一轮中放置标记的位置的获胜位置。

    以下是所有获胜位置和工作方法:

    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,则所有字段都已设置。

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      相关资源
      最近更新 更多