c语言随机迷宫自动寻路,[原创]C语言随机迷宫代码后续版本,交流学习,勿喷。。。...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

if(dq==0)

{

h[g][0]=x;

h[g][1]=y;

h[g][2]=i;

find(x+c[i][0],y+c[i][1],g+1);

}

}

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==104) return Help; //Help

if(c!=-32)return Else;

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 i,j,c; //用来接收按键

gotoxy(2*y-2,x-1);

printf("☆"); //画出玩家当前位置

while(1)

{

if(kbhit()) //判断是否有按键

{

c=get_key();

if(c==Esc)

{

gotoxy(0,Height+1);

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;

case Help: //帮助,自动生成路线,但路线会被恶魔吃掉

{

if(z)

{

dq=0;

memset(l,0,sizeof(l));

find(x,y,0);

}

help(z=1-z);

}

break;

default : ;

}

gotoxy(2*y-2,x-1);

printf("☆"); //画出玩家当前位置

if(map[x][y]==End) //判断是否到达出口

{

gotoxy(1,Height+1);

printf("到达终点,按任意键结束 ");

getch();

break;

}

}

else

{

j=0;

for(i=0;i

if(x==dev[dd][i][0]&&y==dev[dd][i][1])

{

j=1;break;

}

if(j)

{

gotoxy(1,Height+1);

printf("悲剧!你被恶魔吃掉了! 按任意键结束");

getch();

break;

}

devil();

}

}}

int main()

{

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

for(i=0;i

{

do

{

dev[0][i][0]=rand()%Height+1;

dev[0][i][1]=rand()%Width+1;

}

while(map[dev[0][i][0]][dev[0][i][1]]!=Road);

}

gotoxy(1,Height+1);

printf("Author fpcdq 可按h键获得帮助");

game(); //开始游戏

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值