Shelyin 2021-12-30 16:35 采纳率: 100%
浏览 152
已结题

C++老鼠走迷宫游戏编程

设计一个老鼠走迷宫的模拟程序,其中包括老鼠类,地图类,物品类,其中物品类分为增益物品和减益物品,增益物品可以增加血量,减益物品减少血量。地图是一个一个小格子组成的,老鼠一次走一个小格子,初始血量为100,血量上限为100,地图上定义出口,开始时老鼠处于迷宫中心位置,迷宫格子中有随机生成的碍物,障碍物不允许通行。迷宫只有一个出口,每个格子子上有增益物品或者减益物品,当老鼠血量大于等于0且到达用口格子到,游戏胜利:否则游戏失败,假设老鼠移动一格血量自然减1,请编程实现该模拟过程

  • 写回答

2条回答 默认 最新

  • 爱音斯坦牛 全栈领域优质创作者 2021-12-30 17:54
    关注
    
    #include<iostream>
    #include<getch.h>
    #include<stdlib.h>
    #include <time.h>
    using namespace std;
    time_t tstart;
    //设置迷宫结构
    struct Maze
    {
    private:
        //地图
        char map[15][15];
        //空位置数量
        int space; 
        //入口位置
        char in_x,in_y;
        //出口位置
        char out_x,out_y;
        //坐标
        char x,y;
        //老鼠位置
        char m_x,m_y;
        int success;
        //......
        //构造地图
        void create_map(void)
        {
            srand(time(NULL));
            //在地图中全部填#
            for(int i=0;i<15;i++)
            {
                for(int j=0;j<15;j++)
                {
                    map[i][j]='#';
                }
            }
            //设置出口、入口
            for(int i=0;i<space;)
            {
                x=rand()%13+1;
                y=rand()%13+1;
                if(map[x][y]=='#')
                {
                    map[x][y]=' ';
                    i++;
                }
                
                
            }
     
            map[in_x][in_y]='@';
            
        
            
            if(map[out_x][out_y]!=' ')
            {
                map[out_x][out_y]=' ';
            }
            
        }
        //检查地图是否可以走出
        int check_map(int i,int j)
        {
            //参考经典算法大全
            map[i][j]='@';        
            if(i == out_x && j ==out_y )
            {
                success = 1;
            }
            if(success != 1 && map[i][j+1] == ' ') check_map(i, j+1);
            if(success != 1 && map[i+1][j] == ' ') check_map(i+1, j);
            if(success != 1 && map[i][j-1] == ' ') check_map(i, j-1);
            if(success != 1 && map[i-1][j] == ' ') check_map(i-1, j);
            if(success != 1)
            {
                map[i][j] = ' ';
            }
            return success;
        }
        
    public:
        //构建迷宫
        Maze(char inx,char iny,char outx,char outy,int _space)
        {
            //使用构造函数的参数对成员初始化
            in_x=m_x=inx;
            in_y=m_y=iny;
            out_x=outx;
            out_y=outy;
            space=_space;
            while(1)
            {
                //构造地图
                create_map();
                //检查地图是否可以走出
                success=0;
                if(check_map(in_x,in_y)==1)
                {    
                    break;
                }
            }
            for (int i = 0; i < 15; ++i)
            {
                for(int j=0;j<15;j++)
                {
                    if(map[i][j]=='@')
                    {
                        map[i][j]=' ';
                    }
                }
            }
            map[in_x][in_y]='@';
            tstart=time(NULL);
        }
        //显示迷宫
        void show(void)
        {
            system("clear");
            //printf("\33[2J");
            for(int i=0;i<15;i++)
            {
                for(int j=0;j<15;j++)
                {
                    cout<<map[i][j]<<' ';
                }
                cout<<endl;
            }
        }
        //老鼠向上
        void up(void)
        {
            if(map[m_x-1][m_y]==' ')
            {
                map[m_x-1][m_y]='@';
                map[m_x][m_y]=' ';
                m_x-=1;
            }
            else 
            {
                return;
            }
        }
        //老鼠向下
        void down(void)
        {
            if(map[m_x+1][m_y]==' ')
            {
                map[m_x+1][m_y]='@';
                map[m_x][m_y]=' ';
                m_x+=1;
            }
            else 
            {
                return;
            }
        }
        //向右
        void right(void)
        {
            if(map[m_x][m_y+1]==' '&&m_y<=14)
            {
                map[m_x][m_y+1]='@';
                map[m_x][m_y]=' ';
                m_y+=1;
            }
            else 
            {
                return;
            }
        }
        //向左
        void left(void)
        {
            if(map[m_x][m_y-1]==' '&&m_y>=1)
            {
                map[m_x][m_y-1]='@';
                map[m_x][m_y]=' ';
                m_y-=1;
            }
            else 
            {
                return;
            }
        }
        //检查是否到达出口
        bool check(void)
        {
            if(m_x==out_x&&m_y==out_y)
            {
                return true;
            }
            return false;
        }
    };
     
    int main()
    {
        //创建迷宫对象
        Maze maze(1,1,14,13,140);
     
        while(1)
        {
            //检查是否走通
            if(maze.check())
            {
                maze.show();
                time_t tend=time(NULL);
                cout<<"逃出迷宫!用时"<<tend-tstart<<"秒!"<<endl;
                break;
            }
            //显示地图
            maze.show();
            
            switch(getch())
            {
                case 183:maze.up();break;
                case 184:maze.down();break;
                case 185:maze.right();break;
                case 186:maze.left();break;
            }
        }
    }
    

    有帮助的话采纳一下哦!谢谢!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 已采纳回答 1月7日
  • 创建了问题 12月30日

悬赏问题

  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line