C++扫雷游戏

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C++扫雷游戏

NK_test   2022-06-03 我要评论

先说思路,其实挺简单的。

(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;
} 

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们