📄 astar-1.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 + -