繁体   English   中英

井字游戏 4x4 游戏 2x2 分组获胜算法

[英]Tic tac toe 4x4 game 2x2 grouping win algorithm

你好,我正在为自己的乐趣创建一个基本的井字游戏,它有 4x4 的字段我已经完成了程序,但我被困在我的游戏的一个部分,如果任何 x 或 o 按 2x2 分组,我必须决定获胜者我已经有了水平、垂直和对角线算法来决定获胜者,例如,如果我们有

        x|x|o|o
        x|x|o|x
         | | | 
         | | | 

X 将成为赢家,因为他有一个 2x2 小组,谢谢您的帮助!

我的垂直赢家代码的示例代码

                   public boolean checkForWin()
    {
        char symbol = SYMBOL[turn];

        //check vertical win
        Check1:
            for(int i=0; i<BOARD_SIZE; i++)
            {
                for(int j=0; j<BOARD_SIZE; j++)
                    if(board[i][j] != symbol)
                        continue Check1;
                //if reached, winning line found
                return true;
            }
        //check horizontal win
        Check2:
            for(int j=0; j<BOARD_SIZE; j++)
            {
                for(int i=0; i<BOARD_SIZE; i++)
                    if(board[i][j] != symbol)
                        continue Check2;
                //if reached, winning line found
                return true;
            }


            //check back slash diagonal win q
            for(int i=0; i<BOARD_SIZE; i++)
                if(board[i][i] != symbol)
                    break;
                else if(i == BOARD_SIZE-1) 
                    return true; // winning line found
            //check forward slash diagonal win
            for(int i=0; i<BOARD_SIZE; i++)
                if(board[i][BOARD_SIZE - i - 1] != symbol) 
                    break;
                else if(i == BOARD_SIZE-1) 
                    return true; // winning line found
            //if reach here then no win found
            return false;
    }

我会在哪里输入该代码?

创建一个获胜配置列表,每个配置都有 4 个位置。 有 4 个获胜行、4 个获胜列、2 条对角线和 9 个块。 然后只需检查每个配置。

代码大概是

// Set this up once at the start
WinningConfiguration[] allWinningConfigurations = {
  WinningConfiguration.row(0),
  ...
  WinningConfiguration.row(3);
  WinningConfiguration.column(0);
  ...
  WinningConfiguration.column(3);
  WinningConfiguration.block(0,0);
  ...
  WinningConfiguration.block(3,3);
  WinningConfiguration.diagonal();        
  WinningConfiguration.reversedDiagonal();
}

..

// Now all your checks, (row, column, diagonal and blocks) become
for(WinningConfiguration config : allWinningConfigurations) {
  boolean configWins = true;
  for(int i=0; i<4; ++i) {
    if(board[config.pts[i].x][config.pts[i].y]!=symbol) {
       configWins = false;
       break;
    }
  }
  if(configWins)
    return true;
}
return false;

如果您随后想要添加其他获胜组合(比如所有四个角),您只需将一行添加到您的获胜配置数组中即可。

还可以进行进一步的重构以使其更整洁,例如将检查移动到WinningConfiguration类中,以便循环变为

for(WinningConfiguration config : allWinningConfigurations) {
  if(config.wins(symbol)
    return true;
}
return false;

可以这样想:每个获胜的 2x2 方格都会有一个左上角。 因此,如果您看到一个标记,您可以检查右边、底部和右下角的方块是否都是相同类型的,如果是,则将该玩家标记为获胜者。 由于您是在左上角开始检查,因此您永远不需要在最右侧或最底部的线上进行开始检查(因为您的棋盘外不会有正方形延伸!)

所以对于 int i 从 0 扩展到 BOARD_SIZE-1,对于 int j 从 0 扩展到 BOARD_SIZE-1,如果 board[i][j] == board[i+1][j] == board[i][ j+1] == board[i+1][j+1] == symbol 那么你自己就是赢家。

除此之外,您还可以做一些事情来提高效率,但由于它是井字游戏,我认为您不太关心可扩展性 =)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM