本文实例为大家分享了C++控制台版扫雷游戏的具体代码,供大家参考,具体内容如下
先说思路,其实挺简单的。
(1) 随机生成10个雷,标记到二维数组里,然后计算八个方向的雷的总数记录下来,这是预处理阶段。
(2)输入要翻开的位置的坐标,如果是数字直接显示,是空白的话,这里采用bfs即宽度优先搜索解决,搜到最外层是数字(仅一层)时结束,具体详见代码。
// 扫雷程序
#include <iostream>
#include <string>
#include <queue>
#include <cstring>
#include <ctime>
using namespace std;
int grid[100][100];
int randMark[100][100];
char showUs[100][100];
int vis[100][100];
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};//方向数组
int res;
struct node
{
int x;
int y;
};
void bfs(int nx,int ny) //处理点击空白
{
queue <node> q;
node temp;
node t;
t.x=nx,t.y=ny;
q.push(t);
vis[nx][ny]=1;
while(!q.empty())
{
res++;
temp=q.front();
showUs[temp.x][temp.y]=grid[temp.x][temp.y]+'0';
q.pop();
for(int i=0;i<8;i++)
{
int xx=temp.x+dir[i][0];
int yy=temp.y+dir[i][1];
if(xx>=0&&xx<10&&yy>=0&&yy<10)
{
if(!vis[xx][yy]&&grid[xx][yy]==0)
{
t.x=xx,t.y=yy;
vis[xx][yy]=1;
showUs[xx][yy]=grid[xx][yy]+'0';
q.push(t);
}
if(!vis[xx][yy]&&grid[xx][yy]>0&&grid[temp.x][temp.y]==0)
{
t.x=xx,t.y=yy;
vis[xx][yy]=1;
showUs[xx][yy]=grid[xx][yy]+'0';
q.push(t);
}
}
}
}
}
int main()
{
memset(grid,0,sizeof(grid));
memset(randMark,0,sizeof(randMark));
memset(vis,0,sizeof(vis));
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
showUs[i][j]='*';
srand(unsigned(time(NULL)));
int sum=0;
while(1)
{
int x=rand()%10;
int y=rand()%10;
if(randMark[x][y]!=1)
{
randMark[x][y]=1;//有雷
sum++;
}
if(sum==10)
break;
}
res=0;
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
if(randMark[i][j])
grid[i][j]=-1;
}
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
if(grid[i][j]!=-1)
{
for(int k=0;k<8;k++)
{
int x=i+dir[k][0];
int y=j+dir[k][1];
if(x>=0&&x<10&&y>=0&&y<10&&grid[x][y]==-1)
{
grid[i][j]++;
}
}
}
}
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
cout<<showUs[i][j]<<" ";
cout<<endl;
}
cout<<"请输入要翻开的位置的坐标:"<<endl;
int x,y;
while(1)
{
if(res==90)
cout<<"恭喜您胜利啦,排雷成功!"<<endl;
cin>>x>>y;
if(grid[x][y]==-1)
{
cout<<"您中雷啦!"<<endl;
break;
}
else if(!vis[x][y]&&grid[x][y]>0)
{
res++;
vis[x][y]=1;
showUs[x][y]=grid[x][y]+'0';
system("cls");
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
cout<<showUs[i][j]<<" ";
cout<<endl;
}
cout<<"请输入要翻开的位置的坐标:"<<endl;
}
else if(!vis[x][y]&&grid[x][y]==0)
{
bfs(x,y);
system("cls");
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
cout<<showUs[i][j]<<" ";
cout<<endl;
}
cout<<"请输入要翻开的位置的坐标:"<<endl;
}
}
return 0;
}