Я пытаюсь создать игру-головоломку в стиле судоку под названием «0hh1», но, кажется, все время зацикливаюсь на одной этой функции. Игра не позволяет пользователю ставить три последовательных квадрата одного цвета (есть два цвета, красный и синий) рядом друг с другом, но два - это нормально. Эта функция должна проверять строку на наличие любых двух последовательных квадратов одного цвета и записывать противоположный цвет в квадрат, который еще не заполнен (НЕИЗВЕСТНЫЕ квадраты). Он должен написать соответствующий цвет на обоих концах двух последовательных плиток в ряду и посередине между двумя плитками одного цвета в ряду. mark_square_as () - это функция, которая назначает цвет квадрату, и каждая доска имеет одинаковое количество строк и столбцов.

Example: ---- becomes ----
         XX--         XXO-
         -XX-         OXXO
         --X-         --X-

В котором X представляет красный, а O представляет синий, - неизвестно

Вот мой код:

void solve_three_in_a_row(int board[MAX_SIZE][MAX_SIZE],
int size,
int row,
bool announce) {
for (int i = 0; i < size; i++) {
    if (board[row][i] == 1 && board[row][i + 1] == 1) {
        if (i + 1 == size - 1 && i - 1 >= 0 && board[row][i - 1] == UNKNOWN) {
            mark_square_as(board, size, row, i - 1, 2, announce);
        }
        else if (i == 0 && i + 2 <= size && board[row][i + 2] == UNKNOWN) {
            mark_square_as(board, size, row, i + 2, 2, announce);
        }
        else if (i - 1 >= 0 && i + 2 <= size && board[row][i - 1] == UNKNOWN && board[row][i + 2] == UNKNOWN) {
            mark_square_as(board, size, row, i - 1, 2, announce);
            mark_square_as(board, size, row, i + 2, 2, announce);
        }
    }
    else if (board[row][i] == 1 && board[row][i + 2] == 1 && board[row][i + 1] == UNKNOWN) {
        mark_square_as(board, size, row, i + 1, 2, announce);
    }
}
for (int i = 0; i < size; i++) {
    if (board[row][i] == 2 && board[row][i + 1] == 2) {
        if (i + 1 == size - 1 && i - 1 >= 0 && board[row][i - 1] == UNKNOWN) {
            mark_square_as(board, size, row, i - 1, 1, announce);
        }
        else if (i == 0 && i + 2 <= size && board[row][i + 2] == UNKNOWN) {
            mark_square_as(board, size, row, i + 2, 1, announce);
        }
        else if (i - 1 >= 0 && i + 2 <= size && [row][i - 1] == UNKNOWN && board[row][i + 2] == UNKNOWN) {
            mark_square_as(board, size, row, i - 1, 1, announce);
            mark_square_as(board, size, row, i + 2, 1, announce);
        }
    }
    else if (board[row][i] == 2 && board[row][i + 2] == 2 && board[row][i + 1] == UNKNOWN) {
        mark_square_as(board, size, row, i + 1, 1, announce);
    }
}

}

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

OXXO 
XOXO
OXOX
XOOX 
(my output said to mark (2nd row, 5th column) as X, when there is not even a fifth column)

O-
--
(my output said to mark (1st row, 2nd column) as X, when it should mark nothing)

OO-X--
X--X-O
------
X---OX
---XOO
-X-O-O
(my output said to mark (1st row, 3rd column) and (6th row, 5th column) as X, which is correct. But it didn't say to mark (1st row, 5th column) as O as it should because (1st row, 3rd column) would have also been marked).

Я не уверен, где мой код пошел не так, большое вам спасибо.

0
fishforever 29 Окт 2015 в 06:18

2 ответа

Лучший ответ

По крайней мере, вы забываете об этой ситуации:

else if (i - 1 >= 0 && i + 2 <= size && board[row][i - 1] == 2 && board[row][i + 2] == UNKNOWN)

(board[row][i - 1] == 2 может быть board[row][i - 1] == 1 в зависимости от того, где вы поместите эту строку.)

Вот почему «не сказано отмечать (1-я строка, 5-й столбец) как O, как следует»

0
Tiesselune 29 Окт 2015 в 08:54

С окружением платы со специальным индикатором код становится проще:

template <std::size_t H, std::size_t W>
void resolveCol(std::array<std::array<char, H>, W>& b)
{
    for (std::size_t i = 1; i != W - 1; ++i) {
        for (std::size_t j = 1; j != H - 1; ++j) {
            if (b[i][j] == b[i + 1][j]) {
                switch (b[i][j]) {
                    case 'X': { setBoard(b, i - 1, j, 'O'); setBoard(b, i + 2, j, 'O'); break;}
                    case 'O': { setBoard(b, i - 1, j, 'X'); setBoard(b, i + 2, j, 'X'); break;}
                }
            }
        }
    }
}

int main() {
    constexpr std::size_t H = 4;
    constexpr std::size_t W = 4;
    std::array<std::array<char, H + 2>, W + 2> board{{
        {{'B', 'B', 'B', 'B', 'B', 'B'}},
        {{'B', '-', '-', '-', 'X', 'B'}},
        {{'B', 'X', 'X', '-', '-', 'B'}},
        {{'B', '-', 'X', 'X', '-', 'B'}},
        {{'B', '-', '-', 'X', 'X', 'B'}},
        {{'B', 'B', 'B', 'B', 'B', 'B'}}
    }};

    resolveCol(board);
}

Демо

0
Jarod42 29 Окт 2015 в 10:02