C++控制台版扫雷游戏

Faye ·
更新时间:2024-11-13
· 637 次阅读

本文实例为大家分享了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; } 



c+ C++ 控制台

需要 登录 后方可回复, 如果你还没有账号请 注册新账号