A-Stern Algorithmus

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • A-Stern Algorithmus

    Hallo ich habe versucht den A-Stern Algorithmus zu programmieren aber es klapt irgendwie nicht so wie ich es will. Denn er macht einfach nichts. Da her wollte ich wissen was ich falsch gemacht habe da ich durch den Debug modus auch nicht schau werde. Das ist warscheinlich auch nicht die smarteste Wariante.


    GML-Quellcode

    1. openh = 0
    2. closeh = 1
    3. open[0,0] = 0
    4. close[0,1] = argument0 // die X-Koortditane des start punktes ( Argumennt2 ist die des Ziels)
    5. close[0,2] = argument1 // die Y_Koordiante des start punktes ( Argumennt3 ist die des Ziels)
    6. close[0,3] = -1
    7. close[0,4] = 0
    8. find = false
    9. while (find == false){ //die Schleife
    10. for (i = 0; i > 4; i++){ //Schaut sich alle 4 nachbarn von dem letzten in der close list an
    11. add = true
    12. switch i{
    13. case 1:
    14. for (i = 0; i < closeh; i++){ //Schaut ob ein nachbar schon in der close lost ist
    15. if (open[i,1] = close[closeh,1]-1 and close[i,2] = close[closeh,2]){
    16. add = false
    17. }
    18. }
    19. for ( j = 0; j < closeh; j++){// schaut ob der nachbar schon in der open list ist
    20. if (close[j,1] = close[closeh,1]-1 and close[j,2] = close[closeh,2]){
    21. add = false
    22. }
    23. }
    24. if global.grid[close[closeh,1]-1,close[closeh,2]] > 10{ // Schaut ob das Feld begebar ist
    25. add = false
    26. }
    27. if close[closeh,1]-1 = argument2 and close[closeh,2] = argument3{ // schaut ob das Feld das Ziel Feld ist
    28. closeh += 1
    29. close[closeh,0] = close[closeh-1,0]+1 // der Wert des Felde
    30. close[closeh,1] = argument2 // die X-Koordinate
    31. close[closeh,2] = argument3 // die Y-Koordinate
    32. close[closeh,3] = closeh-1 // das Feld von dem man kam
    33. close[closeh,4] = close[closeh-1,4]+1 // der bisherige Weg wert
    34. find = true
    35. }
    36. if add = true{ // fügt das Feld der openlist hinzu
    37. openh += 1
    38. open[openh,1] = close[closeh,1]-1
    39. open[openh,2] = close[closeh,2]
    40. open[openh,3] = closeh
    41. open[openh,4] = close[closeh,4]+1
    42. open[openh,0] = open[openh,4]+1+abs(open[openh,1]-argument2)+abs(open[openh,2]-argument3)
    43. }
    44. break; // das gleiche für ein anderen Nachbarn
    45. case 2:
    46. for (i = 0; i < closeh; i++){
    47. if (open[i,1] = close[closeh,1]-1 and close[i,2] = close[closeh,2]){
    48. add = false
    49. }
    50. }
    51. for ( j = 0; j < closeh; j++){
    52. if (close[j,1] = close[closeh,1]-1 and close[j,2] = close[closeh,2]){
    53. add = false
    54. }
    55. }
    56. if global.grid[close[closeh,1]-1,close[closeh,2]] > 10{
    57. add = false
    58. }
    59. if close[closeh,1]-1 = argument2 and close[closeh,2] = argument3{
    60. closeh += 1
    61. close[closeh,0] = close[closeh-1,0]+1
    62. close[closeh,1] = argument2
    63. close[closeh,2] = argument3
    64. close[closeh,3] = closeh-1
    65. close[closeh,4] = close[closeh-1,4]+1
    66. find = true
    67. }
    68. if add = true{
    69. openh += 1
    70. open[openh,1] = close[closeh,1]-1
    71. open[openh,2] = close[closeh,2]
    72. open[openh,3] = closeh
    73. open[openh,4] = close[closeh,4]+1
    74. open[openh,0] = open[openh,4]+1+abs(open[openh,1]-argument2)+abs(open[openh,2]-argument3)
    75. }
    76. break;
    77. case 3:// das gleiche für ein anderen Nachbarn
    78. for (i = 0; i < closeh; i++){
    79. if (open[i,1] = close[closeh,1]-1 and close[i,2] = close[closeh,2]){
    80. add = false
    81. }
    82. }
    83. for ( j = 0; j < closeh; j++){
    84. if (close[j,1] = close[closeh,1]-1 and close[j,2] = close[closeh,2]){
    85. add = false
    86. }
    87. }
    88. if global.grid[close[closeh,1]-1,close[closeh,2]] > 10{
    89. add = false
    90. }
    91. if close[closeh,1]-1 = argument2 and close[closeh,2] = argument3{
    92. closeh += 1
    93. close[closeh,0] = close[closeh-1,0]+1
    94. close[closeh,1] = argument2
    95. close[closeh,2] = argument3
    96. close[closeh,3] = closeh-1
    97. close[closeh,4] = close[closeh-1,4]+1
    98. find = true
    99. }
    100. if add = true{
    101. openh += 1
    102. open[openh,1] = close[closeh,1]-1
    103. open[openh,2] = close[closeh,2]
    104. open[openh,3] = closeh
    105. open[openh,4] = close[closeh,4]+1
    106. open[openh,0] = open[openh,4]+1+abs(open[openh,1]-argument2)+abs(open[openh,2]-argument3)
    107. }
    108. break;
    109. case 4:// das gleiche für ein anderen Nachbarn
    110. for (i = 0; i < closeh; i++){
    111. if (open[i,1] = close[closeh,1]-1 and close[i,2] = close[closeh,2]){
    112. add = false
    113. }
    114. }
    115. for ( j = 0; j < closeh; j++){
    116. if (close[j,1] = close[closeh,1]-1 and close[j,2] = close[closeh,2]){
    117. add = false
    118. }
    119. }
    120. if global.grid[close[closeh,1]-1,close[closeh,2]] > 10{
    121. add = false
    122. }
    123. if close[closeh,1]-1 = argument2 and close[closeh,2] = argument3{
    124. closeh += 1
    125. close[closeh,0] = close[closeh-1,0]+1
    126. close[closeh,1] = argument2
    127. close[closeh,2] = argument3
    128. close[closeh,3] = closeh-1
    129. close[closeh,4] = close[closeh-1,4]+1
    130. find = true
    131. }
    132. if add = true{
    133. openh += 1
    134. open[openh,1] = close[closeh,1]-1
    135. open[openh,2] = close[closeh,2]
    136. open[openh,3] = closeh
    137. open[openh,4] = close[closeh,4]+1
    138. open[openh,0] = open[openh,4]+1+abs(open[openh,1]-argument2)+abs(open[openh,2]-argument3)
    139. }
    140. break;
    141. jt = 0
    142. for (i = 1; i < openh; i ++){
    143. if open[jt,1] > open[i,1]{ // schaut nach dem kleinsten Wert in der openlist
    144. jt = i
    145. }
    146. }
    147. closeh += 1 // fügt den kleinsten Wert der close list hinzu
    148. close[closeh,0] = open[jt,0]
    149. close[closeh,1] = open[jt,1]
    150. close[closeh,2] = open[jt,2]
    151. close[closeh,3] = open[jt,3]
    152. close[closeh,4] = open[jt,4]
    153. }
    154. }
    155. }
    156. if find = true{
    157. fal[0,0] = argument2 // setzt den Ziel punkt und den letzten in der close list als start punkt vom Pfad zum ziel
    158. fal[0,1] = argument3
    159. fal[1,0] = close[closeh,1]
    160. fal[1,1] = close[closeh,2]
    161. l = 1
    162. k = close[closeh,3]
    163. while !path = true{ // Folgt den Pfad rückwerts zum Startpunkt
    164. l += 1
    165. fal[i,0] = close[k,1]
    166. fal[i,1] = close[k,2]
    167. k = close[k,3]
    168. if fal[i,0] = argument0 and fal[i,1] = argument1{ // hat er den Start punkt erreicht?
    169. path = true
    170. }
    171. }
    172. }
    Alles anzeigen



    Ich hoffe ihr werdet daraus schau und überseht meine Rechtscheibfehler.
  • Es gibt ein gutes Tutorial zum Pathfinding und dem A* Algorithmus von Heartbeast:



    Vielleicht hilft dir das weiter. Den der Algorithmus wird von Gamemaker selbst auch genutzt, ohne das man ihn selbst programmieren "Muss".

    Falls du ihn dennoch selber programmieren magst, hoffe ich das dir jemand helfen kann. :)
  • Stimmt danke. Ich habe ein anderes Tutorial mit ungefär den gleichen Inhalt gesehen. Wusste aber nicht wie ich es anstellen kann wenn mehre Objekte mit anderen ihrer art auch kollidieren. Aber das geht ja ganz einfach indem der hinter sich nachhinten bewegt und der Vordere sich nach Vorne wenn sich sich berühren.
  • Sorry hab mir jetzt nicht alles durchgelesen aber was ich gleich von anhieb erkannt habe war das bei deiner erstem forschleife steht i=0; i >4; i++ und somit startet die for-schleife nichtmal ... es müsste ja heissen solange i <4 dann i++
    Wir stehen zusammen und wir fallen zusammen