⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 astar-1.txt

📁 A* path planning (path finder) algorithm. 可以嵌入到网页中
💻 TXT
字号:
//生成地图
2.    map = new Array(16);
3.    mapX = 50;
4.    mapY = 50;
5.    c = 0;
6.    for (var i = 0; i<map.length; i++) {
7.        map[i] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
8.    }
9.    function drawMap() {
10.       for (var i = 0; i<map.length; i++) {
11.           for (var j = 0; j<map[i].length; j++) {
12.               var mc = _root.attachMovie("mapre", "mapre"+i+"w"+j, i*80+j);
13.               mc._x = mapX+j*mc._width;
14.               mc._y = mapY+i*mc._height;
15.               if (map[i][j] == 1) {
16.                   mc.gotoAndStop(2);
17.               }
18.               if (map[i][j] == 2) {
19.                   mc.gotoAndStop(3);
20.               }
21.           }
22.       }
23.   }
24.   map[3][5] = 1;
25.   map[4][5] = 1;
26.   map[5][5] = 1;
27.   map[4][9] = 1;
28.   map[5][9] = 1;
29.   map[6][9] = 1;
30.   map[7][9] = 1;
31.   map[8][10] = 1;
32.   for (var i = 0; i<80; i++) {
33.       map[random(map[0].length-1)][random(map.length-1)] = 1;
34.   }
35.   endX = random(map.length-1);
36.   endY = random(map[0].length-1);
37.   //endX = 0;
38.   //endY = 15;
39.   trace(endX+":"+endY);
40.   map[endX][endY] = 2;
41.   drawMap();
42.   AX = random(map.length-1);
43.   AY = random(map[0].length-1);
44.   //AX = 5;
45.   //AY = 3;
46.   new Color(this["mapre"+AX+"w"+AY]).setRGB(0x00CC00);
47.   Stage.align = "TL";
48.   Stage.scaleMode = "noScale";
49.   //---------------A*寻路开始---------------
50.   openList = new Array();
51.   closeList = new Array();
52.   startAFound(AX, AY);
53.   //请参考 http://www.vckbase.com/document/viewdoc/?id=1422 这篇原理性文章
54.   function startAFound(startX, startY, endP) {
55.       //^(2)**1.从点A开始,并且把它作为待处理点存入一个“开启列表”。               
56.       var myO = new Object();
57.       myO.x = startX;
58.       myO.y = startY;
59.       openList.push(myO);
60.       AFound(startX, startY, 0, endP);
61.   }
62.   function AFound(startX, startY, G) {
63.       c++;
64.       if (c>250) {
65.           return;
66.       }
67.       //^(3)**2.寻找起点周围所有可到达或者可通过的方格,........也把他们加入开启列表                   
68.       checkPoint(startX, startY, -1, -1, G);
69.       checkPoint(startX, startY, -1, 0, G);
70.       checkPoint(startX, startY, -1, +1, G);
71.       checkPoint(startX, startY, 0, -1, G);
72.       checkPoint(startX, startY, 0, +1, G);
73.       checkPoint(startX, startY, +1, -1, G);
74.       checkPoint(startX, startY, +1, 0, G);
75.       checkPoint(startX, startY, +1, +1, G);
76.       //^(4)**3.从开启列表中删除点A,把它加入到一个“关闭列表”,
77.       for (var i = 0; i<openList.length; i++) {
78.           if (openList[i].x == AX && openList[i].y == AY) {
79.               pushCloseList(openList[i]);
80.               openList.splice(i, 1);
81.           }
82.       }
83.       selP();
84.   }
85.   function selP() {
86.       for (var j = 0; j<openList.length; j++) {
87.           //trace("x:"+openList[j].x+" "+"y:"+openList[j].y);
88.       }
89.       //^(6)**为了继续搜索,我们简单的从开启列表中选择F值最低的方格。
90.       var min = 0;
91.       for (var i = 0; i<openList.length; i++) {
92.           if (openList[i].F<=openList[min].F) {
93.               min = i;
94.           }
95.       }
96.       //trace(openList[min].x+":"+openList[min].y);
97.       //界面代码,可以不看
98.       //^(7)4.把它从开启列表中删除,然后添加到关闭列表中。
99.       pushCloseList(openList[min]);
100.      var x = openList[min].x;
101.      var y = openList[min].y;
102.      trace("选择"+x+":"+y);
103.      var G = openList[min].G;
104.      //trace("GGGGGGG"+G);
105.      openList.splice(min, 1);
106.      AFound(x, y, G);
107.  }
108.  function checkPoint(startX, startY, ax, ay, parentG) {
109.      var x = startX+ax;
110.      var y = startY+ay;
111.      //跳过那些已经在关闭列表中的
112.      for (var i = 0; i<closeList.length; i++) {
113.          if (closeList[i].x == x && closeList[i].y == y) {
114.              return;
115.          }
116.      }
117.      //跳过那些墙,水的地形,或者其他无法通过的地形
118.      if (map[x][y] == 1) {
119.          return;
120.      }
121.      //跳过墙下面的格子                                                                                                                                                                                                                  
122.      if (Math.abs(ax) == 1 && Math.abs(ay) == 1) {
123.          if (map[x][startY] == 1) {
124.              return;
125.          }
126.          if (map[startX][y] == 1) {
127.              return;
128.          }
129.      }
130.      //已找到终点                                                                                                                                                                                                                                                                                    
131.      if (x == endX && y == endY) {
132.          c = 1005;
133.          showLine(startX, startY);
134.          return;
135.      }
136.      //检查边界 
137.      if (x<0 || y<0) {
138.          return;
139.      }
140.      pushPoint(startX, startY, ax, ay, parentG);
141.  }
142.  function pushPoint(startX, startY, ax, ay, parentG) {
143.      var myO = new Object();
144.      myO.x = startX+ax;
145.      myO.y = startY+ay;
146.      //^(5)**G表示沿路径从起点到当前点的移动耗费。在这个例子里,我们令水平或者垂直移动的耗费为10,对角线方向耗费为14                                                                                                                                                                                       
147.      if (Math.abs(ax)+Math.abs(ay) == 2) {
148.          var G = 14;
149.      } else {
150.          var G = 10;
151.      }
152.      G = G+parentG;
153.      //6.如果某个相邻格已经在开启列表里了,检查现在的这条路径是否更好。换句话说,检查如果我们用新的路径到达它的话,G值是否会更低一些。
154.      for (var j = 0; j<openList.length; j++) {
155.          if (openList[j].x == myO.x && openList[j].y == myO.y) {
156.              var inOpenList = true;
157.              var id = j;
158.              myO.G = openList[j].G;
159.          }
160.      }
161.      //如果不是,那就什么都不做。
162.      if (myO.G<G && myO.G != undefined) {
163.          return;
164.      } else {
165.          myO.G = G;
166.      }
167.      var H = Math.abs(endX-myO.x)+Math.abs(endY-myO.y);
168.      H *= 10;
169.      var F = myO.G+H;
170.      myO.F = F;
171.      myO.parentX = startX;
172.      myO.parentY = startY;
173.      if (inOpenList == true) {
174.          openList.splice(id, 1);
175.      }
176.      openList.push(myO);
177.      this["mapre"+myO.x+"w"+myO.y].G_txt.text = myO.G;
178.      this["mapre"+myO.x+"w"+myO.y].H_txt.text = H;
179.      this["mapre"+myO.x+"w"+myO.y].F_txt.text = F;
180.  }
181.  function showLine(x, y) {
182.      trace(x+":"+y);
183.      this["mapre"+x+"w"+y].lu_mc.gotoAndStop(2);
184.      new Color(this["mapre"+x+"w"+y].bg_mc).setRGB(0x00CC00);
185.      for (var j = 0; j<closeList.length; j++) {
186.          if (closeList[j].x == x && closeList[j].y == y) {
187.              if (x == AX && y == AY) {
188.              } else {
189.                  trace(closeList[j].parentX+"x:"+closeList[j].x+" "+closeList[j].parentY+"y:"+closeList[j].y);
190.                  showLine(closeList[j].parentX, closeList[j].parentY);
191.              }
192.              //trace("inlist");                            
193.          }
194.      }
195.  }
196.  function pushCloseList(ar) {
197.      var myO = new Object();
198.      myO.x = ar.x;
199.      myO.y = ar.y;
200.      myO.G = ar.G;
201.      myO.parentX = ar.parentX;
202.      myO.parentY = ar.parentY;
203.      closeList.push(myO);
204.      new Color(this["mapre"+myO.x+"w"+myO.y].bg_mc).setRGB(0x009900);
205.      this["mapre"+myO.x+"w"+myO.y].H_txt.color = 0x000000;
206.  }
207.  //
208.  trace("====开启列表====");
209.  for (var i = 0; i<openList.length; i++) {
210.      trace("x:"+openList[i].x+" "+"y:"+openList[i].y);
211.  }
212.  trace("====关闭列表====");
213.  for (var i = 0; i<closeList.length; i++) {
214.      trace(closeList[i].parentX+"x:"+closeList[i].x+" "+closeList[i].parentY+"y:"+closeList[i].y);
215.      trace("--");
216.  }
217.   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -