c++ 控制台版 扫雷游戏

来源:互联网 发布:spark hbase性能优化 编辑:程序博客网 时间:2024/06/10 17:32

白天看了一天书看累了,晚上瞅见扫雷游戏,就自己琢磨着做一个呗。想了一会,也没看别人怎么做的,大概1个多小时完成了这个简单版本的扫雷游戏,由于没怎么学过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;} 


1 0
原创粉丝点击