#include<stdio.h>
/*系统内部: line1,hang1:初级;line2,hang2:中等;line3,hang3:高级
玩家显示:lwj1,hwj1:初级;lwj1,hwj1:中等;lwj1,hwj1:高级*/
# define line1 11
# define hang1 11
# define hwj1 9
# define lwj1 9
# define line2 20
# define hang2 20
# define hwj2 18
# define lwj2 18
# define line3 26
# define hang3 26
# define hwj3 24
# define lwj3 24
/*在内部函数内部: 雷所代表着“1”,没有雷:“0”
在展示函数内部:还未扫到的地方:*
若扫了,但是没有扫到雷,就显示其周边有几个雷就显示数字
若扫了,但是扫到雷,则游戏结束,跳出循环
格子全部扫完,而且没有扫到雷,则扫雷成功,跳出循环*/
int cd()//菜单显示
{
int select;
printf("******* 1: PLAY *******\n");
printf("******* 2: EXIT *******\n");
printf("请输入你的选择:");
scanf("%d",&select);
return select;
}
int cd1()
{
int select;
printf("******* 1: 初级级别 *******\n");
printf("******* 2: 中等级别 *******\n");
printf("******* 3: 高级级别 *******\n");
printf("请输入你的选择:");
scanf("%d",&select);
return select;
}
void initboard(int h,int l,char board[h][l],char set)//棋盘初始化
{
int x,y;
for(x=0;x<h;x++)
{
for(y=0;y<l;y++)
{
board[x][y]=set;
}
}
}
void displayboard(int h,int l,char board[h][l])//棋盘显示
{
int x,y;
for(x=1;x<h;x++)
{
printf(" %d ",x);
}
printf("\n");
for(x=1;x<h-1;x++)
{
for(y=1;y<l-1;y++)
{
if(y<10) printf(" %c ",board[x][y]);
else printf(" %c ",board[x][y]);
}
printf(" %d ",x);
printf("\n");
}
}
void laymine(int h,int l,char mine[h][l],int count)
{
int x,y;
x=0;y=0;
initboard(h,l,mine,'0');//在内部函数内部: 雷所代表着“1”,没有雷:“0”
while(count)
{
x=rand()%(h-2)+1;
y=rand()%(l-2)+1;
if(mine[x][y]=='0') mine[x][y]='1';
else count+=1;
count-=1;
}
printf("\n");
}
char searchlei(int h,int l,char mine[h][l],int x,int y)
{
int x1,y1,count=0;
for(x1=(x-1);x1<(x+2);x1++)
{
for(y1=(y-1);y1<(y+2);y1++)
{
if(x1==x&&y1==y)
continue;
if(mine[x1][y1]=='1')
count++;
}
}
return ('0'+count);
}
void ts(int h,int l,char mine[h][l],char show[h][l],int x,int y)
{
int x1,y1,count=0;
for(x1=(x-1);x1<(x+2);x1++)
{
for(y1=(y-1);y1<(y+2);y1++)
{
if(x1==x&&y1==y)
continue;
if(mine[x1][y1]=='0')
count++;
}
}
if(count==8)
{
for(x1=(x-1);x1<(x+2);x1++)
{
for(y1=(y-1);y1<(y+2);y1++)
{
show[x1][y1]=searchlei(h,l,mine,x1,y1);
}
}
ts(h,l,mine,show,x,(y+1));
}
}
void PLAY1(int h,int l,char mine[h][l],char show[h][l])
{
int x,y,count,ge;
ge=(h-2)*(l-2);
initboard(h,l,mine,'0');//在内部函数内部: 雷所代表着“1”,没有雷:“0”
initboard(h,l,show,'*');//展示函数内部:还未扫到的地方:*
printf("请输入你要排雷的个数:");/**/
scanf("%d",&count);
laymine(h,l, mine,count);
displayboard(h,l,mine);
printf("游戏开始\n");
while(1)
{
displayboard(h,l,show);
printf("请输入你要排雷的坐标:");
scanf("%d,%d",&x,&y);
printf("\n");
if(x<(h-1)&&x>0&&y>0&&y<(l-1))
{
if(mine[x][y]=='1')
{
printf("排雷失败\n");
show[x][y]='&';
displayboard(h,l,show);
printf("\n");
printf("雷的分布:\n");
displayboard(h,l,mine);
break;
}
else
{
show[x][y]=searchlei(h,l,mine,x,y);
ts(h,l,mine,show,x,y);
printf("游戏继续\n");
ge-=1;
}
}
else printf("输入错误,请重新输入\n");
if(ge==0)
{
printf("恭喜排雷成功\n");
break;
}
}
}
void MODE()//游戏等级选择
{
int select;
char mine1[line1][hang1],show1[line1][hang1],
mine2[line2][hang2],show2[line2][hang2],
mine3[line3][hang3],show3[line3][hang3];
select=cd1();
switch(select)
{
case 1://初级模式
{
PLAY1(line1,hang1,mine1,show1);
break;
}
case 2://中级模式
{
PLAY1(line2,hang2,mine2,show2);
break;
}
case 3:// 高级模式
{
PLAY1(line3,hang3,mine3,show3);
break;
}
default:
{
printf("输入错误,请重新输入\n");
break;
}
}
}
int main()
{
int select,power=1;
srand((unsigned int)time (NULL));
while(power)
{
select=cd();
switch(select)
{
case 1:
{
MODE();break;
}
case 2:
{
printf("退出游戏中····"); power=0;
break;
}
default:
{printf("输入错误,请重新输入\n");break;}
}
}
}
扫雷游戏加强版
最新推荐文章于 2024-07-18 19:08:59 发布