一、扫雷游戏分析和设计
扫雷游戏的功能说明
·使用控制台实现经典的扫雷游戏
·游戏可以通过菜单实现继续玩或者退出游戏
·扫雷的棋盘是9*9格子
·默认随机布置10个雷
·可以排查雷
· 如果位置不是雷,就显示周围有几个雷
· 如果位置是雷,就炸死游戏结束
· 把除10个雷之外的所有雷
二、扫雷游戏方法设计
1.初始化棋盘
2.打印棋盘
3.布置雷
4.排查雷
三、扫雷代码实现
本次使用多文件形式对函数的声明和定义
我们建立三个文件 分别为 game.c test.c game.h
在game.c 文件中写游戏中函数的实现等
在test.c 文件中写游戏测试的逻辑
在game.h文件中 写游戏需要的数据类型和函数声明
在game.c文件中 我们要实现
1⃣️初始化棋盘--将棋盘展现为传入的字符
#include "game.h" void InitBoard(char board[ROWS][COLS],int rows,int cols,char set){ for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { board[i][j]=set; } } }
2⃣️//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col){ printf("---------扫雷游戏--------\n"); for (int i = 0; i <=col; i++) { printf("%d ",i); } printf("\n"); for (int i = 1; i <= row; i++) { printf("%d ",i); for (int j = 1; j <=col ; j++) { printf("%c ",board[i][j]); } printf("\n"); } }
3⃣️设置雷
void SetMine(char board[ROWS][COLS],int row,int col){ //布置10个随机的雷 int count = EASY_COUNT; while (count){ int x = rand()%row +1; int y = rand()%col +1; if (board[x][y]=='0'){ board[x][y]='1'; count--; } } }
4⃣️统计周围雷的个数
int GetMineCount(char mine[ROWS][COLS],int x,int y){ return (mine[x - 1][y]+mine[x-1][y-1]+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'); }
5⃣️实现排查雷的方法
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col){ int x,y; int win =0; while (win<row*col-EASY_COUNT){ printf("请输入要排查的坐标>>>>>>\n"); scanf("%d%d",&x,&y); if (x>=1 && x<=row && y>=1 && y<=col){ if (mine[x][y]=='1') { printf("很遗憾你被炸死了\n"); DisplayBoard(mine,ROW,COL); break; }else{ int count = GetMineCount(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); } }
接下来在game.h中声明游戏所需要的数据类型和函数声明
最后在主函数内也就是test.c文件实现功能
#include <stdio.h> #include "game.h" void menu(){ printf("**************************\n"); printf("******** 1.开始游戏 *******\n"); printf("******** 0.结束游戏 *******\n"); printf("**************************\n"); } void game(){ char mine[ROWS][COLS];//放雷 char show[ROWS][COLS];//查雷 //初始化棋盘 //mine 最开始全是‘0’ //show 最开始全是‘*’ InitBoard(mine,ROWS,COLS,'0'); InitBoard(show,ROWS,COLS,'*'); DisplayBoard(show,ROW,COL); SetMine(mine,ROW,COL); FindMine(mine,show,ROW,COL); } int main() { int input; srand((unsigned int)time(NULL)); do {menu(); printf("请选择>>>>:\n"); scanf("%d",&input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新选择\n"); break; } } while (input); return 0; }
查看运行结果