C++扫雷设计,环境:windows XP,软件:Codeblocks
@NK_test 名字看起来像 “牛牪犇客”的人。大哥!
学校机房里面莫得有扫雷,自己有想法还没动手。从他那里看到一份扫雷的代码。有几个错误修改下就可以用了。
源码来自NK_test 的《c++ 控制台版 扫雷游戏》,web:https://blog.csdn.net/NK_test/article/details/47030583
十分的感谢!!!!!!!!!!!!!
1.Analyse
等 等 等, 404 not found
扫雷的规则:更多提示在 最全的扫雷技巧和基本规则
Web:https://jingyan.baidu.com/article/7f766daf9231e84101e1d03d.html
源自于windows自带扫雷,基本操作:左键翻开这一格,右键标记地雷,双击左键(或者左右键一起点)可以看到这个数字的可点击范围,你点出了一个数字,是1,就说明它周围的8的格子里有1个雷,是2就有两个雷,是3就有三个雷···以此类推。如果你把数字周围的雷全扫出后还有空格,不必再一格一格翻开,直接双击左键就可以了。但如果你标记错了雷,那就会"boom!"一切重新开始。我们的需要手动输入坐标。如0 0----- 9 9
2.Code Print
// 扫雷程序
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <cstring>
#include <ctime>
#include <cmath>
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;
}
3.End
没办法截图,第一次玩游戏就只有数字记录了。
这个源码不是我写的,NK_test大哥,我只是拿来转载,参考,大哥以后靠你了!!!!!!!!!!!!!!!!!!!!!
0000002*20
0111002*20
01*2101121
01**10001*
12*2100011
***1000000
1211000000
0000000122
00000001**
00000001** 玩这个的背景是这样的,终于用眼睛和纸笔,(我不会告诉你们,“您中雷了”)
在ACM吧看到的,悠悠地方wan了