• C_数据结构_走迷宫


    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
    #include <time.h> 
    #define Height 25 //迷宫的高度,必须为奇数
    #define Width 25 //迷宫的宽度,必须为奇数
    #define Wall 1
    #define Road 0
    #define Start 2
    #define End 3
    #define Esc 5
    #define Up 1
    #define Down 2
    #define Left 3
    #define Right 4
    
    int map[Height+2][Width+2];
    void gotoxy(int x,int y) //移动坐标
    {
        COORD coord;
        coord.X=x;
        coord.Y=y;
        SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
    }
    void hidden()//隐藏光标
    {
        HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_CURSOR_INFO cci;
        GetConsoleCursorInfo(hOut,&cci);
        cci.bVisible=0;//赋1为显示,赋0为隐藏
        SetConsoleCursorInfo(hOut,&cci);
    }
    void create(int x,int y) //随机生成迷宫
    {
        int c[4][2]={0,1,1,0,0,-1,-1,0}; //四个方向
        int i,j,t;
            //将方向打乱
        for(i=0;i<4;i++)
        {
            j=rand()%4;
            t=c[i][0];c[i][0]=c[j][0];c[j][0]=t;
            t=c[i][1];c[i][1]=c[j][1];c[j][1]=t;
        }
        map[x][y]=Road;
        for(i=0;i<4;i++)
        if(map[x+2*c[i][0]][y+2*c[i][1]]==Wall)
        {
            map[x+c[i][0]][y+c[i][1]]=Road;
            create(x+2*c[i][0],y+2*c[i][1]);
        }
    }
    int get_key() //接收按键
    {
        char c;
        while(c=getch())
        {
            if(c==27) return Esc; //Esc
            if(c!=-32)continue;
            c=getch();
            if(c==72) return Up; //
            if(c==80) return Down; //
            if(c==75) return Left; //
            if(c==77) return Right; //
        }
        return 0;
    }
    void paint(int x,int y) //画迷宫
    {
        gotoxy(2*y-2,x-1);
        switch(map[x][y])
        {
            case Start:
            printf("");break; //画入口
            case End:
            printf("");break; //画出口
            case Wall:
            printf("");break; //画墙
            case Road:
            printf(" ");break; //画路
        }
    }
    void game()
    {
        int x=2,y=1; //玩家当前位置,刚开始在入口处
        int c; //用来接收按键
        while(1)
        {
            gotoxy(2*y-2,x-1);
            printf(""); //画出玩家当前位置
            if(map[x][y]==End) //判断是否到达出口
            {
                gotoxy(30,24);
                printf("到达终点,按任意键结束");
                getch();
                break;
            }
            c=get_key();
            if(c==Esc)
            {
                gotoxy(0,24);
                break;
            }
            switch(c)
            {
                    case Up: //向上走
                    if(map[x-1][y]!=Wall)
                    {
                        paint(x,y);
                        x--;
                    }
                break;
                case Down: //向下走
                if(map[x+1][y]!=Wall)
                {
                    paint(x,y);
                    x++;
                }
                break;
                case Left: //向左走
                if(map[x][y-1]!=Wall)
                {
                    paint(x,y);
                    y--;
                }
                break;
                case Right: //向右走
                if(map[x][y+1]!=Wall)
                {
                    paint(x,y);
                    y++;
                }
                break;
            }
        }
    }
    int main()
    {
        system("title yourname");
        int i,j;
        srand((unsigned)time(NULL)); //初始化随即种子
        hidden(); //隐藏光标
        for(i=0;i<=Height+1;i++)
        for(j=0;j<=Width+1;j++)
        if(i==0||i==Height+1||j==0||j==Width+1) //初始化迷宫
        map[i][j]=Road;
        else map[i][j]=Wall;
    
        create(2*(rand()%(Height/2)+1),2*(rand()%(Width/2)+1)); //从随机一个点开始生成迷宫,该点行列都为偶数
        for(i=0;i<=Height+1;i++) //边界处理 
        {
            map[i][0]=Wall;
            map[i][Width+1]=Wall;
        }
    
        for(j=0;j<=Width+1;j++) //边界处理
        {
            map[0][j]=Wall;
            map[Height+1][j]=Wall;
        }
        map[2][1]=Start; //给定入口
        map[Height-1][Width]=End; //给定出口
        for(i=1;i<=Height;i++)
        for(j=1;j<=Width;j++) //画出迷宫
        paint(i,j);
        game(); //开始游戏
        getch();
        return 0;
    }
  • 相关阅读:
    margin折叠及hasLayout && Block Formatting Contexts
    视口(viewport)原理详解之第二部分(移动端浏览器)
    Git & SSH
    .NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行为不一致问题及解决办法
    阿里云函数计算 .NET Core 初体验
    Oracle PLSQL 存储过程无法进入单步调试
    解释器错误:没有那个文件或目录
    不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。
    Oracle 11G R2 安装图解
    Oracle UTL_HTTP
  • 原文地址:https://www.cnblogs.com/LXL616/p/10662581.html
Copyright © 2020-2023  润新知