Tic tac toe 4x4游戏2x2分组胜利算法

时间:2015-10-21 02:33:42

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

你好我正在创造一个基本的tic tac toe游戏,我有自己的乐趣,有4x4字段,我已经完成了程序,但我在游戏的一部分,我必须决定一个赢家,如果有任何x' s或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;
    }

我会在哪里输入该代码?

2 个答案:

答案 0 :(得分:0)

创建一个获胜配置列表,每个配置包含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;

如果您想添加其他获胜组合(比如所有四个角),您只需要在获胜的Configurations数组中添加一行就可以了。

还可以进行进一步的重构来制作这个整理器,比如将支票移入WinningConfiguration类以便循环变为

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

答案 1 :(得分:0)

按照这种方式思考:每次赢得2x2广场都会有一个角落。因此,如果您看到一个标记,您可以检查右侧,底部和底部的方格是否都是相同的类型,如果是,则标记该玩家是赢家。由于你开始检查topleft角落,你永远不需要在最右边或最下面的线上进行启动检查(因为你的板外没有方形延伸!)

因此对于从i延伸到BOARD_SIZE-1的int i,以及从0延伸到BOARD_SIZE-1的int j,如果board [i] [j] == board [i + 1] [j] == board [我] [j + 1] ==登上[i + 1] [j + 1] ==符号然后你自己就是胜利者。

除此之外还有一些事情可以让它更有效率,但是因为它是tic-tac-toe我不认为你太关注可扩展性=)