C语言入门必须要学习的模块化编程案例游戏---扫雷【源码大全】

这个示例实现了扫雷游戏的基本功能,包括初始化棋盘、布置地雷、显示棋盘以及排查地雷等。

文件结构
game.h:头文件,包含游戏所需的数据类型和函数声明。
game.c:源文件,包含游戏逻辑的实现。
main.c:主程序文件,包含main函数,用于启动游戏。

main.c

#include <stdio.h>  
#include "game.h"  
  
void menu() {  
    printf("********************************\n");  
    printf("********** 1.play ***********\n");  
    printf("********** 0.exit ***********\n");  
    printf("********************************\n");  
}  
  
int main() {  
    char mine[ROWS][COLS] = {0}; // 用于存储地雷分布的棋盘  
    char show[ROWS][COLS] = {0}; // 用于显示给用户的棋盘  
    int input = 0;  
  
    srand((unsigned int)time(NULL)); // 初始化随机数种子  
  
    do {  
        menu();  
        printf("请选择选项:>");  
        scanf("%d", &input);  
  
        switch (input) {  
            case 1:  
                InitBoard(mine, ROWS, COLS, '0'); // 初始化地雷棋盘  
                InitBoard(show, ROWS, COLS, '*'); // 初始化显示棋盘  
                SetMine(mine, ROW, COL); // 布置地雷  
                DisplayBoard(show, ROW, COL); // 显示棋盘  
                FindMine(mine, show, ROW, COL); // 开始排雷  
                break;  
            case 0:  
                printf("退出扫雷游戏\n");  
                break;  
            default:  
                printf("选择错误,请重新开始选择\n");  
                break;  
        }  
    } while (input != 0);  
  
    return 0;  
}

game.c

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
#include "game.h"  
  
// 初始化棋盘  
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {  
    int i, j;  
    for (i = 0; i < rows; i++) {  
        for (j = 0; j < cols; j++) {  
            board[i][j] = set;  
        }  
    }  
}  
  
// 显示棋盘  
void DisplayBoard(char board[ROWS][COLS], int row, int col) {  
    int i, j;  
    printf("******* 扫雷 *******\n");  
    for (j = 0; j <= col; j++) {  
        printf("%d ", j);  
    }  
    printf("\n");  
    for (i = 1; i <= row; i++) {  
        printf("%d ", i);  
        for (j = 1; j <= col; j++) {  
            printf("%c ", board[i][j]);  
        }  
        printf("\n");  
    }  
}  
  
// 布置地雷  
void SetMine(char mine[ROWS][COLS], int row, int col) {  
    int count = EASY_COUNT;  
    while (count) {  
        int x = rand() % row + 1;  
        int y = rand() % col + 1;  
        if (mine[x][y] == '0') {  
            mine[x][y] = '1';  
            count--;  
        }  
    }  
}  
  
// 排查地雷  
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {  
    int x, y, win = 0;  
    while (win < row * col - EASY_COUNT) {  
        printf("请输入要排查的坐标:>");  
        scanf("%d %d", &x, &y);  
        if (x >= 1 && x <= row && y >= 1 && y <= col) {  
            if (show[x][y] == '*') {  
                if (mine[x][y] == '1') {  
                    printf("很遗憾,你被炸死\n");  
                    DisplayBoard(mine, ROW, COL); // 这里应该显示布雷的棋盘是不合适的,应该显示给用户看的棋盘show,但为简化示例,这里仍使用mine  
                    return;  
                }  
            } else {  
                int mineCount = 0;  
                // 检查周围8个位置的地雷数量  
                if (mine[x - 1][y - 1] == '1') mineCount++;  
                if (mine[x - 1][y] == '1') mineCount++;  
                if (mine[x - 1][y + 1] == '1') mineCount++;  
                if (mine[x][y - 1] == '1') mineCount++;  
                if (mine[x][y + 1] == '1') mineCount++;  
                if (mine[x + 1][y - 1] == '1') mineCount++;  
                if (mine[x + 1][y] == '1') mineCount++;  
                if (mine[x + 1][y + 1] == '1') mineCount++;  
  
                show[x][y] = mineCount + '0'; // 显示地雷数量  
            }  
        } else {  
            printf("坐标输入不合法\n");  
        }  
    }  
    printf("恭喜你,排雷成功!\n");  
}

game.h

#ifndef GAME_H  
#define GAME_H  
  
#define ROW 9  
#define COL 9  
#define ROWS ROW + 2  
#define COLS COL + 2  
#define EASY_COUNT 10  
  
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);  
void DisplayBoard(char board[ROWS][COLS], int row, int col);  
void SetMine(char mine[ROWS][COLS], int row, int col);  
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);  
  
#endif // GAME_H

编译与运行

将上述代码分别保存为game.h、game.c和main.c文件,然后使用C编译器(如gcc)进行编译:

gcc main.c game.c -o minesweeper

编译成功后,运行生成的可执行文件:

./minesweeper

此时,你就可以玩这个简单的扫雷游戏了。注意,这个示例实现的是初级难度的扫雷游戏,棋盘大小为9x9,地雷数量为10个。你可以根据需要修改这些参数来增加游戏难度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值