实现效果比较简陋,如图:

c语言编写经典扫雷游戏(C语言写游戏扫雷)(1)

写游戏需要不同的文件构成,首先看一下资源管理器清楚框架结构:​

c语言编写经典扫雷游戏(C语言写游戏扫雷)(2)

在test.c文件里编写整个游戏的运行逻辑,具体代码:

#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" //测试游戏 void menu() { printf("*******************************\n"); printf("********* 1.play ********\n"); printf("********* 0.exit ********\n"); printf("*******************************\n"); } void game() { //雷的信息存储 //1.布置好的雷的信息 //11*11真实的棋盘 char mine[ROWS][COLS] = { 0 };//11*11 //2.排查出的雷的信息 //11*11真实的棋盘 char show[ROWS][COLS] = { 0 }; //初始化 //11*11真实的棋盘 InitBoard(mine, ROWS, COLS,'0'); InitBoard(show, ROWS, COLS,'*'); //打印棋盘 //DisplayBoard(mine, ROW, COL);//打印9*9的棋盘 DisplayBoard(show, ROW, COL); //布置雷 SetMine(mine, ROW, COL); //DisplayBoard(mine, ROW, COL); //扫雷 FindMine(mine, show, ROW, COL); } void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新输入\n"); break; } } while (input); } int main() { test(); return 0; }

各个模块跨文件调用的话需要在头文件里声明,即game.h文件内:​​​​​

#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 9 #define COL 9 #define ROWS ROW 2 //创建9*9的棋盘为了保证角落的有效性需要创建11*11 #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 board[ROWS][COLS], int row, int col); void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

扫雷游戏最核心的是游戏模块的实现,在game.c内编写​

#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" //游戏部分函数功能实现 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) { int j = 0; int i = 0; 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 = 0; int j = 0; for (i = 0; i <= col; i )//打印列号 { printf("%d ", i); } 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 board[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while (count) { int x = rand() % row 1;//1-9 int y = rand() % col 1; if (board[x][y] == '0') { board[x][y] = '1'; count--; } } } //'0' - '0'=0 //'1' - '0'=1 //字符1减字符零等于数字1 //'3' - '0'=3 int get_mine_count(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y] mine[x - 1][y - 1] mine[x][y - 1] mine[x 1][y - 1] mine[x 1][y] mine[x 1][y 1] mine[x][y 1] mine[x - 1][y 1] - 8 * '0'; } void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0; while (win < row*col - EASY_COUNT)//假如设置10个雷9*9-10=71有71处不是雷 { printf("请输入排雷的坐标:"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row&&y >= 1 && y <= col) { //坐标合法 //1.踩雷 if (mine[x][y] == '1') { printf("很遗憾,你被炸死了\n"); DisplayBoard(mine, row, col); break; } else//不是雷 { //计算x,y坐标周围有几个雷 int count = get_mine_count(mine, x, y); show[x][y] = count '0'; DisplayBoard(show, row, col); win ; } } else { printf("输入坐标非法,请重新输入!\n"); } } if (win == row*col - EASY_COUNT) { printf("恭喜你排雷成功\n"); DisplayBoard(mine, row, col); } }

,