ti c ta c палец в горизонтальном / вертикальном и диагональном положении, не работает - java - PullRequest
0 голосов
/ 01 февраля 2020

Я пишу ti c ta c toe game, и кажется, что все работает, кроме проверок (горизонтальных / вертикальных и диагональных). Я использую массив (int [3][3]) для изготовления доски.

Это мои чеки:

private boolean wonStraightLines( int player)
   {
       boolean answer = false;

       if (
            ((board[0][0] & board[0][1] & board[0][2]) == (player * 3)) || 
            ((board[1][0] & board[1][1] & board[1][2]) == (player * 3)) ||  
            ((board[2][0] & board[2][1] & board[2][2]) == (player * 3)) ||
            ((board[0][0] & board[1][0] & board[2][0]) == (player * 3)) ||
            ((board[0][1] & board[1][1] & board[2][1]) == (player * 3)) ||
            ((board[0][2] & board[1][2] & board[2][2]) == (player * 3))
          ) 
       {
           answer = true;   
       }
       else {
           answer = false;
       }
       return answer;
   }

и для диагонали:

private boolean wonDiagonal( int player)
   {
      boolean answer = false;

      if (
              ((board[0][0] & board[1][1] & board[2][2]) == (player * 3)) || ((board[0][2] & board[1][1] & board[2][0]) == (player * 3))
         ) 
      {
          answer = true;
      }
      else {
          answer = false;
      }
      return answer;
   }

когда Я запускаю программу всякий раз, когда X или O получают 3 в любом направлении, в котором продолжает работать игра, вместо того, чтобы выбросить сообщение «Вы выиграли». Любая помощь будет оценена. Не уверен, нужны ли какие-либо другие части кода.

РЕДАКТИРОВАТЬ: Я также пытался использовать + вместо & между значениями массива платы, но не работал также.

1 Ответ

0 голосов
/ 01 февраля 2020

Я предполагаю, что есть 3 уникальных значения для состояний каждого элемента, таких как, например:

board[row][col] = 0 // no entry
board[row][col] = 1 // player 1
board[row][col] = 2 // player 2

Не будучи умным, горизонтальная проверка для player (с использованием основной структуры строки) будет выглядеть так:

(board[0][0] == player && board[0][1] == player && board[0][2] == player)

и повторять для каждой строки.

И аналогично для вертикальной, повторяя для каждого столбца:

(board[0][0] == player && board[1][0] == player && board[2][0] == player)

И одна диагональ:

(board[0][0] == player && board[1][1] == player && board[2][2] == player)

Если вы решили использовать арифметическую операцию c, вам придется изменить значения "player", чтобы избежать наложения, как в игроке 1 == 1 и игроке 2 == 4, например :

board[row][col] = 0 // no entry
board[row][col] = 1 // player 1
board[row][col] = 4 // player 2

Тогда вы можете сделать что-то вроде горизонтальной строки:

((board[0][0] + board[0][1] + board[0][2]) == (player * 3))

Заметьте в Java 8 и позже добавив массив int (строку или столбец в вашем случае ) может быть немного более кратким:

// sum the first row
(IntStream.of(board[0]).sum() == (player * 3))

Теперь, если вы действительно хотите использовать побитовую операцию «и», тогда это ваша проверка, принимающая начальные значения элемента (0,1,2), как указано вверху:

// check if the player's "bit" is set in all elements of first row.
(board[0][0] & board[0][1] & board[0][2]) == player
...