**
基于C语言控制台实现扫雷游戏
**
前言:第一次纯靠手撸自己完成了个能玩的小游戏,在这里记录一下,代码写的还是繁冗,不清晰。不过好在还是在不断的修bug的过程下实现了功能。好了,处女贴献上。
设计思路:
将整个游戏的实现过程分解为
1.在1010的二维int数组a中埋下雷,有雷为1,无雷为0。
2.另创建一个1010char数组b,使b的每个元素为‘-’,以表示未进行操作。 ‘*’表示雷,‘0’~‘8’表示周围方格有雷的个数。
3.写下两个函数 探索函数 以及 标记函数。
4.控制游戏结束,第一种,探索方格为雷。第二种,所有地雷均被标记,且标记数量等于地雷数量。
分块代码实现
Ps:吐了,直接粘代码卡死了4次了,每次都得重新编辑,然后查了一下得用chrome浏览器才行,但是这次为了保证稳定,我还是选择分块儿粘吧。
1.头函数
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#define size 10
2.主函数
int main()
{
printf("游戏开始!!!!\n");
int i,j;
int judge=1;
//1.种雷
int leipan[size][size];
mailei(leipan);
//2.盖布,将10*10的雷盘蒙上‘-’的布 ‘-’代表无雷,‘*’代表有雷);
char gaibu[size][size];
for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
gaibu[i][j]='-';
printf("%c ",gaibu[i][j]);
if(j==size-1)
printf("\n");
}
//3.选择位置
while(judge)
{
printf("请输入将点开的图标位置!\n");
printf("选择标记'o'与探索 标记:1,探索:2\n");
int x,y;
int chose;
scanf("%d %d %d",&x,&y,&chose);
if(chose==1)
{
biaoji(leipan,gaibu,x-1,y-1);
for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
printf("%c ",gaibu[i][j]);
if(j==size-1)
printf("\n");
}
if(biaoji(leipan,gaibu,x-1,y-1))
{
printf("You are so NB!!!!!!!\n");
judge=0;
}
}
else if(chose==2)
{
tansuo(leipan,gaibu,x-1,y-1);
for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
printf("%c ",gaibu[i][j]);
if(j==size-1)
printf("\n");
}
if(gaibu[x-1][y-1]=='*')
{
printf("你tmd真菜!!!\n");
judge=0;
}
}
else
{
printf("error!!!!\n");
}
for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
printf("%d ",leipan[i][j]);
if(j==size-1)
printf("\n");
}
}
return 0;
}
主函数比较简单,写一个大骨架,比较细节的一点是因为我功能函数写的时候带入的x行y行,而介于平时人们常用的计数方法是1-10,而非0-9,因此函数带入参数为x-1,y-1.
3.埋雷函数
//种雷函数
//在10*10的矩阵上种雷 1为雷 0为无雷
int mailei(int leipan[][size])
{
srand((unsigned)time(NULL));
int count=0;
int i,j;
for(i=0;i<size;i++)
for(j=0;j<size;j++)
leipan[i][j]=0;
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
leipan[i][j]=rand()%2;
if(leipan[i][j])
{
count++;
}
}
}
printf("雷数为%d\n",count);
return leipan;
}
埋雷函数目前有一下需要改进的地方
1.埋雷个数无法确定
2.埋雷个数给定范围值区间的随机数,例如10-20之间随机个数的雷
3.设置难度梯度,以给定不同规格的雷盘大小和地雷个数区间。
4.标记函数
//标记函数
//用符号‘o’来标记
int biaoji(int leipan[][size],char gaibu[][size],int x,int y)
{
int i,j;
int count=0,num=0;
gaibu[x][y]='o';
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
if(leipan[i][j]==1)
num++;
if(gaibu[i][j]=='o'&&leipan[i][j]==1)
count++;
}
}
if(num==count)
return 1;
else
return 0;
}
5.探索函数
void tansuo(int leipan[][size],char gaibu[][size],int x,int y)
{
int i,j;
int sum=0;
char Sum;
if(x>=1&&x<=size-2&&y>=1&&y<=size-2)
{
for(i=x-1;i<=x+1;i++)
for(j=y-1;j<=y+1;j++)
{
sum+=leipan[i][j];
}
Sum=sum+48;
if(leipan[x][y])
gaibu[x][y]='*';
else if(!leipan[x][y]&&sum)
gaibu[x][y]=Sum;
else
{
gaibu[x][y]='0';
if(gaibu[x-1][y-1]=='-')
tansuo(leipan,gaibu,x-1,y-1);
if(gaibu[x][y-1]=='-')
tansuo(leipan,gaibu,x,y-1);
if(gaibu[x+1][y-1]=='-')
tansuo(leipan,gaibu,x+1,y-1);
if(gaibu[x-1][y]=='-')
tansuo(leipan,gaibu,x-1,y);
if(gaibu[x+1][y]=='-')
tansuo(leipan,gaibu,x+1,y);
if(gaibu[x-1][y+1]=='-')
tansuo(leipan,gaibu,x-1,y+1);
if(gaibu[x][y+1]=='-')
tansuo(leipan,gaibu,x,y+1);
if(gaibu[x+1][y+1]=='-')
tansuo(leipan,gaibu,x+1,y+1);
}
}
else if(x==0)
{
if(y==0)
{
for(i=x;i<=x+1;i++)
for(j=y;j<=y+1;j++)
{
sum+=leipan[i][j];
}
Sum=sum+48;
if(leipan[x][y])
gaibu[x][y]='*';
else if(!leipan[x][y]&&sum)
gaibu[x][y]=Sum;
else
{
gaibu[x][y]='0';
if(gaibu[x+1][y]=='-')
tansuo(leipan,gaibu,x+1,y);
if(gaibu[x+1][y+1]=='-')
tansuo(leipan,gaibu,x+1,y+1);
if(gaibu[x][y+1]=='-')
tansuo(leipan,gaibu,x,y+1);
}
}
else if(y==size-1)
{
for(i=x;i<=x+1;i++)
for(j=y-1;j<=y;j++)
{
sum+=leipan[i][j];
}
Sum=sum+48;
if(leipan[x][y])
gaibu[x][y]='*';
else if(!leipan[x][y]&&sum)
gaibu[x][y]=Sum;
else
{
gaibu[x][y]='0';
if(gaibu[x][y-1]=='-')
tansuo(leipan,gaibu,x,y-1);
if(gaibu[x+1][y-1]=='-')
tansuo(leipan,gaibu,x+1,y-1);
if(gaibu[x+1][y]=='-')
tansuo(leipan,gaibu,x+1,y);
}
}
else
{
for(i=x;i<=x+1;i++)
for(j=y-1;j<=y+1;j++)
{
sum+=leipan[i][j];
}
Sum=sum+48;
if(leipan[x][y])
gaibu[x][y]='*';
else if(!leipan[x][y]&&sum)
gaibu[x][y]=Sum;
else
{
gaibu[x][y]='0';
if(gaibu[x][y-1]=='-')
tansuo(leipan,gaibu,x,y-1);
if(gaibu[x][y+1]=='-')
tansuo(leipan,gaibu,x,y+1);
if(gaibu[x+1][y+1]=='-')
tansuo(leipan,gaibu,x+1,y+1);
if(gaibu[x+1][y]=='-')
tansuo(leipan,gaibu,x+1,y);
if(gaibu[x+1][y-1]=='-')
tansuo(leipan,gaibu,x+1,y-1);
}
}
}
else if(x==size-1)
{
if(y==0)
{
for(i=x;i>=x-1;i--)
for(j=y;j<=y+1;j++)
{
sum+=leipan[i][j];
}
Sum=sum+48;
if(leipan[x][y])
gaibu[x][y]='*';
else if(!leipan[x][y]&&sum)
gaibu[x][y]=Sum;
else
{
gaibu[x][y]='0';
if(gaibu[x][y+1]=='-')
tansuo(leipan,gaibu,x,y+1);
if(gaibu[x-1][y+1]=='-')
tansuo(leipan,gaibu,x-1,y+1);
if(gaibu[x-1][y]=='-')
tansuo(leipan,gaibu,x-1,y);
}
}
else if(y==size-1)
{
for(i=x;i>=x-1;i--)
for(j=y;j>=y-1;j--)
{
sum+=leipan[i][j];
}
Sum=sum+48;
if(leipan[x][y])
gaibu[x][y]='*';
else if(!leipan[x][y]&&sum)
gaibu[x][y]=Sum;
else
{
gaibu[x][y]='0';
if(gaibu[x-1][y-1]=='-')
tansuo(leipan,gaibu,x-1,y-1);
if(gaibu[x-1][y]=='-')
tansuo(leipan,gaibu,x-1,y);
if(gaibu[x][y-1]=='-')
tansuo(leipan,gaibu,x,y-1);
}
}
else
{
for(i=x;i>=x-1;i--)
for(j=y-1;j<=y+1;j++)
{
sum+=leipan[i][j];
}
Sum=sum+48;
if(leipan[x][y])
gaibu[x][y]='*';
else if(!leipan[x][y]&&sum)
gaibu[x][y]=Sum;
else
{
gaibu[x][y]='0';
if(gaibu[x][y-1]=='-')
tansuo(leipan,gaibu,x,y-1);
if(gaibu[x][y+1]=='-')
tansuo(leipan,gaibu,x,y+1);
if(gaibu[x-1][y+1]=='-')
tansuo(leipan,gaibu,x-1,y+1);
if(gaibu[x-1][y]=='-')
tansuo(leipan,gaibu,x-1,y);
if(gaibu[x-1][y-1]=='-')
tansuo(leipan,gaibu,x-1,y-1);
}
}
}
else if(y==0)
{
for(i=x-1;i<=x+1;i++)
for(j=y;j<=y+1;j++)
{
sum+=leipan[i][j];
}
Sum=sum+48;
if(leipan[x][y])
gaibu[x][y]='*';
else if(!leipan[x][y]&&sum)
gaibu[x][y]=Sum;
else
{
gaibu[x][y]='0';
if(gaibu[x-1][y]=='-')
tansuo(leipan,gaibu,x-1,y);
if(gaibu[x-1][y+1]=='-')
tansuo(leipan,gaibu,x-1,y+1);
if(gaibu[x+1][y+1]=='-')
tansuo(leipan,gaibu,x+1,y+1);
if(gaibu[x+1][y]=='-')
tansuo(leipan,gaibu,x+1,y);
if(gaibu[x][y+1]=='-')
tansuo(leipan,gaibu,x,y+1);
}
}
else if(y==size-1)
{
for(i=x-1;i<=x+1;i++)
for(j=y;j>=y-1;j--)
{
sum+=leipan[i][j];
}
Sum=sum+48;
if(leipan[x][y])
gaibu[x][y]='*';
else if(!leipan[x][y]&&sum)
gaibu[x][y]=Sum;
else
{
gaibu[x][y]='0';
if(gaibu[x-1][y]=='-')
tansuo(leipan,gaibu,x-1,y);
if(gaibu[x-1][y-1]=='-')
tansuo(leipan,gaibu,x-1,y-1);
if(gaibu[x+1][y-1]=='-')
tansuo(leipan,gaibu,x+1,y-1);
if(gaibu[x+1][y]=='-')
tansuo(leipan,gaibu,x+1,y);
if(gaibu[x][y-1]=='-')
tansuo(leipan,gaibu,x,y-1);
}
}
}
探索函数的结构可以简化为
探索x,y是否有雷,有雷则使b数组相应位置修改为‘’,无雷,则修改b数组相应位置相邻位置的地雷数总合,若周围的地雷数为0,则继续探索周围相邻的格。*
代码实现时的细节,也是我debug的一大重头。
1.递归探索时,首先要注意四个角的探索值,当探索中间位置时,注意下标,x-2,y-2为上线,x=1和y=1为下线。
2.递归时加入限制条件,当b[x][y]==’-'时才进行探索,否则会进入无限循环。