c ++:1hh0益智游戏

时间:2015-10-29 03:18:01

标签: c++ c++11

我正在尝试制作一款名为“0hh1”的类似益智游戏的数独游戏,但我似乎总是陷入这一个问题。游戏不允许用户将相同颜色的三个连续正方形(有两种颜色,红色和蓝色)彼此相邻,但两个很好。此函数应检查行的任何两个相同颜色的连续方块,并在尚未填充的方块中写入相反的颜色(UNKNOWN正方形)。它应该在行的两个连续瓦片的两端写上卵形颜色,并且在行的两个相同颜色的瓦片之间的中间写。 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).

我不确定我的代码出错了,非常感谢你。

2 个答案:

答案 0 :(得分:0)

至少你忘记了这种情况:

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,具体取决于您放置此行的位置。)

这就是为什么&#34;它没有说标记(第1行,第5列)为O应该&#34;

答案 1 :(得分:0)

对于带有特殊标记的周围板,代码变得更简单:

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);
}

Demo