C语言 扫雷程序的实现
C语言 扫雷程序的实现
这个游戏可以实现根据选择坐标后所显示无雷区范围的不同分为简单 ,普通和困难
游戏程序中,实现了游戏的计时(分钟)功能,实现了扫雷游戏的最基础功能。
定义了一个9*9的棋盘,玩家只要根据提示选择游戏,和难度;
根据提示输入 合法的坐标,如输入不合法则会进行提示;
扫雷结束则会提示;如触雷则游戏自动结束;
整个游戏设计中主要的函数为:
1、初始化地雷棋盘和显示棋盘
2、棋盘打印函数
3、扫雷函数的实现
4、游戏主函数
大家可以在宏定义中改变棋盘大小,雷的个数,以及显示的无雷区范围。
废话不说 直接上代码:(未优化,请多包涵 )
<pre name="code" class="objc">#ifndef __MINE_H__ #define __MINE_H__ #define LINES 11 // 棋盘的行 #define ROWS 11 // 棋盘的列 #define mine_MAX 10 // 雷的数目 #define EAXY 3 // 简单显示的范围 #define COMMON 2 // 普通显示的范围 #define DIFFICULT 1 // 困难显示的范围 enum op { EXIT, PLAY }; void game(char mine[LINES][ROWS],char text[LINES][ROWS],int lines,int rows); //游戏基本实现函数 void init_mine(char mine[LINES][ROWS],char text[LINES][ROWS],int lines,int rows);// 初始化棋盘函数 void play_EAXY_game(char mine[LINES][ROWS],char text[LINES][ROWS]); // 简单游戏函数 void play_COMMON_game(char mine[LINES][ROWS],char text[LINES][ROWS]) ; //普通游戏函数 void play_DIFFICULT_game(char mine[LINES][ROWS],char text[LINES][ROWS]) ; //困难游戏函数 void mine_EAXY_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]); //简单扫雷实现 void mine_COMMON_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]); //普通扫雷实现 void mine_DIFFICULT_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) ; //困难扫雷实现 void print(char tab[LINES][ROWS]); //打印棋盘 #endif
#include<stdio.h> #include"mine.h" #include<stdlib.h> #include<time.h> void init_mine(char mine[LINES][ROWS],char text[LINES][ROWS],int lines,int rows) //初始化显示棋盘和雷盘 { int i; int j; int a; int b; int count=0; for(i=1; i<LINES-1;i++) //初始化显示棋盘 { for(j=1; j<ROWS-1;j++) { text[i][j]='*'; } } for(i=1; i<LINES-1;i++) //初始化雷盘 { for(j=1; j<ROWS-1;j++) { mine[i][j]='1'; } } srand((unsigned)time(NULL)); //随机产生两个数 while(count<mine_MAX) { a = rand()%9 + 1; b = rand()%9 + 1; if(mine[a][b]!='0') { mine[a][b]='0'; //定义雷为字符 0 count++; } } } void print(char tab[LINES][ROWS]) //打印棋盘函数 { int i; //行 int j; //列 for(i=0;i<LINES-1;i++) //定义第一行的打印 { printf("%d ",i); } printf("\n"); for(i=1; i<LINES-1;i++) //输出棋盘 { printf("%d",i); printf("%c",'|'); for(j=1; j<ROWS;j++) { printf("%c ",tab[i][j]); } printf("\n"); } } void mine_EAXY_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) //简单整个游戏进程 { int a; int b; int count = 0; // 雷的个数 do //是否将雷全部扫完 { int i; int j; int x; int y; print(text); print(mine); flag: printf("请输入坐标=》"); scanf("%d %d",&a,&b); if(a>(LINES-2) || a<0 || b<0 || b>(ROWS-2) || text[a][b]!='*') { printf("输入不合法!\n"); goto flag; } else if(mine[a][b]=='0') //判断是否触雷 { printf("您踩雷了!\n"); break; } else { for(i=(a-EAXY);i<=(a+EAXY);i++) { for(j=(b-EAXY);j<=(b+EAXY);j++) { if(mine[i][j]=='1') { int x=0; //周围雷的数量 if(mine[i-1][j-1]=='0') { x++; } if(mine[i-1][j]=='0') { x++; } if(mine[i-1][j+1]=='0') { x++; } if(mine[i][j-1]=='0') { x++; } if(mine[i][j+1]=='0') { x++; } if(mine[i+1][j-1]=='0') { x++; } if(mine[i+1][j]=='0') { x++; } if(mine[i+1][j+1]=='0') { x++; } text[i][j]=(x+'0'); } } } } for(x=1;x<=(LINES-2);x++) { for(y=1;y<=(ROWS-2);y++) { if(text[x][y]=='*') count++; } } }while(count>mine_MAX); if(count==mine_MAX) { printf("恭喜你 扫雷成功!\n"); } } void mine_COMMON_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) //普通整个游戏进程 { int a; int b; int count; do //是否将雷全部扫完 { int i; int j; int x; int y; count = 0; // 雷的个数 print(text); print(mine); flag: printf("请输入坐标=》"); scanf("%d %d",&a,&b); if(a>(LINES-2) || a<0 || b<0 || b>(ROWS-2) || text[a][b]!='*') { printf("输入不合法!\n"); goto flag; } else if(mine[a][b]=='0') //判断是否触雷 { printf("您踩雷了!\n"); break; } else { for(i=(a-COMMON);i<=(a+COMMON);i++) { for(j=(b-COMMON);j<=(b+COMMON);j++) { if(mine[i][j]=='1') { int x=0; //周围雷的数量 if(mine[i-1][j-1]=='0') { x++; } if(mine[i-1][j]=='0') { x++; } if(mine[i-1][j+1]=='0') { x++; } if(mine[i][j-1]=='0') { x++; } if(mine[i][j+1]=='0') { x++; } if(mine[i+1][j-1]=='0') { x++; } if(mine[i+1][j]=='0') { x++; } if(mine[i+1][j+1]=='0') { x++; } text[i][j]=(x+'0'); } } } print(text); } for(x=1;x<=(LINES-2);x++) { for(y=1;y<=(ROWS-2);y++) { if(text[x][y]=='*') count++; } } }while(count>mine_MAX); if(count==mine_MAX) { printf("恭喜你 扫雷成功!\n"); } } void mine_DIFFICULT_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) //困难整个游戏进程 { int a; int b; int count ; // 雷的个数 do //是否将雷全部扫完 { int i; int j; int x; int y; count = 0; print(text); print(mine); flag: printf("请输入坐标=》"); scanf("%d %d",&a,&b); if(a>(LINES-2) || a<0 || b<0 || b>(ROWS-2) || text[a][b]!='*') { printf("输入不合法!\n"); goto flag; } else if(mine[a][b]=='0') //判断是否触雷 { printf("您踩雷了!\n"); break; } else { for(i=(a-DIFFICULT);i<=(a+DIFFICULT);i++) { for(j=(b-DIFFICULT);j<=(b+DIFFICULT);j++) { if(mine[i][j]=='1') { int x=0; //周围雷的数量 if(mine[i-1][j-1]=='0') { x++; } if(mine[i-1][j]=='0') { x++; } if(mine[i-1][j+1]=='0') { x++; } if(mine[i][j-1]=='0') { x++; } if(mine[i][j+1]=='0') { x++; } if(mine[i+1][j-1]=='0') { x++; } if(mine[i+1][j]=='0') { x++; } if(mine[i+1][j+1]=='0') { x++; } text[i][j]=(x+'0'); } } } print(text); } for(x=1;x<=(LINES-2);x++) { for(y=1;y<=(ROWS-2);y++) { if(text[x][y]=='*') count++; } } }while(count>mine_MAX); if(count==mine_MAX) { printf("恭喜你 扫雷成功!\n"); } }
#include<stdio.h> #include"mine.h" #include<time.h> void emun() { printf("***********************\n"); printf("******* 1.play ******\n"); printf("******** 0.exit ******\n"); printf("***********************\n"); } void emun_dift() //选择难度菜单 { printf("*********************\n"); printf("****** 1.简单 *******\n"); printf("****** 2.普通 *******\n"); printf("****** 3.困难 *******\n"); printf("*********************\n"); } void play_EAXY_game(char mine[LINES][ROWS],char text[LINES][ROWS]) //玩简单游戏 { time_t t_start,t_end; printf("计时开始!!\n"); t_start = time(NULL); //开始计时 mine_EAXY_sweep(mine,text); t_end = time(NULL); //计时结束 printf("您所用时间为:%.0f \n",difftime(t_end,t_start)); } void play_COMMON_game(char mine[LINES][ROWS],char text[LINES][ROWS]) //玩普通游戏 { time_t t_start,t_end; printf("计时开始!!\n"); t_start = time(NULL); //开始计时 mine_COMMON_sweep(mine,text); t_end = time(NULL); //计时结束 printf("您所用时间为:%.0f \n",difftime(t_end,t_start)); } void play_DIFFICULT_game(char mine[LINES][ROWS],char text[LINES][ROWS]) //玩困难游戏 { time_t t_start,t_end; printf("计时开始!!\n"); t_start = time(NULL); //开始计时 mine_DIFFICULT_sweep(mine,text); t_end = time(NULL); //计时结束 printf("您所用时间为:%.0f \n",difftime(t_end,t_start)); } void game() { int input = 0; int flout = 0; char mine[LINES][ROWS]={0}; //定义雷盘 char text[LINES][ROWS]={0}; //定义显示盘 init_mine(mine,text,LINES,ROWS); //初始化雷盘 do { emun(); init_mine(mine,text,LINES,ROWS); //初始化雷盘 printf("请选择=》"); scanf("%d",&input); switch(input) { case PLAY: { emun_dift(); printf("请选择=》"); scanf("%d",&flout); switch(flout) { case 1: play_EAXY_game(mine,text); break; case 2: play_COMMON_game(mine,text); break; case 3: play_DIFFICULT_game(mine,text); break; } } break; case EXIT: break; } }while(input); } int main() { game(); return 0; }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章
- 04-02c语言函数调用后清空内存 c语言调用函数删除字符
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言用函数写分段 用c语言表示分段函数
- 04-02c语言编写函数冒泡排序 c语言冒泡排序法函数
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段函数
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 04-02c语言调用函数求fibo C语言调用函数求阶乘
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 04-02jquery与jsp,用jquery
- 01-10SublimeText编译C开发环境设置
- 01-11ajax实现页面的局部加载
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10C#中split用法实例总结
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05织梦dedecms什么时候用栏目交叉功能?