2016-04-01 4 views
0

Написал игру TicTacToe с графическим интерфейсом, используя JButtons. Ниже приведен код, используемый для проверки наличия победителя. Также включен мой код для проверки ничьей. ОДНАКО, в случае, когда нажаты все кнопки. И последний ход приводит к выигрышу для одного из игроков, он по-прежнему считается ничьей из-за всех нажатых кнопок. Как я могу исправить это, чтобы он точно проверил ничью?TicTacToe Check For Draw

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 - использовать текстовую переменную типа String, который хранит текст, который должен быть выставиться на этикетке игрока ,

2 - на каждом, если вы устанавливаете текстовую переменную в соответствии с текстом, который необходимо настроить, например, на ifs, который побеждает игрок 1, вы помещаете текст = "PLAYER 1 WINS".

3 - вы только устанавливаете метку игрока один раз, в конце метода, а не в каждом «если», когда вы накладываете код выше.

4 Используйте две логические переменные, такие как boolean player1 = false, player2 = false. И когда игрок1 побеждает, его значение равно true, иначе false. То же самое касается игрока2. Другими словами, на каждом, если, например, победитель игрока 1, вы ставите player1 = true.

5- В конце вам просто нужно проверить, если и переменная player1 и player2 равна true, а затем ее ничья. (И не забудьте установить переменную text = "DRAW").