C++控制台版扫雷游戏

 更新时间:2022年05月07日 11:22:14   作者:NK_test  
这篇文章主要为大家详细介绍了C++控制台版扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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++智能指针weak_ptr的作用详解

    C++智能指针weak_ptr的作用详解

    weak_ptr是一个智能指针,也是一个类模板,本文主要介绍了C++智能指针weak_ptr的作用详解,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • C++ 中CloseHandle 函数--关闭一个句柄

    C++ 中CloseHandle 函数--关闭一个句柄

    这篇文章主要介绍了C++ 中CloseHandle 函数--关闭一个句柄的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++二叉搜索树模拟实现示例

    C++二叉搜索树模拟实现示例

    本文主要介绍了C++二叉搜索树模拟实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • C++ STL list 遍历删除出错解决方案

    C++ STL list 遍历删除出错解决方案

    这篇文章主要介绍了C++ STL list 遍历删除出错解决方案的相关资料,这里对出错进行分析,并给出正确的解决方法,需要的朋友可以参考下
    2016-12-12
  • C语言实现随机抽取纸牌

    C语言实现随机抽取纸牌

    这篇文章主要为大家详细介绍了C语言实现随机抽取纸牌,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • opencv3/C++关于移动对象的轮廓的跟踪详解

    opencv3/C++关于移动对象的轮廓的跟踪详解

    今天小编就为大家分享一篇opencv3/C++关于移动对象的轮廓的跟踪详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 使用C语言操作树莓派GPIO的详细步骤

    使用C语言操作树莓派GPIO的详细步骤

    今天抽空给大家普及使用C语言操作树莓派GPIO的详细步骤,本文大概分五步给大家介绍树莓派GPIO安装步骤,首先需要安装GPIO库然后进行一步步设置,具体操作方法跟随小编一起学习吧
    2021-06-06
  • C++ OpenCV学习之图像金字塔与图像融合详解

    C++ OpenCV学习之图像金字塔与图像融合详解

    图像金字塔分为两种:高斯金字塔和拉普拉斯金字塔。图像金字塔在保持细节的条件下进行图像融合等多尺度编辑操作非常有用。本文将利用图像金字塔实现图像融合,需要的可以参考一下
    2022-03-03
  • C++实践数组类运算的实现参考

    C++实践数组类运算的实现参考

    今天小编就为大家分享一篇关于C++实践数组类运算的实现参考,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 关于在C程序中处理UTF-8文本的方法详解

    关于在C程序中处理UTF-8文本的方法详解

    这篇文章主要给大家介绍了关于在C程序中处理UTF-8文本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-11-11

最新评论