average_angela Ответов: 1

Я пытаюсь написать код для функции, чтобы показать плитки в сапере


Эй, я пытаюсь написать код для функции, чтобы показать плитки без бомб вокруг них вокруг выбранного кода. я написал код, который может выявить бомбы вокруг одной плитки с диапазоном 1, и я могу использовать эту точную функцию для всех плиток вокруг выбранной снова, но это слишком много работы и не делает весь код переносимым.

Что я уже пробовал:

итак, то, что я сделал, это создал два массива, один из них-это минное поле, которое пользователь не может внести никаких изменений в "hidden_board", а другой - "my_board", который все изменения применяются к этому массиву, и вот функции, которые я написал:
void reveal_tiles_without_bombs_prime(int x, int y, int my_board[][9], int hidden_board[][9]){
--x;
--y;
if(x>=0 && x<9 && y>=0 && y<9){
if (my_board[x][y]==10){
    if (number_of_bombs_around(x,y,hidden_board)==0){
        if (y+1<9){
            if (number_of_bombs_around(x+1, y+1+1, hidden_board)==0)
            my_board[x][y+1]= 0;
            }
        if (y-1>=0){
            if (number_of_bombs_around(x+1, y-1+1, hidden_board)==0)
            my_board[x][y-1]= 0;
            }
        if (x-1>=0){
            if (number_of_bombs_around(x-1+1, y+1, hidden_board)==0)
            my_board[x-1][y]= 0;
            }
        if (x+1<9){
            if (number_of_bombs_around(x+1+1, y+1, hidden_board)==0)
            my_board[x+1][y]= 0;
            }
        if ((y-1>=0) && (x-1>=0)){
            if (number_of_bombs_around(x-1+1, y-1+1, hidden_board)==0)
            my_board[x-1][y-1]= 0;
            }
        if ((y+1<9) && (x-1>=0)){
            if (number_of_bombs_around(x-1+1, y+1+1, hidden_board)==0)
            my_board[x-1][y+1]= 0;
            }
        if ((y-1>=0) && (x+1<9)){
            if (number_of_bombs_around(x+1+1, y-1+1, hidden_board)==0)
            my_board[x+1][y-1]= 0;
            }
        if ((y+1<9) && (x+1<9)){
            if (number_of_bombs_around(x+1+1, y+1+1, hidden_board)==0)
            my_board[x+1][y+1]= 0;
            }

   }
  }
 }
}
int массив my_board я использую 10 для нераскрытой плитки, которая не является бомбой, и числа от 0 до 8 для количества бомб вокруг раскрытой плитки и 11 для нераскрытой бомбы, а number_of_bombs_around-это еще одна функция, которая возвращает количество бомб вокруг данной плитки. таким образом, эта функция на самом деле вызывается только один раз в части else:
if (number_of_bombs_around(x,y, hidden_board)!=0){
                my_board[x-1][y-1]= number_of_bombs_around(x,y,my_board);
                draw_mine_field(my_board);
                           }
            else{
                reveal_tiles_without_bombs_prime(x,y,my_board, hidden_board);
                my_board[x-1][y-1]= 0;

и после использования основной версии я должен использовать функцию ниже, чтобы показать все плитки без бомб вокруг них вокруг плитки, которая дана:
void reveal_tiles_without_bombs(int x, int y, int my_board[][9], int hidden_board[][9]){
--x;
--y;
if(x>=0 && x<9 && y>=0 && y<9){
if (my_board[x][y]==0){
        if (y+1<9){
            if (number_of_bombs_around(x+1, y+1+1, hidden_board)==0)
            my_board[x][y+1]= 0;
            }
        if (y-1>=0){
            if (number_of_bombs_around(x+1, y-1+1, hidden_board)==0)
            my_board[x][y-1]= 0;
            }
        if (x-1>=0){
            if (number_of_bombs_around(x-1+1, y+1, hidden_board)==0)
            my_board[x-1][y]= 0;
            }
        if (x+1<9){
            if (number_of_bombs_around(x+1+1, y+1, hidden_board)==0)
            my_board[x+1][y]= 0;
            }
        if ((y-1>=0) && (x-1>=0)){
            if (number_of_bombs_around(x-1+1, y-1+1, hidden_board)==0)
            my_board[x-1][y-1]= 0;
            }
        if ((y+1<9) && (x-1>=0)){
            if (number_of_bombs_around(x-1+1, y+1+1, hidden_board)==0)
            my_board[x-1][y+1]= 0;
            }
        if ((y-1>=0) && (x+1<9)){
            if (number_of_bombs_around(x+1+1, y-1+1, hidden_board)==0)
            my_board[x+1][y-1]= 0;
            }
        if ((y+1<9) && (x+1<9)){
            if (number_of_bombs_around(x+1+1, y+1+1, hidden_board)==0)
            my_board[x+1][y+1]= 0;
            }

  }
 }
}
Итак, мой вопрос заключается в том, Могу ли я использовать функцию для вызова reveal_tiles_without_bombs для всех плиток вокруг выбранной, пока их больше не будет ? извините за длинные коды :)

1 Ответов

Рейтинг:
0

OriginalGriff

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

0 0 0 0 0  
0 . . . 0   3 x 3 play area
0 . . . 0
0 . . . 0
0 0 0 0 0
Таким образом, массив равен [5,5], а "фактическая игровая зона" - это как раз то место, где находятся точки: индексы от 1 до 3 включительно как в x, так и в y.

Это означает, что ваше "сколько вокруг этого" становится простым:
int HowManyAround(int x, int y)
{
    int count = 0;
    count += board[x - 1][y - 1] == mine ? 1 : 0;
    count += board[x - 1][y + 0] == mine ? 1 : 0;
    count += board[x - 1][y + 1] == mine ? 1 : 0;
    count += board[x + 0][y - 1] == mine ? 1 : 0;
    count += board[x + 0][y + 1] == mine ? 1 : 0;
    count += board[x + 1][y - 1] == mine ? 1 : 0;
    count += board[x + 1][y + 0] == mine ? 1 : 0;
    count += board[x + 1][y + 1] == mine ? 1 : 0;
    return count;
}
Вам не нужно проверять края, потому что вы задаете их с помощью "не мина", и это никогда не меняется. Сделайте my_board одинакового размера и всегда используйте индексы на основе 1.

Затем вы можете построить весь свой массив my_board с помощью простого вложенного цикла:
for (int x = 1; x <= board_size; x++)
    {
    for (int y = 1; y < board_size; y++)
        {
        my_board[x][y] = HowManyAround(x, y);
        }
    }

Тогда все, что вам нужно сделать, это найти "ограниченную область" (то есть область нулей, окруженную ненулями).