📄 模拟真人走迷宫的程序原代码(原创).htm
字号:
<TD style="FONT-SIZE: 18px" vAlign=bottom align=middle
width="85%" bgColor=#dddddd height=20><STRONG><FONT
color=#003399 size=4><B>模拟真人走迷宫的程序原代码(原创)
</B></FONT></STRONG></TD><BR></TR>
<TR>
<TD align=middle width="100%"><BR></TD></TR>
<TR>
<TD style="FONT-SIZE: 9pt" align=middle
width="100%">发表日期:2004年12月22日 作者:perfect.co 已经有2827位读者读过此文</TD></TR>
<TR>
<TD align=middle width="100%"><!--下面的这一句是设置阅读文本区的宽度-->
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0
cellPadding=0 width="90%" align=center border=0>
<TBODY>
<TR>
<TD align=middle width="100%"></TD></TR>
<TR>
<TD style="WORD-WRAP: break-word"><FONT
class=news><BR>
<P>/*如若转载请征求本人同意*/</P>
<P>/*此程序是我想象一个人实际走迷宫时的真实走法,并无什么确定的算法*/</P>
<P> </P>
<P>#include "graphics.h"<BR>#include
"stdio.h"<BR>#define N 10<BR>#define M
N*N-4+1
/*堆栈最大值,用来保存路口信息*/<BR>#define UP 1<BR>#define DOWN
-1<BR>#define LEFT 2<BR>#define RIGHT
-2<BR>#define UP_M
man.x-1>=0&&a[man.x-1][man.y]
/*人当前位置的上一个位置*/<BR>#define DOWN_M
man.x+1<N&&a[man.x+1][man.y]<BR>#define
LEFT_M
man.y-1>=0&&a[man.x][man.y-1]<BR>#define
RIGHT_M
man.y+1<N&&a[man.x][man.y+1]<BR>#define
ENTER
3
/*岔路的入口*/<BR>#define HAVE
2
/*某条路已经走过*/</P>
<P> struct cross{int up,down,left,right,x,y;}
across,stack[M]={0};<BR>int top=1;<BR>int
PX=70,PY=40;<BR>struct {int x,y,s;}man;</P>
<P>/*迷宫定义,1表示路,可自行更改迷宫的路径,可使全为1,看效果等*/<BR>int
a[N][N]={0,0,0,1,1,0,1,1,1,0,<BR>
1,1,0,1,0,1,1,0,1,0,<BR>
0,1,1,1,1,0,1,1,1,1,<BR>
1,0,1,0,1,1,1,0,1,0,<BR>
1,1,1,1,0,0,1,1,1,1,<BR>
1,0,1,0,1,1,1,0,1,0,<BR>
0,0,1,1,1,0,1,1,1,0,<BR>
1,1,1,0,1,0,1,0,1,0,<BR>
0,0,1,0,1,1,1,0,1,1,<BR>
0,1,1,0,0,1,0,0,0,0};</P>
<P><BR>void
init_man()
/*初始化人的状态,要求迷宫入口须在左侧*/<BR>{int
i;setcolor(WHITE);<BR> for(i=0;i<N;i++)<BR>
if(a[i][0])
{man.x=i;man.y=0;<BR>
if(a[i][1])
man.s=RIGHT;<BR>
else if(i+1<N&&a[i+1][0])
man.s=DOWN;<BR>
else if(i-1>=0&&a[i-1][0])
man.s=UP;<BR>
else {outtextxy(500,300,"no
way!");getch();exit(0);}<BR>
return ;}<BR>if(i==N) {outtextxy(500,300,"no
enter!");getch();exit(0);}<BR>}</P>
<P><BR>void
show_map()
/*显示迷宫*/<BR>{int i,j;</P>
<P> for(i=0;i<N;i++)<BR>
for(j=0;j<N;j++)<BR>
if(a[i][j])
{setfillstyle(1,WHITE);<BR>
bar(PX+j*20,PY+i*20,PX+j*20+20,PY+i*20+20);}<BR>
else
{setfillstyle(1,LIGHTBLUE);<BR>
bar(PX+j*20,PY+i*20,PX+j*20+20,PY+i*20+20);}<BR>setcolor(BLACK);<BR> for(i=0;i<N;i++)<BR>
{line(PX+i*20,PY,PX+i*20,PY+20*N);<BR>
line(PX,PY+i*20,PX+20*N,PY+i*20);}<BR>}</P>
<P>void show_man(int
color)<BR>{<BR> setfillstyle(1,color);<BR> bar(PX+man.y*20+5,PY+man.x*20+5,PX+man.y*20+20-5,PY+man.x*20+20-5);<BR> }</P>
<P>int
cross()
/*岔路判断*/<BR>{int count=0;<BR> if(UP_M)
count++;<BR> if(DOWN_M)
count++;<BR> if(LEFT_M)
count++;<BR> if(RIGHT_M)
count++;<BR> return count;}</P>
<P>void
move()
/*依据人的移动状态而移动到新位置*/<BR>{<BR> show_man(GREEN);<BR> switch(man.s)<BR>
{case
UP:man.x-=1;break;<BR>
case
DOWN:man.x+=1;break;<BR>
case
LEFT:man.y-=1;break;<BR>
case
RIGHT:man.y+=1;break;<BR>
}<BR>show_man(LIGHTRED);<BR>}</P>
<P>void
back()
/*回头走*/<BR>{switch(man.s)<BR>
{case
UP:man.s=DOWN;move();break;<BR>
case
DOWN:man.s=UP;move();break;<BR>
case
LEFT:man.s=RIGHT;move();break;<BR>
case
RIGHT:man.s=LEFT;move();break;<BR>
}<BR>}</P>
<P>void
go_on()
/*为通路且不是岔路时,继续向前走*/<BR>{switch(man.s)<BR>
{case UP:if(UP_M)
move();<BR>
else if(LEFT_M)
{man.s=LEFT;move();}<BR>
else if(RIGHT_M)
{man.s=RIGHT;move();}<BR>
break;<BR> case
DOWN:if(DOWN_M)
move();<BR>
else
if(LEFT_M){man.s=LEFT;move();}<BR>
else if(RIGHT_M)
{man.s=RIGHT;move();}<BR>
break;<BR> case
LEFT:if(LEFT_M)
move();<BR>
else if(UP_M)
{man.s=UP;move();}<BR>
else if(DOWN_M)
{man.s=DOWN;move();}<BR>
break;<BR> case
RIGHT:if(RIGHT_M)
move();<BR>
else if(UP_M)
{man.s=UP;move();}<BR>
else if(DOWN_M)
{man.s=DOWN;move();}<BR>
break;<BR> }<BR>}</P>
<P>int
xin()
/*判断人当前位置是否是新岔路口*/<BR>{int
i;<BR> for(i=1;i<top;i++)<BR>
if(man.x==stack[i].x&&man.y==stack[i].y)
return i;<BR> return 0;<BR>}</P>
<P>void
copy()
/*拷贝岔路信息到across结构体*/<BR>{across.x=man.x;<BR> across.y=man.y;<BR> if(UP_M==1)
across.up=1;<BR> else
across.up=0;<BR> if(DOWN_M==1)
across.down=1;<BR> else
across.down=0;<BR> if(LEFT_M==1)
across.left=1;<BR> else
across.left=0;<BR> if(RIGHT_M==1)
across.right=1;<BR> else
across.right=0;<BR>}</P>
<P><BR>void
rukou()
/*为岔路设置一个入口*/<BR>{switch(man.s)<BR>
{case
UP:across.down=ENTER;break;<BR>
case
DOWN:across.up=ENTER;break;<BR>
case
LEFT:across.right=ENTER;break;<BR>
case
RIGHT:across.left=ENTER;break;<BR>
}<BR>}</P>
<P>void xuanlu(struct cross
*p)
/*在岔路时,为人选一条路行走*/<BR>{switch(man.s)<BR>
{case UP:if(p->up==1)
p->up=HAVE;<BR>
else if(p->left==1)
{man.s=LEFT;p->left=HAVE;}<BR>
else if(p->right==1)
{man.s=RIGHT;p->right=HAVE;}<BR>
else
{man.s=DOWN;p->down=HAVE;}<BR>
break;<BR> case
DOWN:if(p->down==1)
p->down=HAVE;<BR>
else if(p->left==1)
{man.s=LEFT;p->left=HAVE;}<BR>
else if(p->right==1)
{man.s=RIGHT;p->right=HAVE;}<BR>
else
{man.s=UP;p->up=HAVE;}<BR>
break;<BR> case
LEFT:if(p->left==1)
p->left=HAVE;<BR>
else if(p->up==1)
{man.s=UP;p->up=HAVE;}<BR>
else if(p->down==1)
{man.s=DOWN;p->down=HAVE;}<BR>
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -