这期内容当中小编将会给大家带来有关C语言中怎么实现一个扫雷程序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
整个游戏设计中主要的函数为:
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;
}
上述就是小编为大家分享的C语言中怎么实现一个扫雷程序了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。