[英]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.