Java Сравнение элементов в массиве - PullRequest
0 голосов
/ 10 ноября 2011

Я создаю текстовую игру в нолики и кроссы в java и хочу определить выигрышные ситуации.Я использовал массив для доски, такой как String [] board: -

[0] [1] [2]

[3] [4] [5]

[6] [7] [8]

У меня есть целый список возможностей, который проверяет, являются ли 3 значения в строке одинаковыми в операторах if.

Это пример того, что у меня есть:

if ((board [0] != "" && board [0] == board [1] && board [1] == board [2])) {
return true
}

Есть ли способ, который делает то же самое с меньшим количеством кода?

Спасибо

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Ваша идея может быть озвучена либо с помощью

  • , используя .equals() вместо ==, если вы действительно храните строки, либо
  • Store символов вместо строк, в этом случае == безопасен.

Теперь, если вы действительно играете в крестики-нолики, у вас есть 8 различных условий выигрыша, которые, если вы увеличиваете свой текущий стилькодирования будет иметь вид (здесь я предполагаю символы, а не строки):

winner = 
    (b[0] != ' ' && b[0] == b[1] && b[1] == b[2]) || 
    (b[3] != ' ' && b[3] == b[4] && b[4] == b[5]) ||
    ...
    (b[0] != ' ' && b[0] == b[4] && b[4] == b[8]);

Там есть другие способы сделать это;Я уверен, что поиск в Google по методу крестики-нолики или крестики-нолики покажет вам немало.

Если вы хотите получить фантазию, есть хорошо известная техника «маркировки»каждая клетка с силой два.Затем, сложив баллы (т. Е. Посмотрев на битовый вектор игрока) и выполнив двоичное И для набора из восьми выигрышных условий, вы можете определить выигрышную позицию за один выстрел.

Вот блок комментариев дляигра в крестики-нолики, иллюстрирующая технику.(Вы не запрашивали фактический код , поэтому я удерживаю , что из ответа):

/*
 * To determine a win condition, each square is "tagged"
 * from left to right, top to bottom, with successive
 * powers of 2.  Each cell thus represents an individual
 * bit in a 9-bit string, and a player's squares at any
 * given time can be represented as a unique 9-bit value.
 * A winner can thus be easily determined by checking
 * whether the player's current 9 bits have covered any
 * of the eight "three-in-a-row" combinations.
 *
 *     273                 84
 *        \               /
 *          1 |   2 |   4  = 7
 *       -----+-----+-----
 *          8 |  16 |  32  = 56
 *       -----+-----+-----
 *         64 | 128 | 256  = 448
 *       =================
 *         73   146   292
 *
 */
var wins = [7, 56, 448, 73, 146, 292, 273, 84];

Это был JavaScript.Для Java используйте

private static final int[] WINS = new int[]{7, 56, 448, 73, 146, 292, 273, 84};

Извинения, если бинарный логический подход здесь не тот, который вы хотите;Я подумал, что это было бы хорошим местом, чтобы показать это, хотя, если другие попадут на эту страницу.

0 голосов
/ 10 ноября 2011

Как вы храните свои данные? Как строки? "Х" и "О"? или как числа? 0, 1?

Как и другие говорили, если вы используете Strings (объект), оператор == не будет работать !. Вы хотите использовать board[0].equals(....) для == и !board.equals(...) для !=.

Сказав это, использование строк действительно не является гибким для тестирования сценариев. Я делал крестики-нолики в старшей школе, поэтому я знаю твою боль. Использование копирования и вставки действительно не займет много времени, чтобы написать большой оператор if для проверки всех строк / столбцов / диагнозов. Пять или десять минут вершины.

Если вас больше интересует компактный код, вы можете рассмотреть возможность использования чисел, поскольку вы можете использовать математику для проверки условий ...

if (row is not empty) and<br> ((sum of indexes in row == 3) player 1 wins) or<br> (sum of indexes in row == 0) player 2 wins<br> )

Понять идею?

Кроме того, один совет, который я бы предложил, - использовать двумерный массив (String[][]), чтобы вы могли легче проверять строки / столбцы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...