扫雷在C中显示细胞

时间:2014-11-15 07:18:03

标签: c recursion minesweeper

我正在尝试用C编写扫雷程序。 我在这里想要实现的是当用户踩到一个单元格时,附近没有炸弹和提示编号的单元格将被显示出来。 例如,如果x是单元格被踩,o是一个空的但隐藏的方格,.是一个空的但是显示的单元格而*是炸弹(隐藏在当然在玩):

x o o o o
o o o * o
o o o o o

将导致:

. . 1 o o
. . 1 * o
. . 1 o o

以下是代码的一部分:

while (1)
{
    printf("Row? ");
    scanf("%d", &row);
    printf("column? ");
    scanf("%d", &clos);
    if (row < 9 && row >= 0 && clos < 8 && clos >= 0)
        break;
    printf("\nInvalid Location\n\n");
}

if (real_map[row][clos] =='*')
{
    print_map_win(display_map,real_map);
    printf("\n");
    printf("Flags Left = %d\n\n\n", flag_left);
    printf("Game Over\n");
    exit(0);
}
else
{
    if (real_map[row][clos] == ' ')
    {
        display_map[row][clos] = real_map[row][clos];
        bonos_reveal(display_map, real_map, clos, row);
        // [[[bonos_reveal is the function I am asking for]]]
        printf("\n");
    }
    else
    {
        display_map[row][clos] = real_map[row][clos];
    }
}

其中real_map包含提示编号和炸弹,display_map是地图的当前状态。
编辑:我有以下代码,它只显示在一个方向:

int bonos_reveal(int disp_map[MAP_ROWS][MAP_COLS], int real_map[MAP_ROWS][MAP_COLS], int clos, int row)
{
    disp_map[row][clos] = real_map[row][clos];

    if (row < 9 && row >= 0 && clos < 8 && clos >= 0)
    {
        if (real_map[row][clos+1] == ' ')
        {
            bonos_reveal(disp_map, real_map, clos + 1, row);
        }
        else
        {
            disp_map[row][clos+1] = real_map[row][clos+1];
            return 1;
        }
    }
    else
    {
        return 1;
    }
    return 1;
}

我不知道如何循环细胞。

1 个答案:

答案 0 :(得分:0)

好的,这是一个示例实现。它使用以下瓦片值:

  • 0到8:未开采的瓷砖;数字代表预先计算的相邻地雷数量
  • 9:矿井;此特殊值定义为BOMB

有盖瓷砖添加了10个,标记的瓷砖(此处未使用)添加了20个。您可以测试是否使用以下方式挖掘切片:

board[row][col] % 10 == BOMB

我会让代码做解释:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define ROWS 12
#define COLS 20
#define BOMBS 8

#define BOMB 9

void inc(int board[ROWS][COLS], int row, int col)
{
    if (row < 0 || row >= ROWS) return;
    if (col < 0 || col >= COLS) return;
    if (board[row][col] % 10 == BOMB) return;
    board[row][col]++;
}

/*
 *      Set up board and pre-calculate adjacent bombs
 */
void board_init(int board[ROWS][COLS])
{
    int i, j, n;

    for (j = 0; j < ROWS; j++) {
        for (i = 0; i < COLS; i++) {
            board[j][i] = 10;
        }
    }

    n = 0;
    while (n < BOMBS) {
        j = rand() % ROWS;
        i = rand() % COLS;

        if (board[j][i] % 10 != BOMB) {
            board[j][i] = 19;
            inc(board, j - 1, i - 1);
            inc(board, j - 1, i);
            inc(board, j - 1, i + 1);
            inc(board, j,     i - 1);
            inc(board, j,     i + 1);
            inc(board, j + 1, i - 1);
            inc(board, j + 1, i);
            inc(board, j + 1, i + 1);
            n++;
        }
    }
}

/*
 *      Reveal tile and propagate revelation
 */
void board_reveal(int board[ROWS][COLS], int row, int col)
{
    if (row < 0 || row >= ROWS) return;     /* skip off-board tiles */
    if (col < 0 || col >= COLS) return;

    if (board[row][col] < 10) return;       /* already revealed, skip */
    if (board[row][col] >= 20) return;      /* must remove flag first, skip */

    if (board[row][col] % 10 == BOMB) {
        int i, j;

        printf("Bang!\n");

        for (j = 0; j < ROWS; j++) {
            for (i = 0; i < COLS; i++) {
                if (board[j][i] % 10 == BOMB) board[j][i] = BOMB;
            }
        }     
    } else {
        board[row][col] %= 10;
        if (board[row][col] == 0) {
            board_reveal(board, row - 1, col);
            board_reveal(board, row, col - 1);
            board_reveal(board, row, col + 1);
            board_reveal(board, row + 1, col);
        }
    }
}

void board_print(int board[ROWS][COLS])
{
    int i, j;

    for (j = 0; j < ROWS; j++) {
        putchar(' ');

        for (i = 0; i < COLS; i++) {
            const char *tile = ".12345678*##########PPPPPPPPPP";
            int k = board[j][i];

            putchar(tile[k]);
        }

        putchar('\n');
    }
}

int main()
{
    int board[ROWS][COLS];

    srand(time(NULL));
    board_init(board);
    board_reveal(board, 0, 0);
    board_print(board);

    return 0;
}