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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++实现扫雷经典小游戏

    用C++复现经典扫雷,供大家参考,具体内容如下 主要是dfs实现打开一片的操作,数字带有颜色,很真实. windows扫雷中鼠标左右键同时按也实现了,即试探. 先上图,详见下面代码: 代码中有详细注释,编译无任何错误警告. Ps.有bug请评论指出,谢谢啦~ 另外我觉得代码比较臃肿,有什么可以优化的也请提出~ #include<cstdio> #include<cstring> #include<algorithm> #include<conio.h> #i

  • C++实现简单扫雷游戏

    扫雷是一个经典的电脑小游戏,用C++来编一下,效果自己试一下 #include<stdio.h> #include<Windows.h> #define YELLOW FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY #define CYAN FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY #define ORANGE FOREGROUND_RED |

  • 利用c++和easyx图形库做一个低配版扫雷游戏

    游戏界面 由于这个游戏是我抱着玩一玩的心态做出来的,所以没有过多的去设计界面,也没有去找游戏的资源(图片.游戏音效等).仅使用了不同颜色的方块来表示游戏中方块的状态和种类.(绿色为初始状态(未翻转的状态),黄色为翻转后的背景颜色,蓝色表示已插旗的方块,红色代表地雷) 图1 游戏主菜单界面 图二 模式一的游戏界面(20*20 40个雷) 图三 模式二的游戏界面(10*10 20个雷) 图四 游戏成功界面 图五 游戏失败界面 2.全部代码 #include<graphics.h> #include

  • C++实现扫雷小游戏(控制台版)

    本文为大家分享了C++实现扫雷小游戏的具体代码,供大家参考,具体内容如下 程序功能: 提供三种模式:初级.中级.高级 操作模式:wsad控制光标移动,空格键打开方块 提供扫雷地图的类 map.h #ifndef MAP_H_ #define MAP_H_ #define MAX_LENGTH 32 //可以提供的地图最大长度 #define MAX_WIDTH 18 //可以提供的地图最大宽度 #define UP_EDGE 1 //上边界 #define DOWN_EDGE _wid //下边

  • C++实现简单的扫雷游戏(控制台版)

    C++新手的代码,请各位多包涵. 用C++写的一个简单的控制台版扫雷游戏.玩家通过输入方块的坐标来翻开方块. 只是一个雏形,能够让玩家执行翻开方块的操作并且判断输赢,还未添加标记方块.游戏菜单.记录游戏时间.重新开一局等等的功能. 玩家输入坐标的方式来翻开方块只适用于小型的"雷区",若"雷区"大了,用坐标会变得很不方便. 代码片段扫雷V1.1 #include<stdio.h> #include<Windows.h> #define YELL

  • C++实现一个扫雷小游戏

    本文实例为大家分享了C++实现扫雷小游戏的具体代码,供大家参考,具体内容如下 目前的版本是0.98版本,可以提出增加新功能意见哦 代码如下: #include<bits/stdc++.h> #include<windows.h> using namespace std; long long int c,dev,m,k,cnt,d,e,jie=10,z,abc,n,b[1000][1000],a[1000][1000],cc,cd,ce,def; //c是随机行,k是随机列 bool

  • C++实现扫雷游戏(控制台不闪屏版)

    之前写了一个C++ 的控制台扫雷小游戏,但由于过度使用system("cls")刷屏,导致闪屏,因此重写了一个改善的不闪屏版本,并把逻辑重新捋了一遍. map.h #ifndef MAP_H_ #define MAP_H_ #define MAX_WID 18 #define MAX_LEN 32 #define UP_EDGE 1 //上边界 #define LEFT_EDGE 1 //左边界 #define RIGHT_EDGE _len //右边界 #define DOWN_ED

  • C++代码实现扫雷游戏

    前言 提示:本文是基于easyX图形库实现的,还有部分功能可以添加,仅适合新手参考. 提示:以下是本篇文章正文内容,下面案例可供参考 一.扫雷游戏模式 在确定大小的矩形雷区中随机布置一定数量的地雷,玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷. 游戏的基本操作包括左键单击和右键单击.其中左键用于打开安全的格子,推进游戏进度:右键用于标记地雷,以辅助判断. 左键单击:在判断出不是雷的方块上按下左键,可以打开该方块.如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个

  • C++学习心得之扫雷游戏

    本文实例为大家分享了C++实现扫雷游戏的具体代码,供大家参考,具体内容如下 一.序言 创建一个9*9有10个雷的扫雷游戏 文章的顺序是按照我当时的编程顺序写的,顺便写下我当初的一点思路,总的代码在文章最后,前面的都是分散的函数,有需要的朋友直接复制最后的 二.创建 创建一个头文件,一个放游戏的程序,一个放运行测试的程序 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdlib.h>//生成随机数 #include<stdio.h> #inc

  • C++扫雷游戏的简单制作

    本文实例为大家分享了C++实现扫雷游戏的具体代码,供大家参考,具体内容如下 #ifndef SAOLEI_H #define SAOLEI_H class Block { friend class Saoleigame; public: Block(); bool isShown(); void setnum(int); int getnum(); bool isbomb(); protected: int num; bool flag_show; int x; int y; }; class

随机推荐