2016-04-01 67 views
0

使用JButtons用GUI編寫了一個TicTacToe遊戲。以下是用於檢查是否有贏家的代碼。還包括我的代碼來檢查平局。但是,如果點擊了所有按鈕,並且最後一步移動會導致其中一位玩家獲勝,則由於所有按鈕被點擊而仍被視爲平局。我該如何解決這個問題,以便它能夠準確地檢查平局?TicTacToe檢查繪製

public void checkWin(char[] values) 
{ 
    //Check if player 1 (xs) win 
    if ((values[0] == 'x') && (values[1] == 'x') && (values[2] == 'x')) 
    { 
     playerLabel.setText("Player 1 wins!"); 
     disableButtons(); 
    } 
    else if ((values[3] == 'x') && (values[4] == 'x') && (values[5] == 'x')) 
    { 
     playerLabel.setText("Player 1 wins!"); 
     disableButtons(); 
    } 
    else if ((values[6] == 'x') && (values[7] == 'x') && (values[8] == 'x')) 
    { 
     playerLabel.setText("Player 1 wins!"); 
     disableButtons(); 
    } 
    else if ((values[0] == 'x') && (values[4] == 'x') && (values[8] == 'x')) 
    { 
     playerLabel.setText("Player 1 wins!"); 
     disableButtons(); 
    } 
    else if ((values[2] == 'x') && (values[4] == 'x') && (values[6] == 'x')) 
    { 
     playerLabel.setText("Player 1 wins!"); 
     disableButtons(); 
    } 
    else if ((values[0] == 'x') && (values[3] == 'x') && (values[6] == 'x')) 
    { 
     playerLabel.setText("Player 1 wins!"); 
     disableButtons(); 
    } 
    else if ((values[1] == 'x') && (values[4] == 'x') && (values[7] == 'x')) 
    { 
     playerLabel.setText("Player 1 wins!"); 
     disableButtons(); 
    } 
    else if ((values[2] == 'x') && (values[5] == 'x') && (values[8] == 'x')) 
    { 
     playerLabel.setText("Player 1 wins!"); 
     disableButtons(); 
    } 
    // check for draw 
    else if (((values[0] == 'x') || (values[0] == 'o')) && ((values[1] == 'x') || (values[1] == 'o')) && 
    ((values[2] == 'x') || (values[2] == 'o')) && ((values[3] == 'x') || (values[3] == 'o')) && ((values[4] == 'x') || (values[4] == 'o')) 
    && ((values[5] == 'x') || (values[5] == 'o')) && ((values[6] == 'x') || (values[6] == 'o')) && ((values[7] == 'x') || (values[7] == 'o')) 
    && ((values[8] == 'x') || (values[8] == 'o'))) 
    { 
     playerLabel.setText("DRAW!"); 
     disableButtons(); 
    } 

    //Check is player 2 (os) wins 
    if ((values[0] == 'o') && (values[1] == 'o') && (values[2] == 'o')) 
    { 
     playerLabel.setText("Player 2 wins!"); 
     disableButtons(); 
    } 
    else if ((values[3] == 'o') && (values[4] == 'o') && (values[5] == 'o')) 
    { 
     playerLabel.setText("Player 2 wins!"); 
     disableButtons(); 
    } 
    else if ((values[6] == 'o') && (values[7] == 'o') && (values[8] == 'o')) 
    { 
     playerLabel.setText("Player 2 wins!"); 
     disableButtons(); 
    } 
    else if ((values[0] == 'o') && (values[4] == 'o') && (values[8] == 'o')) 
    { 
     playerLabel.setText("Player 2 wins!"); 
     disableButtons(); 
    } 
    else if ((values[2] == 'o') && (values[4] == 'o') && (values[6] == 'o')) 
    { 
     playerLabel.setText("Player 2 wins!"); 
     disableButtons(); 
    } 
    else if ((values[0] == 'o') && (values[3] == 'o') && (values[6] == 'o')) 
    { 
     playerLabel.setText("Player 2 wins!"); 
     disableButtons(); 
    } 
    else if ((values[1] == 'o') && (values[4] == 'o') && (values[7] == 'o')) 
    { 
     playerLabel.setText("Player 2 wins!"); 
     disableButtons(); 
    } 
    else if ((values[2] == 'o') && (values[5] == 'o') && (values[8] == 'o')) 
    { 
     playerLabel.setText("Player 2 wins!"); 
     disableButtons(); 
    } 
    // check for draw 
    else if (((values[0] == 'x') || (values[0] == 'o')) && ((values[1] == 'x') || (values[1] == 'o')) && 
    ((values[2] == 'x') || (values[2] == 'o')) && ((values[3] == 'x') || (values[3] == 'o')) && ((values[4] == 'x') || (values[4] == 'o')) 
    && ((values[5] == 'x') || (values[5] == 'o')) && ((values[6] == 'x') || (values[6] == 'o')) && ((values[7] == 'x') || (values[7] == 'o')) 
    && ((values[8] == 'x') || (values[8] == 'o'))) 
    { 
     playerLabel.setText("DRAW!"); 
     disableButtons(); 
    } 
} 
+1

所以......確實有更好的做法,然後檢查每種可能的組合。儘管如此,如果你通過所有的if語句,爲什麼你需要檢查抽獎呢?如果每個盒子都被選中,並且你做得很好,默認情況下是否沒有抽籤? –

+0

另一種選擇是所有的框都是空白的,例如開始新遊戲時。另外簡單地做一個else語句會讓遊戲一直吸引。 – Evan

+0

然後創建一個布爾變量來確定遊戲是否已經開始,並在第一次移動後將其設置爲false。如果遊戲將一直用else語句繪製,則代碼中的條件邏輯需要一些工作。 –

回答

0

只是檢查所有獲獎的情況,然後在最後else說法應該是一場平局......

else{ 
    playerLabel.setText("DRAW!"); 
    disableButtons(); 
} 

在另一方面,你真的可以縮短你的代碼在這裏通過創建一個通用的方法並傳遞給它適當的參數。這段代碼非常麻煩。

0

你可以使用一些功能和循環:

public void checkGameOver(char[] values) { 
    if (checkWin(values, 'x')) { 
     playerLabel.setText("Player 1 wins!"); 
    } else if (checkWin(values, 'o')) { 
     playerLabel.setText("Player 2 wins!"); 
    } else if (checkDraw(values)) { 
     playerLabel.setText("DRAW"); 
    } else { 
     return; 
    } 

    disableButtons(); 
} 

public boolean checkWins(char[] values, char player) { 
    if (((values[0] == player) && (values[1] == player) && (values[2] == player)) || 
     ((values[3] == player) && (values[4] == player) && (values[5] == player)) || 
     ((values[6] == player) && (values[7] == player) && (values[8] == player)) || 
     ((values[0] == player) && (values[4] == player) && (values[8] == player)) || 
     ((values[2] == player) && (values[4] == player) && (values[6] == player)) || 
     ((values[0] == player) && (values[3] == player) && (values[6] == player)) || 
     ((values[1] == player) && (values[4] == player) && (values[7] == player)) || 
     ((values[2] == player) && (values[5] == player) && (values[8] == player))) 
    { 
     return true; 
    } 

    return false; 
} 

public boolean checkDraw(char[] values) { 
    for (char c : values) { // check if each box holds either an 'x' or an 'o' 
     if (c != 'o' && c != 'x') { 
      return false; 
     } 
    } 

    return true; 
} 
0

你可以這樣做:

1 - 您使用的存儲需要玩家標籤上設置好的文本字符串文本變量。

2 - 在每個if上,根據需要設置的文本設置文本變量,例如在播放器1獲勝的ifs上,將text =「PLAYER 1 WINS」。

3 - 您只在方法的結尾處​​設置播放器標籤一次,而不是在每個「if」中放置上面的代碼。

4-使用兩個布爾變量,如boolean player1 = false,player2 = false。當player1獲勝時,其設置爲true,否則爲false。這同樣適用於player2。換句話說,如果玩家1獲勝,每個玩家都會將player1 = true。最後,你只需要檢查,如果player1和player2變量都是真的,那麼它的繪製。 (並且不要忘記設置變量文本=「DRAW」)。