【问题标题】:Tic tac toe 4x4 game 2x2 grouping win algorithm井字游戏 4x4 游戏 2x2 分组获胜算法
【发布时间】:2015-10-21 02:33:41
【问题描述】:

您好,我正在为自己的乐趣创建一个基本的井字游戏,它有 4x4 字段按 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;
    }

我会在哪里输入该代码?

【问题讨论】:

    标签: java arrays algorithm logic tic-tac-toe


    【解决方案1】:

    创建一个包含 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;
    

    【讨论】:

    • @linyu21 这不是复制粘贴解决方案。我不是在为您做所有您的工作;)它只是概述了我认为构建您的代码以便检查变得容易的好方法。
    【解决方案2】:

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

    所以对于从 0 到 BOARD_SIZE-1 的 int i,以及从 0 到 BOARD_SIZE-1 的 int j,如果 board[i][j] == board[i+1][j] == board[ i][j+1] == board[i+1][j+1] == 符号,那么你就是赢家了。

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

    【讨论】:

    • 所以我会这样做 for(int i=0; i
    • 我在写伪代码。如果你分 4 行来做,你可能会更容易理解。
    • 刚刚尝试了该代码,但当我每次输入它们时,它最终没有在板上显示任何 x 或 o
    • 或者更确切地说,它必须是一个操作。似乎是“&&”命令的好地方。 "if(board[i][j] == symbol && board[i+1][j] == symbol && ....) return true;"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多