数据结构设计--扫雷+玩转迷宫

目录

一、扫雷

二、玩转迷宫


一、扫雷

1.编译器:vs code

2.语言:c++

3.实现的功能

可以随机生成扫雷模式的图,每次玩家可以选择一个模式:

(1).随机模式:最多50*50个格子,最多1000个雷;

(2).简单模式:5*5的地图,一共10个雷;

(3).中等模式:10*10的地图,一共30个雷;

(4).地狱模式:20*20的地图,一共200个雷;

4.用到的算法:bfs+偏移量

5.代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
using namespace std;
const int N=1000;

char g[N][N];
int a[N][N];
int st[N][N];

void init(int n,int m)//初始化
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            g[i][j]='?';
}

void print(int n,int m)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cout<<g[i][j]<<" ";
        }
        puts("");
    }
}

void menu()
{
    cout<<"***********欢迎来到扫雷小游戏***********"<<endl;
    cout<<"***********1.随机模式       ***********"<<endl;
    cout<<"***********2.简单模式       ***********"<<endl;
    cout<<"***********3.中等模式       ***********"<<endl;
    cout<<"***********4.地狱模式       ***********"<<endl;
    cout<<"***********5.游戏说明       ***********"<<endl;
}


void game(int op)
{
    int n,m,q;
    srand(time(0));//设置随机种子 
    if(op==1) //随机模式,随缘匹配,最多50*50个格子,最多1000个雷
    {
        n=rand()%50+1;
        m=rand()%50+1;
        q=rand()%1000+1;
    }
    else if(op==2) n=5,m=5,q=10;//简单模式,5*5的地图,一共10个雷
    else if(op==3) n=10,m=10,q=30;//中等模式,10*10的地图,一共30个雷
    else if(op==4) n=20,m=20,q=200;//地狱模式,20*20的地图,一共200个雷
    init(n,m);

    //生成随机的雷的坐标
    memset(st,0,sizeof st);
    for(int i=1;i<=q;i++) //q代表生成雷的个数
    {
        int x=rand()%n+1;
        int y=rand()%m+1;
        st[x][y]=1;
    }

    //对每个位置上进行提示
    memset(a,0,sizeof a);
    int dx[8]={-1,-1,0,1,1,1,0,-1};
    int dy[8]={0,1,1,1,0,-1,-1,-1};
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int l,r;
            for(int k=0;k<8;k++)
            {
                l=i+dx[k],r=j+dy[k];
                if(l>=1&&l<=n&&r>=1&&r<=m&&st[l][r]==1) a[i][j]++;
            }
        }
    }
    int res=0;//判断是否扫完所有的雷
    //游戏开始时的操作 
    while(1)
    {
        print(n,m);
        int X,Y;
        cout<<"请您选择一个坐标(中间用空格隔开):";
        cin>>X>>Y;
        system("cls");
        if(st[X][Y]==1) //如果是雷的话
        {
            //显示所有的雷存在的位置
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    if(st[i][j]==1) cout<<"Q"<<" ";
                    else cout<<g[i][j]<<" ";
                }
                puts("");
            }
            cout<<"很抱歉,您踩中了雷!"<<endl;
            Sleep(10000);//延时10s
            system("cls");
            return ;
        }
        else//如果该位置不是雷
        {
            g[X][Y]=a[X][Y]+'0';
            res++;
        }
        if(res==q)
        {
            cout<<"恭喜您挑战成功!"<<endl;
            return ;
        }
    }
    return ;
}
void pre()
{
    cout<<"请自觉安排游戏时间,抵制长期不良游戏!"<<endl;
    cout<<"本游戏分为4中不同的模式,下面是各个模式的说明:"<<endl;
    cout<<"随机模式:最多50*50个格子,最多1000个雷"<<endl;
    cout<<"简单模式:5*5的地图,一共10个雷"<<endl;
    cout<<"中等模式:10*10的地图,一共30个雷"<<endl;
    cout<<"地狱模式:20*20的地图,一共200个雷"<<endl;
    cout<<"祝您生活愉快!----------张先生"<<endl;
}
int main()
{
    while(1)
    {
         menu();
         int op;
         cout<<"请您选择一个模式:";
         cin>>op;
         if(op==1) game(1);
         else if(op==2) game(2);
         else if(op==3) game(3);
         else if(op==4) game(4);
         else pre(); 
    }
    return 0;
}

6.运行结果

界面

测试界面

二、玩转迷宫

  1. 环境:vs code
  2. 语言:c++
  3. 算法:bfs+dfs+迷宫知识
  4. 游戏要求

(1)玩家可以选择自己走动,每次走动都会有一定的积分

(2)当玩家寻求帮助的时候,应该给出迷宫的最短的那条路径

(3)玩家可以自行判断迷宫的合法性

(4)游戏采用循环制度

(5)自觉安排游戏时间

5.代码

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
using namespace std;
const int N=1100;
typedef pair<int,int> PII;

char g[N][N];
int st[N][N];
int vis[N][N];
int n,m,op;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int flag;
int a;

void create(int count,int n,int m)
{
    memset(vis,0,sizeof vis);
    memset(st,0,sizeof st);
    memset(g,0,sizeof g);
    srand(time(0));
    for(int i=1;i<=count;i++)
    {
        int x,y;
        x=rand()%n+1;
        y=rand()%m+1;
        vis[x][y]=1;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(vis[i][j]==0) g[i][j]='.';
            else g[i][j]='#';
}

void menu()
{
    cout<<"*********************"<<endl;
    cout<<"***欢迎来到迷宫探索**"<<endl;
    cout<<"1.创建一个5 * 5的地图"<<endl;
    cout<<"2.创建一个10*10的地图"<<endl;
    cout<<"3.创建一个20*20的地图"<<endl;
    cout<<"*********************"<<endl;
}

void print()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cout<<g[i][j]<<" ";
        }
        puts("");
    }
}

void dfs(int x,int y)
{
    if(x==n&&y==m) flag=1;
    st[x][y]=1;
    for(int i=0;i<4;i++)
    {
        int l=x+dx[i],r=y+dy[i];
        if(l>=1&&l<=n&&r>=1&&r<=m&&!st[l][r]&&g[l][r]!='#')
        {
            dfs(l,r);
        }
    }
}

void bfs(int l,int r)
{
    memset(st,0,sizeof st);
    PII q[100],pre[100][100];
    int hh=0,tt=-1;
    q[++tt]={l,r};
    st[l][r]=1;
    while(hh<=tt)
    {
        auto t=q[hh++];
        for(int i=0;i<4;i++)
        {
            int x=t.first+dx[i],y=t.second+dy[i];
            if(x>=1&&x<=n&&y>=1&&y<=m&&!st[x][y]&&!vis[x][y])
            {
                pre[x][y]=t;
                q[++tt]={x,y};
                st[x][y]=1;
                if(x==n&&y==m) flag=1;
            }
        }
    }
    if(!flag) 
    {
        puts("迷宫不合法,请重新生成!");
        system("pause");
        system("cls");
        return ;
    }
    int x=n,y=m;
    hh=0,tt=-1;
    while(1)
    {
        if(x==1&&y==1) break;
        q[++tt]={x,y};
        auto t=pre[x][y];
        x=t.first,y=t.second;
    }
    print();
    system("pause");
    system("cls");
    g[l][r]='.';
    for(int i=tt;i>=0;i--)
    {
        auto t=q[i];
        x=t.first,y=t.second;
        g[x][y]='@';
        print();
        system("pause");
        system("cls");
        puts("");
        g[x][y]='.';
    }
}

void game(int op)
{
    srand(time(0));
    int count;
    if(op==1) n=5,m=5,count=12;
    else if(op==2) n=10,m=10,count=50;
    else if(op==3) n=20,m=20,count=150;
    flag=0;
    create(count,n,m);
    dfs(1,1);
    puts("迷宫正在生成中,请您耐心等待...");
    while(1)
    {
        if(flag&&g[1][1]=='.'&&g[n][m]=='.') break;
        create(count,n,m);
        dfs(1,1);
    }
    int x=1,y=1,ans=0;
    g[1][1]='@';
    while(1)
    {
        print();
        if(x==n&&y==m)
        {
            printf("挑战成功!您的分数是%d",ans);
            return ;
        }
        char q;
        cout<<"是否寻求帮助?(y/n):";
        cin>>q;
        if(q=='y'||q=='Y')
        {
            flag=0;
            bfs(x,y);
            return ;
        }
        else 
        {
            int l=x,r=y;
            cout<<"请输入一个坐标:";
            cin>>x>>y;
            while(vis[x][y])
            {
                cout<<"该坐标是墙,请重新输入:";
                cin>>x>>y;
            }
            ans++;
            g[l][r]='.';
            g[x][y]='@';
        }
    }
}

int main()
{
    while(1)
    {
        menu();
        int op;
        cin>>op;
        switch (op)
        {
            case 1:game(op);break;
            case 2:game(op);break;
            case 3:game(op);break;
            default:cout<<"序号错误!"<<endl;break;
        }
    }
    return 0;
}

6.桌面效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值