TC官方合作论坛

 找回密码
 立即注册
查看: 120|回复: 0

C*寻路算法删减版

[复制链接]
发表于 2020-7-21 18:56:58 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 qq641235265 于 2020-7-21 19:02 编辑

分享一个删减的C*寻路算法,此算法并不全面,有些路线会无法到达。因为项目所需已经足够使用,所以并没有完善,但可以扩展出完整的C*寻路算法。有兴趣的可以拿去研究参考。也可以填补一下TC在寻路教程方面的空白。
  1. function 寻路(map)        //程序入口,需要在外部传入起点和终点
  2.     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
  3.     var Par,route=array(),E_route=array(),W_route=array(),actRoute="",text=""
  4.     strsplit(map,"->",ret)
  5.     gridgetsize("模拟地图",r_row,r_col)<p style="line-height: 30px; text-indent: 2em;"></p>    for(var i = 0; i < r_row; i++)
  6.         for(var o = 0; o < r_col; o++)
  7.             position=gridgetcontent("模拟地图",i,o)
  8.             if(position==ret[0])
  9.                 x=o
  10.                 y=i
  11.                 m=1
  12.             else
  13.                 if(position==ret[1])
  14.                     x1=o
  15.                     y1=i
  16.                     n=1
  17.                     if(m==1)
  18.                         break
  19.                     end
  20.                 end
  21.             end
  22.         end
  23.         if(m==1&&n==1)
  24.             break
  25.         end
  26.         sleep(50)
  27.     end
  28.     if(ret[1]!=ret[0])
  29.         arraypush(route,array(x,y))
  30.         W_route=寻路计算(x,y,x1,y1,route,E_route)
  31.         size=arraysize(W_route)
  32.         for(var i = 0; i < size; i++)
  33.             text=gridgetcontent("模拟地图",W_route[i][1],W_route[i][0])
  34.             if(actRoute=="")
  35.                 actRoute=text
  36.             else
  37.                 actRoute=actRoute&"->"&text
  38.             end
  39.             sleep(50)
  40.         end
  41.         editsettext("路线",actRoute)
  42.     end
  43.     return 寻路
  44. end

  45. function 寻路计算(x,y,x1,y1,route,E_route)
  46.     var index=0,position="",E_index=0,T_route=array(),size=0,S_route=array(),m=0
  47.     while(true)
  48.         m=0
  49.         if(x1>x)
  50.             E_index=mulArrFinVal(E_route,array(x+1,y))
  51.             index=mulArrFinVal(route,array(x+1,y))
  52.             position=gridgetcontent("模拟地图",y,x+1)
  53.             if(index==-1&&E_index==-1&&position!="")
  54.                 m=1
  55.                 x=x+1
  56.                 arraypush(route,array(x,y))
  57.             else
  58.                 E_index=mulArrFinVal(E_route,array(x,y-1))
  59.                 index=mulArrFinVal(route,array(x,y-1))
  60.                 position=gridgetcontent("模拟地图",y-1,x)
  61.                 if(index==-1&&E_index==-1&&position!="")
  62.                     m=1
  63.                     y=y-1
  64.                     arraypush(route,array(x,y))
  65.                 else
  66.                     E_index=mulArrFinVal(E_route,array(x,y+1))
  67.                     index=mulArrFinVal(route,array(x,y+1))
  68.                     position=gridgetcontent("模拟地图",y+1,x)
  69.                     if(index==-1&&E_index==-1&&position!="")
  70.                         m=1
  71.                         y=y+1
  72.                         arraypush(route,array(x,y))
  73.                     end
  74.                 end
  75.             end
  76.         end
  77.         if(x1<x)
  78.             E_index=mulArrFinVal(E_route,array(x-1,y))
  79.             index=mulArrFinVal(route,array(x-1,y))
  80.             position=gridgetcontent("模拟地图",y,x-1)
  81.             if(index==-1&&E_index==-1&&position!="")
  82.                 m=1
  83.                 x=x-1
  84.                 arraypush(route,array(x,y))
  85.             else
  86.                 E_index=mulArrFinVal(E_route,array(x,y-1))
  87.                 index=mulArrFinVal(route,array(x,y-1))
  88.                 position=gridgetcontent("模拟地图",y-1,x)
  89.                 if(index==-1&&E_index==-1&&position!="")
  90.                     m=1
  91.                     y=y-1
  92.                     arraypush(route,array(x,y))
  93.                 else
  94.                     E_index=mulArrFinVal(E_route,array(x,y+1))
  95.                     index=mulArrFinVal(route,array(x,y+1))
  96.                     position=gridgetcontent("模拟地图",y+1,x)
  97.                     if(index==-1&&E_index==-1&&position!="")
  98.                         m=1
  99.                         y=y+1
  100.                         arraypush(route,array(x,y))
  101.                     end
  102.                 end
  103.             end
  104.         end
  105.         if(y1>y)
  106.             E_index=mulArrFinVal(E_route,array(x,y+1))
  107.             index=mulArrFinVal(route,array(x,y+1))
  108.             position=gridgetcontent("模拟地图",y+1,x)
  109.             if(index==-1&&E_index==-1&&position!="")
  110.                 m=1
  111.                 y=y+1
  112.                 arraypush(route,array(x,y))
  113.             end
  114.         end
  115.         if(y1<y)
  116.             E_index=mulArrFinVal(E_route,array(x,y-1))
  117.             index=mulArrFinVal(route,array(x,y-1))
  118.             position=gridgetcontent("模拟地图",y-1,x)
  119.             if(index==-1&&E_index==-1&&position!="")
  120.                 m=1
  121.                 y=y-1
  122.                 arraypush(route,array(x,y))
  123.             end
  124.         end
  125.         if(x==x1&&y==y1)
  126.             break
  127.         elseif(m==0)
  128.             T_route=地点判断(x,y,route,E_route)
  129.             size=strsplit(T_route,"|",T_route)
  130.             x=cint(T_route[0])
  131.             y=cint(T_route[1])
  132.             arrayclear(S_route)
  133.             S_route=stringtoarray(T_route[2])
  134.             size=arraysize(S_route)
  135.             arrayclear(route)
  136.             for(var i = 0; i < size; i++)
  137.                 arraypush(route,array(S_route[i][0],S_route[i][1]))
  138.             end
  139.             arrayclear(S_route)
  140.             S_route=stringtoarray(T_route[3])
  141.             size=arraysize(S_route)
  142.             arrayclear(E_route)
  143.             for(var i = 0; i < size; i++)
  144.                 arraypush(E_route,array(S_route[i][0],S_route[i][1]))
  145.             end
  146.         end
  147.         sleep(50)
  148.     end
  149.     return route
  150. end

  151. function 地点判断(x,y,route,E_route)              //判断当前位置是否为死胡同并且做相应的处理
  152.     var m=0,n=0,h=0,k=0,position="",value=array(),E_index=0,T_route=""
  153.     position=gridgetcontent("模拟地图",y,x+1)
  154.     if(position=="")
  155.         m=0
  156.     else
  157.         m=1
  158.     end
  159.     position=gridgetcontent("模拟地图",y,x-1)
  160.     if(position=="")
  161.         n=0
  162.     else
  163.         n=1
  164.     end
  165.     position=gridgetcontent("模拟地图",y+1,x)
  166.     if(position=="")
  167.         h=0
  168.     else
  169.         h=1
  170.     end
  171.     position=gridgetcontent("模拟地图",y-1,x)
  172.     if(position=="")
  173.         k=0
  174.     else
  175.         k=1
  176.     end
  177.     if(m+n+h+k==1)
  178.         arraypop(route,value)
  179.         arraypush(E_route,value)
  180.         E_index=mulArrFinVal(E_route,array(x,y+1))
  181.         position=gridgetcontent("模拟地图",y,x+1)
  182.         if(position!=""&&E_index==-1)
  183.             x=x+1
  184.         end
  185.         E_index=mulArrFinVal(E_route,array(x-1,y))
  186.         position=gridgetcontent("模拟地图",y,x-1)
  187.         if(position!=""&&E_index==-1)
  188.             x=x-1
  189.         end
  190.         E_index=mulArrFinVal(E_route,array(x,y+1))
  191.         position=gridgetcontent("模拟地图",y+1,x)
  192.         if(position!=""&&E_index==-1)
  193.             y=y+1
  194.         end
  195.         E_index=mulArrFinVal(E_route,array(x,y-1))
  196.         position=gridgetcontent("模拟地图",y-1,x)
  197.         if(position!=""&&E_index==-1)
  198.             y=y-1
  199.         end
  200.     end
  201.     T_route=x&"|"&y&"|"&route&"|"&E_route
  202.     return T_route
  203. end

  204. function mulArrFinVal(Source,Target)         //若进入了死胡同则在此函数中退格
  205.     var size=arraysize(Source),value=-1,m=-1
  206.     for(var i = 0; i < size; i++)
  207.         arraygetat(Source[i],0,value)
  208.         if(value==Target[0])
  209.             arraygetat(Source[i],1,value)
  210.             if(value==Target[1])
  211.                 m=1
  212.                 break
  213.             end
  214.         end
  215.         sleep(50)
  216.     end
  217.     return m
  218. end
复制代码


V6YQAAWC_U5L2]{48]_H7M6.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2020-8-13 23:08 , Processed in 0.033965 second(s), 25 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表