Как вы можете проверить несколько ситуаций без кучки инструкций if? - PullRequest
2 голосов
/ 06 февраля 2012

Скажем, вы хотите проверить, выиграл ли кто-нибудь игру в крестики-нолики. Как бы вы это сделали, не используя оператор if для повторной проверки каждого столбца, строки и диагонали на 3 в строке?

Я уверен, что должен быть способ, какой-нибудь алгоритм или методика, которые не выглядят так ужасно, как 20 строк ifs (или переключателей), чтобы проверить массив из 9 на наличие виннара.

Ответы [ 3 ]

3 голосов
/ 06 февраля 2012

Я бы, наверное, выбрал 9-битное int для каждого игрока, представляющего свои ходы.Вы можете легко применять битовые операции для проверки всего столбца, строки или диагонали напрямую.

2 голосов
/ 06 февраля 2012

Возможны только восемь выигрышных позиций.Преобразование в массив из девяти битов и AND для проверки на выигрыш Т.е.

Возможные комбинации выигрышей:

111000000 000111000 000000111 100100100 010010010 001001001 100010001 001010100

доска:

ОХО.ИКС .XO

Проверка X приводит к результату:

010010010

, который AND со строкой 5 == true

1 голос
/ 06 февраля 2012

Вы правы, такая техника есть.

Каждый выигрышный паттерн начинается с верхнего или левого края и продолжается три шага. На каждом из этих этапов происходит одно из следующих действий:

  1. Номер строки увеличивается, а столбец остается прежним
  2. Номер столбца увеличивается, а строка остается прежней
  3. Увеличивается номер строки и столбца (первая диагональ)
  4. Номер строки увеличивается, а номер столбца уменьшается (другая диагональ)

Так что теперь вы можете написать такую ​​функцию:

bool CheckWin(char[3][3] board, char playerCh, int r, int c, int dr, int dc) {
    for (int i = 0 ; i != 3 ; i++) {
        if (board[r+i*dr][c+i*dc] != playerCh) {
            return false;
        }
    }
    return true;
}

Используя эту функцию, вы можете проверить, есть ли у игрока три в ряд, начиная с (r, c), с рядами dr dr и столбцами dc:

bool won = false;
for (int i = 0 ; !won && i != 3 ; i++) {
    won |= CheckWin(board, 'X', i, 0, 0, 1)
        || CheckWin(board, 'X', 0, i, 1, 0);
}
won |= CheckWin(board, 'X', 0, 0, 1, 1);
won |= CheckWin(board, 'X', 2, 0, -1, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...