簡體   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