> 文章列表 > 扫雷小游戏 - C语言

扫雷小游戏 - C语言

扫雷小游戏 - C语言

目录

一、扫雷游戏

1.游戏一共创建使用了三个文件

2.test.c 文件代码(游戏逻辑)

3.game.h - 必要的函数声明代码 

4.game.c 游戏所有函数实现代码


一、扫雷游戏

1.游戏一共创建使用了三个文件

test.c - 测试游戏逻辑

game.h - 游戏代码包含的函数声明

game.c - 游戏里面函数的实现

2.test.c 文件代码(游戏逻辑)

#define _CRT_SECURE_NO_WARNINGS 1
//测试游戏逻辑#include"game.h"void menu()
{printf("           < M E N U >           \\n");printf("*********************************\\n");printf("*********    1.play    **********\\n");printf("*********    0.exit    **********\\n");printf("*********************************\\n");}void game()
{//创建棋盘char mine[ROWS][COLS] = { 0 };//布置雷的棋盘char show[ROWS][COLS] = { 0 };//展示玩家棋盘//初始化棋盘 - 11*11InitBoard(mine, ROWS, COLS, '0');//将雷棋盘,初始化为'0'InitBoard(show, ROWS, COLS, '*');//将玩家棋盘,初始化为'*'//打印棋盘 - 传过去的show棋盘11*11,实际打印9*9 ROW, COLDisplayBoard(show, ROW, COL);//布置雷 - 传过去mine棋盘11*11,实际打印9*9 ROW COLSetMine(mine, ROW, COL);DisplayBoard(mine, ROW, COL);//排查雷 - 再mine数组里将排查的雷的信息,放到show数组里,所以传的时候两个数组都要传FindMine(mine, show, ROW, COL);
}int main()
{//srand只调用一次,放在主函数srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请输入菜单选项:>");scanf("%d", &input);printf("\\n");switch (input){case 1:game();break;case 0:printf("<   退出游戏  >\\n");break;default:printf("<  选择错误,请重新输入!!>\\n");break;}} while (input);return 0;
}

3.game.h - 必要的函数声明代码 

#define _CRT_SECURE_NO_WARNINGS 1
//包含必要的声明//定义变量和宏
#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#define num_mine 10
//包含的头文件
#include<stdio.h>
#include<stdlib.h>	/* rand,srand*/
#include<time.h>	/* time *///自定义函数的声明//初始化棋盘 - 11*11
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘 - 传过来的是11*11 打印的是9*9
void DisplayBoard(char board[ROWS][COLS], int row, int col);//布置雷 - 传过来的是11*11 打印的是9*9
void SetMine(char mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//统计坐标周围雷的情况
int GetMineCount(char mine[ROWS][COLS], int x, int y);

4.game.c 游戏所有函数实现代码

#define _CRT_SECURE_NO_WARNINGS 1
//实现程序所需的函数#include"game.h"//初始化棋盘 - 11*11
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}//打印棋盘 - 传过来的11*11 打印的是 9*9
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;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");}printf("\\n");}//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = num_mine;//10个雷while (count){//随机生成雷坐标 - rand() 0~32767int x = rand() % row + 1;int y = rand() % col + 1;//判断棋盘是否布置过雷if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}}//统计该坐标周围雷的情况
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{//周围所有坐标字符(8个字符)的和 减去8*'0' = 雷的数量//参考:// '0' + 0 = '0'// '0' + 1 = '1'//得到// '1' - '0'= 1//8*'1' - 8*'0'如果等于 0,则表示没有雷;等于1~7则表示有雷;返回对应的数字即可;return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]+ mine[x][y - 1] + mine[x][y + 1]+ mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1])- 8 * '0';
}//将坐标周围没有雷时,置该坐标及周围8个坐标为 空格 ,不显示
void SetNone(char show[ROWS][COLS], int x, int y)
{show[x][y] = ' ';show[x - 1][y - 1] = ' ';show[x - 1][y] = ' ';show[x - 1][y + 1] = ' ';show[x][y - 1] = ' ';show[x][y + 1] = ' ';show[x + 1][y - 1] = ' ';show[x + 1][y] = ' ';show[x + 1][y + 1] = ' ';}//排查雷
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-num_mine){printf("请输入要排查雷的坐标(行 列):>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col && show[x][y] == '*'){if (mine[x][y] == '1'){printf("\\n******>>很遗憾,踩雷了>>******\\n");printf("******>>请看雷的情况:\\n\\n");DisplayBoard(mine, ROW, COL);break;}else{//排查雷//如果该坐标不是雷,统计该坐标周围雷的情况int count=GetMineCount(mine, x, y);show[x][y] = count+'0';//count为整型 例如2,加上字符'0',变成count整型对应数字字符 例如'2'DisplayBoard(show, ROW, COL);//然后打印棋盘win++;}}else{printf("******>>非法排查!!请重新排查!!>>******\\n");}}if (win == row * col - num_mine){printf("\\n******>>恭喜!!排雷大师!!成功排除所有雷!!******\\n");printf("******>>请看雷的情况:\\n\\n");DisplayBoard(mine, ROW, COL);//然后打印棋盘}
}//代码需要完善:展开函数,标记函数,时间函数(计时)
//展开函数:展开满足这些条件的坐标
/*
必须满足条件:
1.该坐标不是雷
2.该坐标周围没有雷
3.该坐标没有被排查过*/

最后可以体验一下 

同时这只是个简单的扫雷游戏实现,其中也有点缺陷,如果各位大佬有更好的方法可以分享给我哈~~