返回

扫雷游戏程序实现——C语言实现的妙趣玩法

后端

一、游戏效果展示

扫雷游戏效果图

二、游戏功能实现(详细版)

1.雷盘初始化

void init_minefield(int minefield[][MINEFIELD_WIDTH], int height, int width) {
    // 将雷盘的每个单元格初始化为 0
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            minefield[i][j] = 0;
        }
    }
}

2.布雷

void place_mines(int minefield[][MINEFIELD_WIDTH], int height, int width, int num_mines) {
    // 随机生成 num_mines 个雷
    for (int i = 0; i < num_mines; i++) {
        int row = rand() % height;
        int col = rand() % width;

        // 如果该单元格已经放置了雷,则重新生成随机数
        while (minefield[row][col] == -1) {
            row = rand() % height;
            col = rand() % width;
        }

        // 将该单元格标记为雷
        minefield[row][col] = -1;
    }
}

3.打印雷盘

void print_minefield(int minefield[][MINEFIELD_WIDTH], int height, int width) {
    // 打印雷盘的表头
    printf("    ");
    for (int i = 0; i < width; i++) {
        printf("%2d ", i);
    }
    printf("\n");

    // 打印雷盘的每一行
    for (int i = 0; i < height; i++) {
        printf("%2d ", i);
        for (int j = 0; j < width; j++) {
            // 如果该单元格是雷,则打印 '*'
            if (minefield[i][j] == -1) {
                printf("* ");
            }
            // 否则,打印该单元格周围雷的个数
            else {
                printf("%d ", count_adjacent_mines(minefield, i, j));
            }
        }
        printf("\n");
    }
}

4.排查雷

int sweep_mine(int minefield[][MINEFIELD_WIDTH], int height, int width, int row, int col) {
    // 如果该单元格是雷,则游戏结束
    if (minefield[row][col] == -1) {
        return -1;
    }

    // 如果该单元格周围没有雷,则将该单元格及其周围的单元格全部打开
    else if (count_adjacent_mines(minefield, row, col) == 0) {
        minefield[row][col] = 0;
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                // 检查该单元格周围的单元格是否在雷盘内
                if (row + i >= 0 && row + i < height && col + j >= 0 && col + j < width) {
                    // 如果该单元格不在雷盘内,则继续循环
                    if (minefield[row + i][col + j] == -2) {
                        continue;
                    }

                    // 如果该单元格周围没有雷,则将该单元格及其周围的单元格全部打开
                    if (count_adjacent_mines(minefield, row + i, col + j) == 0) {
                        minefield[row + i][col + j] = 0;
                    }
                    // 否则,将该单元格标记为已打开
                    else {
                        minefield[row + i][col + j] = count_adjacent_mines(minefield, row + i, col + j);
                    }
                }
            }
        }
    }

    // 否则,将该单元格标记为已打开
    else {
        minefield[row][col] = count_adjacent_mines(minefield, row, col);
    }

    // 返回该单元格的状态
    return minefield[row][col];
}

5.计算周围雷的个数

int count_adjacent_mines(int minefield[][MINEFIELD_WIDTH], int row, int col) {
    int count = 0;

    // 检查该单元格周围的单元格是否在雷盘内
    for (int i = -1; i <= 1; i++) {
        for (int j = -1; j <= 1; j++) {
            // 如果该单元格周围的单元格在雷盘内,则检查该单元格是否为雷
            if (row + i >= 0 && row + i < MINEFIELD_HEIGHT && col + j >= 0 && col + j < MINEFIELD_WIDTH) {
                if (minefield[row + i][col + j] == -1) {
                    count++;
                }
            }
        }
    }

    // 返回该单元格周围雷的个数
    return count;
}

三、结语

C语言版扫雷游戏是一款经典且有趣的益智游戏,不仅重现儿时记忆,也让编程者拥有了自由发挥与创新体验的机会。同时,它也考验着玩家的逻辑思维和推理能力,充满了挑战与趣味。所以,如果你正在寻找一个既有趣又有挑战性的游戏,那么不妨试试这款C语言版扫雷游戏吧。