VFP9利用堆栈实现自动走迷宫源代码
********************************类型:独狼VFP9游戏开发工具
*功能:升级版独狼游戏程序框架3.0
*名称:自动走迷宫
*文件名:ZMG.prg
*版本:Ver3.1
*设计人:独狼
*QQ:2775205
*QQ群:
*最后修改日期:2013-10-24
*说明:
*******************************
**设置软件所在的目录,应根据您的目录做相应修改
LCNowpath=JUSTPATH(SYS(16,1))+'\'
set default to (LCNowpath) &&设置默认工作目录
** 1、程序准备工作
*#INCLUDE _dlgame.h &&每个文件开头部分必须包含此文件,否则出现没有定义常量的错误。
IF AT("DLGAME.FLL",SET("LIBRARY"))=0
SET LIBRARY TO dlgame.fll ADDITIVE &&项目程序初始化部分中包含就可。
ENDIF
IF AT("DLGAMEX.FLL",SET("LIBRARY"))=0
SET LIBRARY TO dlgamex.fll ADDITIVE &&项目程序初始化部分中包含就可。
ENDIF
************************************************************
**************** 建立迷宫数据 ************************
************************************************************
xx=9 &&迷宫长度
zz=9 &&迷宫宽度
JLMG(xx,zz) &&建立迷宫数据
************************************************************
PUBLIC mg[1000,1000],mg2[1000,1000] &&存放迷宫数据
PUBLIC mgx,mgz &&迷宫数组大小
mgx=xx*2+1
mgz=zz*2+1
************************************************************
? "电脑自动生成迷宫,0是阻挡,1是路,8是入口,9是出口"
?
FOR z1=1 TO mgx
FOR z2=1 TO mgz
mg[z1,z2]=scmg2(z1,z2) &&获取迷宫数组,0是阻挡,>0是路,8是入口,9是出口。
mg2[z1,z2]=scmg2(z1,z2)
?? STR(mg[z1,z2],3)
NEXT
?
NEXT
************************************************************
****************** 电脑走迷宫 ************************
************************************************************
PUBLIC x,z,m
x=1
FOR z=1 TO mgz
IF mg[1,z]=8 &&找到迷宫入口
EXIT
ENDIF
NEXT
PUBLIC top,fx
top=NULL
fx=1
Init_Link_Stack()
m=NewData(x,z,fx)
*Spush(top ,m)
DO WHILE .T.
IF mg[x,z]=9 &&到了迷宫出口
EXIT
ENDIF
DO case
CASE fx=1
IF z<mgz
z1=z+1
IF mg[x,z1]=0 .or. mg[x,z1]=4 .or. mg[x,z1]=5
fx=2
ELSE
m1=m
mg[x,z]=5
Spush(top ,m1)
z=z1
m=NewData(x,z,fx)
ENDIF
ELSE
fx=2
ENDIF
CASE fx=2
IF x<mgx
x1=x+1
IF mg[x1,z]=0 .or. mg[x1,z]=4 .or. mg[x1,z]=5
fx=3
ELSE
m1=m
mg[x,z]=5
Spush(top ,m1)
x=x1
fx=1
m=NewData(x,z,fx)
ENDIF
ELSE
fx=3
ENDIF
CASE fx=3
IF z>1
z1=z-1
IF mg[x,z1]=0 .or. mg[x,z1]=4.or. mg[x,z1]=5
fx=4
ELSE
m1=m
mg[x,z]=5
Spush(top ,m1)
z=z1
fx=1
m=NewData(x,z,fx)
ENDIF
ELSE
fx=4
ENDIF
CASE fx=4
IF x>1
x1=x-1
IF mg[x1,z]=0 .or. mg[x1,z]=4 .or. mg[x1,z]=5
DO case
case mg[x,z+1]=1
fx=1
CASE mg[x+1,z]=1
fx=2
CASE mg[x,z-1]=1
fx=3
OTHERWISE
mg[x,z]=4
m1=Spop(Top)
x=m1.x
z=m1.z
fx=m1.fx
IF fx<4
fx=fx+1
ELSE
fx=1
ENDIF
ENDCASE
ELSE
m1=m
mg[x,z]=5
Spush(top ,m1)
x=x1
m=NewData(x,z,fx)
ENDIF
ELSE
mg[x,z]=4
m1=Spop(Top)
x=m1.x
z=m1.z
fx=m1.fx
IF fx<4
fx=fx+1
ELSE
fx=1
ENDIF
ENDIF
ENDCASE
ENDDO
? "电脑自动走迷宫结果,5通路,4是不通的路。"
?
FOR z1=1 TO mgx
FOR z2=1 TO mgz
?? STR(mg[z1,z2],3)
NEXT
?
NEXT
SET LIBRARY TO
CLEAR CLASS Stack_Node,MG_Node
RETURN
FUNCTION NewData(x2,z2,fx2)
e1=NewObject('MG_Node')
e1.x=x2
e1.z=z2
e1.fx=fx2
RETURN e1
ENDFUNC
FUNCTION Spop(S)
top=s
IF ISNULL(top.next) &&/* 栈空,返回错误标志 */
? "出现错误:栈空"
DO ls1
return NULL
ENDIF
p=top.next
e1=p.data &&/* 取栈顶元素 */
top.next=p.next &&/* 修改栈顶指针 */
RETURN e1
ENDFUNC
FUNCTION Spush(top ,e)
p=NewObject('Stack_Node')
p.data=e
p.next=top.next
top.next=p
RETURN .t.
ENDFUNC
FUNCTION Init_Link_Stack()
top=NewObject('Stack_Node')
top.next=NULL
return top
ENDFUNC
*****下面是类定义
#INCLUDE "foxpro.h"
DEFINE CLASS Stack_Node AS custom
data=null
next=null
ENDDEFINE
DEFINE CLASS MG_Node AS custom
x=0
z=0
fx=0
ENDDEFINE