Tic Tac Toe выигрывает условия, которые не активируются правильно

54
5

Я задал вопрос некоторое время назад. После многократной перезаписи кода мой tic tac toe выглядит хорошо, за исключением одной вопиющей проблемы. Когда я пытаюсь играть, условия выигрыша кажутся активированными наугад - у меня будет x-o-x в строке и скажу: "Игрок X выиграл!", Но когда у меня есть o-o-o, он не обнаружит выиграть. Хотя рисование работает нормально.

Код условий выигрыша:

 // win conditions. if true, set win==true; else set win==false
if (square[0].getText().equals(square[1].getText())
&& square[1].getText().equals(square[2].getText())
!= square[0].getText().isEmpty()) {
win = true;}

if (square[3].getText().equals(square[4].getText())
&& square[4].getText().equals(square[5].getText())
!= square[3].getText().isEmpty()) {
win = true;}

if (square[6].getText().equals(square[7].getText())
&& square[7].getText().equals(square[8].getText())
!= square[6].getText().isEmpty()) {
win = true;}

if (square[0].getText().equals(square[3].getText())
&& square[3].getText().equals(square[6].getText())
!= square[0].getText().isEmpty()) {
win = true;}

if (square[1].getText().equals(square[4].getText())
&& square[4].getText().equals(square[7].getText())
!= square[1].getText().isEmpty()) {
win = true;}

if (square[2].getText().equals(square[5].getText())
&& square[5].getText().equals(square[8].getText())
!= square[2].getText().isEmpty()) {
win = true;}

if (square[0].getText().equals(square[4].getText())
&& square[4].getText().equals(square[8].getText())
!= square[0].getText().isEmpty()) {
win = true;}

if (square[6].getText().equals(square[4].getText())
&& square[4].getText().equals(square[2].getText())
!= square[6].getText().isEmpty()) {
win = true;}

else{win = false;
}

И код действия:

  public void actionPerformed (ActionEvent e) {
//one more move has gone by, calculate player turn + player letter
move++;
if (move % 2 == 0) {
player = 1; letter = "X";
}else{
player = 2; letter = "O";
}

playergo.setText("It is player " + player + " go!");

//set square letter to player letter, disable square so no further moves can be made there
for (int i=0; i<=8; i++){
if (e.getSource() == square[i]){
square[i].setText(letter);
square[i].setEnabled(false);
}
}

Полный код pastebin здесь. Спасибо всем заранее!!!

спросил(а) 2020-04-04T00:34:00+03:00 3 месяца назад
1
Решение
85

Поскольку вы не используете if/else в своих условиях выигрыша, вы всегда будете проверять последнее, if, и если это разрешит false, вы установите win = false

ответил(а) 2020-04-04T00:53:15.927923+03:00 3 месяца назад
38

Вы можете сделать что-то вроде этого (в psuedo-code)

int winPositions[][] = { {0,1,2}, {3,4,5}, {6,7,8}, //horizontal
{0,3,6}, {1,4,7}, {2,5,8}, //vertical
{0,4,8}, {2,4,6} }; //diagnol

for i = 0 to winPosition.size
int positions[] = winPosition[i]; //know its size is 3
bool hasWon = board[ positions[i] ] == board[ positions[i+1] ] && board[positions[i+1]] == board[positions[i+2]];
if(hasWon) return true;

ответил(а) 2020-04-04T00:34:00+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема