c语言简单实现 扫雷

来源:互联网 发布:硬笔书法网络免费班 编辑:程序博客网 时间:2024/05/17 02:47

这个游戏可以实现根据选择坐标后所显示无雷区范围的不同分为简单 ,普通和困难

游戏程序中,实现了游戏的计时(分钟)功能,实现了扫雷游戏的最基础功能。

 定义了一个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';             //定义雷为字符 0count++;}}}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;}elseif(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;}elseif(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;}elseif(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;}




0 0
原创粉丝点击