扫雷游戏:从零开始的C语言实现

扫雷这款游戏相信没有人没玩过,学生时期每次上微机课的时候一定会先打开玩上两把。那这款经典的游戏是怎么被写出来的呢?这篇博客将带您从零开始,使用C语言编写一个简化版的扫雷游戏。

游戏规则

扫雷游戏通常在一个方格网格中进行,每个方格可能包含以下几种元素之一:

  • 地雷:某些方格中包含地雷,踩到地雷会导致游戏失败。
  • 数字:数字表示相邻方格中的地雷数量。
  • 空白:空白方格表示周围没有地雷,揭开时可能会展开一片区域。

游戏的目标是揭开所有不含地雷的方格,同时避免揭开地雷。

准备工作

在开始编写代码之前,我们需要进行一些准备工作。首先,我们要定义游戏的网格大小和地雷数量。在这个示例中,我们将使用一个10x10的网格,并在其中放置10颗地雷。

#define SIZE 10
#define MINES 10
我们还需要定义两个二维数组来表示游戏的状态:grid 用于存储地雷和数字信息,revealed 用于跟踪哪些方格已经揭开。
int grid[SIZE][SIZE];
int revealed[SIZE][SIZE];

初始化游戏

游戏初始化是整个游戏的第一步。在初始化阶段,我们将清空gridrevealed数组,并随机布置地雷。

void initializeGame() {
    // 清空游戏网格和已揭开方块的数组
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            grid[i][j] = 0;
            revealed[i][j] = 0;
        }
    }

    // 随机布置地雷
    srand(time(NULL));
    int count = 0;
    while (count < MINES) {
        int x = rand() % SIZE;
        int y = rand() % SIZE;
        if (grid[x][y] == 0) {
            grid[x][y] = -1; // -1 表示地雷
            count++;
        }
    }
}

打印游戏界面

在游戏进行中,我们需要能够查看当前游戏的状态。我们将创建一个函数来打印游戏界面,显示已揭开的方格、地雷和数字。

void printGameBoard() {
    // 打印游戏标题和列数
    printf("扫雷游戏\n\n");
    printf("  ");
    for (int i = 1; i <= SIZE; i++) {
        printf("%d ", i);
    }
    printf("\n");

    // 打印游戏界面
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", i + 1); // 打印行数
        for (int j = 0; j < SIZE; j++) {
            if (revealed[i][j]) {
                if (grid[i][j] == -1) {
                    printf("* "); // 地雷
                } else if (grid[i][j] == 0) {
                    printf("  "); // 0表示周围没有地雷
                } else {
                    printf("%d ", grid[i][j]); // 数字
                }
            } else {
                printf("* "); // 未揭开的网格
            }
        }
        printf("\n");
    }
}

揭开方格

游戏的核心部分是揭开方格。我们将创建一个reveal函数来处理这个过程。此函数将接受用户输入的坐标,并根据坐标揭开相应的方格。

void reveal(int x, int y) {
    x--; // 将用户输入的坐标从1到10映射到0到9
    y--;

    // 检查方格是否合法以及是否已经揭开
    if (x < 0 || x >= SIZE || y < 0 || y >= SIZE || revealed[x][y]) {
        return; // 超出边界或已经揭开的方格不再处理
    }

    revealed[x][y] = 1; // 标记方格已揭开
    remainingTiles--;

    if (grid[x][y] == -1) {
        // 游戏失败,揭开地雷
        printf("游戏失败!你踩到了地雷。\n");
        // 揭示所有方格和地雷
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                revealed[i][j] = 1;
            }
        }
        return;
    } else {
        // 揭开数字方块
        int count = 0; // 计算周围的地雷数量
        // 检查周围8个方块
        for (int dx = -1; dx <= 1; dx++) {
            for (int dy = -1; dy <= 1; dy++) {
                if (x + dx >= 0 && x + dx < SIZE && y + dy >= 0 && y + dy < SIZE) {
                    if (grid[x + dx][y + dy] == -1) {
                        count++;
                    }
                }
            }
        }
        if (count > 0) {
            // 存储数字到grid数组中
            grid[x][y] = count;
        }
    }

    if (remainingTiles == 0) {
        // 游戏胜利,所有非地雷方块都已揭开
        printf("恭喜,你赢了!\n");
        // 在这里可以添加游戏结束的逻辑
        return;
    }
}

主函数

最后,我们来编写主函数来驱动整个游戏。在主函数中,我们将初始化游戏,然后在一个无限循环中等待玩家的输入。

int main() {
    initializeGame();

    while (1) {
        printGameBoard();

        int x, y;
        printf("\n请输入要揭开的方块的坐标(格式:x y):");
        scanf("%d %d", &x, &y);

        reveal(x, y);
    }

    return 0;
}

总结

通过以上的步骤,我们成功地创建了一个简单的扫雷游戏,并用C语言实现了它。让我们开始游玩吧!

这个示例虽然简单,但包含了扫雷游戏的核心功能,可以作为进一步扩展和改进的基础。

希望这篇博客对初学者有所帮助,如果您有任何问题或建议,请随时提出。玩得开心,扫雷游戏!

以下是完整代码:

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

#define SIZE 10
#define MINES 10

int grid[SIZE][SIZE];
int revealed[SIZE][SIZE];
int remainingTiles; // 未揭开的方块数量

void initializeGame() {
    // 初始化游戏网格和已揭开方块的数组
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            grid[i][j] = 0;
            revealed[i][j] = 0;
        }
    }

    // 随机布置地雷
    srand(time(NULL));
    int count = 0;
    while (count < MINES) {
        int x = rand() % SIZE;
        int y = rand() % SIZE;
        if (grid[x][y] == 0) {
            grid[x][y] = -1; // -1 表示地雷
            count++;
        }
    }
}

void printGameBoard() {
    printf("扫雷游戏\n\n");

    // 打印列数
    printf("  ");
    for (int i = 1; i <= SIZE; i++) {
        printf("%d ", i);
    }
    printf("\n");

    // 打印游戏界面
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", i + 1); // 打印行数
        for (int j = 0; j < SIZE; j++) {
            if (revealed[i][j]) {
                if (grid[i][j] == -1) {
                    printf("* "); // 地雷
                }
                else if (grid[i][j] == 0) {
                    printf("  "); // 0表示周围没有地雷
                }
                else {
                    printf("%d ", grid[i][j]); // 数字
                }
            }
            else {
                printf("* "); // 未揭开的网格
            }
        }
        printf("\n");
    }
}

void reveal(int x, int y) {
    x--; // 将用户输入的坐标从1到10映射到0到9
    y--;

    if (x < 0 || x >= SIZE || y < 0 || y >= SIZE || revealed[x][y]) {
        return; // 超出边界或已经揭开的方块不再处理
    }

    revealed[x][y] = 1; // 标记方块已揭开
    remainingTiles--;

    if (grid[x][y] == -1) {
        // 游戏失败,揭开地雷
        printf("游戏失败!你踩到了地雷。\n");
        // 揭示所有方格和地雷
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                revealed[i][j] = 1;
            }
        }
        return;
    }
    else {
        // 揭开数字方块
        int count = 0; // 计算周围的地雷数量
        // 检查周围8个方块
        for (int dx = -1; dx <= 1; dx++) {
            for (int dy = -1; dy <= 1; dy++) {
                if (x + dx >= 0 && x + dx < SIZE && y + dy >= 0 && y + dy < SIZE) {
                    if (grid[x + dx][y + dy] == -1) {
                        count++;
                    }
                }
            }
        }
        if (count > 0) {
            // 存储数字到grid数组中
            grid[x][y] = count;
        }
    }
    if (remainingTiles == 0) {
        // 游戏胜利,所有非地雷方块都已揭开
        printf("恭喜,你赢了!\n");
        // 在这里可以添加游戏结束的逻辑
        return;
    }
}

int main() {
    initializeGame();

    while (1) {
        printGameBoard();

        int x, y; 
        
        printf("\n请输入要揭开的方块的坐标(格式:x y):");
        scanf("%d %d", &x, &y);

        reveal(x, y);
        
    }

    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值