扫雷是一款比较常见的智力游戏,游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。今天我们的目标是做一个扫雷小游戏。
void intt(){
srand(time(NULL));
for(int i=0;i<maxn+5;i++)
for(int j=0;j<maxm+5;j++)
square[i][j]=9;
memset(flag,true,sizeof(flag));
int xx=rand() % maxn+1;
int yy=rand() % maxm+1;
int num=1;
while(num<=99)
{
while(square[xx][yy]==-1||xx==xxx&&yy==yyy)
{
xx=rand()%maxn+1;
yy=rand()%maxm+1;
}
square[xx][yy]=-1;
num++;
}
for(int i=1;i<=maxn;i++)
for(int j=1;j<=maxm;j++)
if(square[i][j]!=-1) square[i][j]=count_num(i,j);
}
首先是初始化雷,这里初始化的计数是99,虽然雷的随机的,但是不运行在相同的地方埋雷,所以需要再检查一遍这个地方是否已经有雷了。
int count_num(int x,int y)
{
int sum=0;
for(int i=x-1;i<=x+1;i++)
for(int j=y-1;j<=y+1;j++)
if (square[i][j]==-1) sum++;
return sum;
}
这是用于数雷的,记录周围一共有多少个雷。如果没有那就返回0,如果有多少个,那就返回多少个。
void dfs(int x,int y){
flag[x][y]=false;
if(square[x][y]==-1) gameover=false;
if(!gameover) return;
if(square[x][y]!=0) return;
for(int i=0;i<8;i++)
{
int now_x=move_x[i]+x;
int now_y=move_y[i]+y;
if(square[now_x][now_y]!=0){
flag[now_x][now_y]=false;
}
}
for(int i=0;i<4;i++)
{
int now_x=move_x[i]+x;
int now_y=move_y[i]+y;
if(flag[now_x][now_y]){
flag[now_x][now_y]=false;
dfs(now_x,now_y);
}
}
}
这是鼠标点击之后的动作,如果是数字,则直接翻开;如果是空格,则进行搜索。
void display_y(){
for(int i=1;i<=maxn;i++)
{
for(int j=1;j<=maxm;j++)
if(square[i][j]==-1)
{
SetColor(4);
cout<<"* ";
SetColor(15);
}
else if (square[i][j]!=0) cout<<square[i][j]<<" ";else cout<<" ";
cout<<endl;
}
}
最后如果引爆了一个雷,那就把所有的雷都打印出来引爆。
这个扫雷游戏稍微有一点难度,你需要初始化雷,计算雷的个数,点击之后排雷。基本思想就是这样。
有想要学习如何做游戏的,可以关注公众号:诗一样的代码,找我一起学习。