对Tic Tac Toe的建议

nam*_*ked 5 java tic-tac-toe

我正在为Tic-Tac-Toe游戏设计我的实施策略.由于这是我的第一个游戏实现,我有点困惑,需要一些通用指针.

现在,Tic-Tac-Toe中的获胜组合总数为8.目前,我计划将这些获胜组合存储在一个阵列中.一旦最终用户进行了至少3次移动,我将通过比较Player对阵此阵列的当前位置来开始检查玩家是否赢得了游戏.但是,我确信这不是检查玩家是否有获胜组合的有效方法.

任何人都可以建议我如何设计游戏的逻辑?

Jul*_*eau 11

不要担心效率.我写了一个回溯解决方案,只有549,945个可能的游戏状态.在笔记本电脑上运行这些操作只需不到0.25秒.这是我的逻辑,看看游戏是否结束 - 显然效率不高,但无所谓:

private boolean isWinningMove(int row, int col) {
    int piece = board[row][col];

    // check current row
    boolean w = true;
    for (int x = 0; x < 3; x++) { w = w && (board[row][x] == piece); }
    if (w) { return true; }

    // check current column
    w = true;
    for (int x = 0; x < 3; x++) { w = w && (board[x][col] == piece); }
    if (w) { return true; }

    // check 0,0 diagonal
    w = true;
    for (int x = 0; x < 3; x++) { w = w && (board[x][x] == piece); }
    if (w) { return true; }

    // check 0,2 diagonal
    w = true;
    for (int x = 0; x < 3; x++) { w = w && (board[x][2 - x] == piece); }
    return w;
}
Run Code Online (Sandbox Code Playgroud)

以下是我的结果,它与维基百科页面上的数据匹配:tic-tac-toe:

Moves Simulated: 549945
Draws=46080   Player1-Wins=131184   Player2-Wins=77904
Perfect Strategy Implies: Always a tie.

Games won in 0 moves? 0
Games won in 1 moves? 0
Games won in 2 moves? 0
Games won in 3 moves? 0
Games won in 4 moves? 0
Games won in 5 moves? 1440
Games won in 6 moves? 5328
Games won in 7 moves? 47952
Games won in 8 moves? 72576
Games won in 9 moves? 81792
Run Code Online (Sandbox Code Playgroud)


Sha*_*rog 5

由于井字游戏的状态空间非常小,你可以存储所有可能的最终游戏位置,并使用旋转,但我认为你会稍微过度思考它.

而不是为游戏板存储3x3阵列,使用7x7阵列,游戏板最内部为3x3.你应该至少有三个值,每个方格可以代表 - 像PLAYER_1,PLAYER_2NONE.最初,所有值都应设置为NONE.然后,在每个玩家的移动之后,检查所选择的正方形周围的所有3个; 上面2个,下面2个,左边2个,右边2个,左上角2个,右下角2个,右上角2个,左下角2个.

为什么7x7阵列?使用7x7阵列,您可以安全地从3x3区域的任何方向搜索所有方向,而无需if语句查看您是否从阵列的边缘走开.董事会将如下所示:

  0 1 2 3 4 5 6
0 * * * * * * *

1 * * * * * * *

2 * * * * * * *

3 * * * * * * *

4 * * * * * * *

5 * * * * * * *

6 * * * * * * *

例如,如果第一个玩家移动到tic-tac-toe板上的0,0,则与在7x7板上移动到2,2相同.进行移动时,您将在2,2平方左右进行检查以查看一行中是否有三个具有相同值的正方形

  • 上述:2,0和2,1和2,2
  • 下图:2,2和2,3和2,4
  • 左:0,2和1,2和2,2
  • 右:2,2,2,3和2,4
  • 左上:0,0和1,1和2,2
  • 右上:2,2和3,1和4,0
  • 左下:0,4和1,3和2,2
  • 右下:2,2和3,3和4,4

由于3x3板周围的方块带总是具有该值NONE,因此它们永远不会触发获胜条件.

如果其中任何一个都匹配相同的玩家价值(例如第一个玩家的PLAYER_1),则游戏结束并获胜.否则,如果所有方格都被拍摄,那么游戏就是平局.

我过去曾将它用于其他类似游戏,效果很好.