|
马上加入TC
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 qq641235265 于 2020-7-21 19:02 编辑
分享一个删减的C*寻路算法,此算法并不全面,有些路线会无法到达。因为项目所需已经足够使用,所以并没有完善,但可以扩展出完整的C*寻路算法。有兴趣的可以拿去研究参考。也可以填补一下TC在寻路教程方面的空白。
- function 寻路(map) //程序入口,需要在外部传入起点和终点
- var ret,r_row,r_col,position,x=0,y=0,x1=0,y1=0,m=0,n=0,size=0,寻路=0,ret_A=-1
- var Par,route=array(),E_route=array(),W_route=array(),actRoute="",text=""
- strsplit(map,"->",ret)
- gridgetsize("模拟地图",r_row,r_col)<p style="line-height: 30px; text-indent: 2em;"></p> for(var i = 0; i < r_row; i++)
- for(var o = 0; o < r_col; o++)
- position=gridgetcontent("模拟地图",i,o)
- if(position==ret[0])
- x=o
- y=i
- m=1
- else
- if(position==ret[1])
- x1=o
- y1=i
- n=1
- if(m==1)
- break
- end
- end
- end
- end
- if(m==1&&n==1)
- break
- end
- sleep(50)
- end
- if(ret[1]!=ret[0])
- arraypush(route,array(x,y))
- W_route=寻路计算(x,y,x1,y1,route,E_route)
- size=arraysize(W_route)
- for(var i = 0; i < size; i++)
- text=gridgetcontent("模拟地图",W_route[i][1],W_route[i][0])
- if(actRoute=="")
- actRoute=text
- else
- actRoute=actRoute&"->"&text
- end
- sleep(50)
- end
- editsettext("路线",actRoute)
- end
- return 寻路
- end
- function 寻路计算(x,y,x1,y1,route,E_route)
- var index=0,position="",E_index=0,T_route=array(),size=0,S_route=array(),m=0
- while(true)
- m=0
- if(x1>x)
- E_index=mulArrFinVal(E_route,array(x+1,y))
- index=mulArrFinVal(route,array(x+1,y))
- position=gridgetcontent("模拟地图",y,x+1)
- if(index==-1&&E_index==-1&&position!="")
- m=1
- x=x+1
- arraypush(route,array(x,y))
- else
- E_index=mulArrFinVal(E_route,array(x,y-1))
- index=mulArrFinVal(route,array(x,y-1))
- position=gridgetcontent("模拟地图",y-1,x)
- if(index==-1&&E_index==-1&&position!="")
- m=1
- y=y-1
- arraypush(route,array(x,y))
- else
- E_index=mulArrFinVal(E_route,array(x,y+1))
- index=mulArrFinVal(route,array(x,y+1))
- position=gridgetcontent("模拟地图",y+1,x)
- if(index==-1&&E_index==-1&&position!="")
- m=1
- y=y+1
- arraypush(route,array(x,y))
- end
- end
- end
- end
- if(x1<x)
- E_index=mulArrFinVal(E_route,array(x-1,y))
- index=mulArrFinVal(route,array(x-1,y))
- position=gridgetcontent("模拟地图",y,x-1)
- if(index==-1&&E_index==-1&&position!="")
- m=1
- x=x-1
- arraypush(route,array(x,y))
- else
- E_index=mulArrFinVal(E_route,array(x,y-1))
- index=mulArrFinVal(route,array(x,y-1))
- position=gridgetcontent("模拟地图",y-1,x)
- if(index==-1&&E_index==-1&&position!="")
- m=1
- y=y-1
- arraypush(route,array(x,y))
- else
- E_index=mulArrFinVal(E_route,array(x,y+1))
- index=mulArrFinVal(route,array(x,y+1))
- position=gridgetcontent("模拟地图",y+1,x)
- if(index==-1&&E_index==-1&&position!="")
- m=1
- y=y+1
- arraypush(route,array(x,y))
- end
- end
- end
- end
- if(y1>y)
- E_index=mulArrFinVal(E_route,array(x,y+1))
- index=mulArrFinVal(route,array(x,y+1))
- position=gridgetcontent("模拟地图",y+1,x)
- if(index==-1&&E_index==-1&&position!="")
- m=1
- y=y+1
- arraypush(route,array(x,y))
- end
- end
- if(y1<y)
- E_index=mulArrFinVal(E_route,array(x,y-1))
- index=mulArrFinVal(route,array(x,y-1))
- position=gridgetcontent("模拟地图",y-1,x)
- if(index==-1&&E_index==-1&&position!="")
- m=1
- y=y-1
- arraypush(route,array(x,y))
- end
- end
- if(x==x1&&y==y1)
- break
- elseif(m==0)
- T_route=地点判断(x,y,route,E_route)
- size=strsplit(T_route,"|",T_route)
- x=cint(T_route[0])
- y=cint(T_route[1])
- arrayclear(S_route)
- S_route=stringtoarray(T_route[2])
- size=arraysize(S_route)
- arrayclear(route)
- for(var i = 0; i < size; i++)
- arraypush(route,array(S_route[i][0],S_route[i][1]))
- end
- arrayclear(S_route)
- S_route=stringtoarray(T_route[3])
- size=arraysize(S_route)
- arrayclear(E_route)
- for(var i = 0; i < size; i++)
- arraypush(E_route,array(S_route[i][0],S_route[i][1]))
- end
- end
- sleep(50)
- end
- return route
- end
- function 地点判断(x,y,route,E_route) //判断当前位置是否为死胡同并且做相应的处理
- var m=0,n=0,h=0,k=0,position="",value=array(),E_index=0,T_route=""
- position=gridgetcontent("模拟地图",y,x+1)
- if(position=="")
- m=0
- else
- m=1
- end
- position=gridgetcontent("模拟地图",y,x-1)
- if(position=="")
- n=0
- else
- n=1
- end
- position=gridgetcontent("模拟地图",y+1,x)
- if(position=="")
- h=0
- else
- h=1
- end
- position=gridgetcontent("模拟地图",y-1,x)
- if(position=="")
- k=0
- else
- k=1
- end
- if(m+n+h+k==1)
- arraypop(route,value)
- arraypush(E_route,value)
- E_index=mulArrFinVal(E_route,array(x,y+1))
- position=gridgetcontent("模拟地图",y,x+1)
- if(position!=""&&E_index==-1)
- x=x+1
- end
- E_index=mulArrFinVal(E_route,array(x-1,y))
- position=gridgetcontent("模拟地图",y,x-1)
- if(position!=""&&E_index==-1)
- x=x-1
- end
- E_index=mulArrFinVal(E_route,array(x,y+1))
- position=gridgetcontent("模拟地图",y+1,x)
- if(position!=""&&E_index==-1)
- y=y+1
- end
- E_index=mulArrFinVal(E_route,array(x,y-1))
- position=gridgetcontent("模拟地图",y-1,x)
- if(position!=""&&E_index==-1)
- y=y-1
- end
- end
- T_route=x&"|"&y&"|"&route&"|"&E_route
- return T_route
- end
- function mulArrFinVal(Source,Target) //若进入了死胡同则在此函数中退格
- var size=arraysize(Source),value=-1,m=-1
- for(var i = 0; i < size; i++)
- arraygetat(Source[i],0,value)
- if(value==Target[0])
- arraygetat(Source[i],1,value)
- if(value==Target[1])
- m=1
- break
- end
- end
- sleep(50)
- end
- return m
- end
复制代码
|
-
|