还是我,今天给大家带来一个关于扫雷的代码实现过程,别的不说先上图!先赞后看好习惯!!!
?而要实现这样的过程并不难!
首先先来看看我们的头文件下的目录吧!
?要扫雷首先则需要给你的雷布置一个边界,我这里选的是9*9外加2个防溢出空间!
首先是对于二维数组的一个初始化,即界面的初始话和菜单的一个功能实现!
1:菜单的实现!
#include"game.h"
void menu()
{
printf("----------------------------------\n");
printf("*********1:开始你的旅途***********\n");
printf("*********0:结束你的征程***********\n");
printf("----------------------------------\n");
}
int main()
{
int input = 0;
while (1)
{
srand((unsigned int)time(NULL));
menu();
printf("请选择->");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始你的游戏,勇士\n");
printf("游戏说明:输入要扫的坐标(行+空格+列),若该坐标不是雷,则会显示以它为中心九宫格剩余8个位置的雷数\n祝您好运!\n");
game();
break;
case 0:
printf("已退出游戏,懦夫\n");
exit(0);
break;
default:
printf("选择错误,重新选择\n");
break;
}
}
}
2:界面的初始化!和显示操作,这里太简单了就不多说了,注意这里的雷用字符‘1’表示
而传参时注意匹配,别将9传到11的数组里面即可!
void Init(char a[HS][LS], int h, int l, char set)
{
int i = 0, j = 0;
for (i = 0; i <h; i++)
{
for (j = 0; j <l; j++)
{
a[i][j] = set;
}
}
}
void Display(char a[HS][LS], int h, int l)
{
int i = 0, j = 0;
printf("行/列 ");
for (i = 1; i <=l; i++)
{
printf("%d ", i);
}
printf("\n");
printf("\n");
for (i = 1; i <= h; i++)
{
printf("%d-> ", i);
for (j = 1; j <=l; j++)
{
printf("%c ", a[i][j]);
}
printf("\n");
}
}
3:布置雷,因为是要随机布置即用到time.h头文件,这样是一个随机布置雷的过程!而前面初始话因为不布置雷的时候是是字符‘0’而这个时候我们布置雷则只需要判等‘0’变为‘1’即可
void setlei(char a[HS][LS], int h, int l,int set)
{
int count = set;
while (count)
{
int x = rand() % h + 1;
int y = rand() % l + 1;
if (a[x][y] == '0')
{
a[x][y] = '1';
count--;
}
}
}
4玩家下坐标的位置实现和输赢的实现,众所周知扫雷的游戏规则就是以扫的位置为中心并以九宫格的形式展开,并提示你的周围有几颗雷,因此前面字符‘1’-0‘得到的数字便是有几颗雷的数量
int get(char a[HS][LS], int x, int y)
{
return a[x - 1][y] + a[x - 1][y - 1] +
a[x][y - 1] + a[x + 1][y - 1] +
a[x + 1][y] + a[x + 1][y + 1] +
a[x][y + 1] + a[x - 1][y + 1] - 8 * '0';
}
而下坐标则简单的许多,判定9*9=81再减去雷的数量给予一个判等的条件便可以知道输赢!
具体操作看我下面的实现!这种方法还有待提高但我觉得对于小白来讲是最为简单明了的了
void find(char a[HS][LS],char a2[HS][LS], int h, int l,int set)
{
int x = 0, y = 0,win=0;
while (win< h*l - set)
{
printf("要侦测的坐标为->\n");
scanf("%d %d", &x,&y);
if (x >= 1 && x <= h && y >= 1 && y <= l)
{
if (a[x][y] == '1')
{
printf("很遗憾,腿都炸没了\n");
printf("\n");
printf("你已经失败了呢!下面数字1为埋雷的位置\n");
Display(a, h, l);
break;
}
else
{
int n = get(a, x, y);
a2[x][y] = n + '0';
Display(a2, h, l);
}
}
else
{
printf("输入坐标无效\n");
}
}
if (win == h * l - set)
{
printf("恭喜你,走出了战壕\n");
Display(a, h, l);
}
}
最后则是相当于一个传参的game()实现功能,这个是写在最后的,只要注意传参不要失误那么这个扫雷游戏是没有那么复杂的!
当然这里我自己加了个游戏难度模式的设定,如果觉得没必要的也可以忽略!总之我也只是小白,欢迎各位大神的指点!
void game()
{
char lei[HS][LS];
char show[HS][LS];
Init(lei, HS, LS, '0');
Init(show, HS, LS, '*');
printf("请选择你的难度:\n1:简单模式5颗雷\n2:普通模式10颗雷\n3:困难模式20颗雷\n4:地狱模式80颗雷,ps:对了就去买彩票吧!\n");
int o;
scanf("%d", &o);
switch (o)
{
case 1:printf("已选择简单模式\n");
setlei(lei, H, L, 5);
Display(show, H, L);
find(lei, show, H, L,20);
break;
case 2:printf("已选择普通模式\n");
setlei(lei, H, L, 10);
Display(show, H, L);
find(lei, show, H, L,20);
break;
case 3:printf("已选择困难模式\n");
setlei(lei, H, L, 20);
Display(show, H, L);
find(lei, show, H, L,20);
break;
case 4:printf("已选择地狱模式\n");
setlei(lei, H, L, 80);
Display(show, H, L);
find(lei, show, H, L,80);
break;
default:
printf("选择错误,重新选择!\n");
break;
}
}
感谢观看,记得点个赞哦!
|