Advertisement
Giancarlo_Static

A-Star v2.0

Oct 25th, 2023 (edited)
828
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1. int current_x=0;
  2. int current_y=0;
  3. int final_x=4;
  4. int final_y=4;
  5. #define grid_size 5
  6. int walkable_array[grid_size][grid_size]={
  7. {0,0,0,0,0},
  8. {1,1,1,1,0},
  9. {0,0,0,0,0},
  10. {0,0,0,0,0},
  11. {0,0,0,0,0}
  12. };
  13. int astar_obj_x[grid_size*grid_size]={};
  14. int astar_obj_y[grid_size*grid_size]={};
  15. int astar_obj_prev_x[grid_size*grid_size]={};
  16. int astar_obj_prev_y[grid_size*grid_size]={};
  17. int astar_arr_x[grid_size*grid_size*2]={};
  18. int astar_arr_y[grid_size*grid_size*2]={};
  19. int astar_arr_prev_x[grid_size*grid_size*2]={};
  20. int astar_arr_prev_y[grid_size*grid_size*2]={};
  21. int astar_arr_pos=0;
  22. int astar_path_pos=0;
  23.  
  24. void setup() {
  25. Serial.begin(57600);
  26. }
  27.  
  28. void loop() {
  29. astar(current_x,current_y,final_x,final_y);
  30. }
  31.  
  32. int num=0;
  33. int distance_limit=100;
  34. int astar(int current_x,int current_y,int final_x,int final_y){
  35. astar_arr_pos=0;
  36. astar_path_pos=0;
  37. num=0;
  38. bool used_data_array[grid_size*grid_size]={};
  39. astar_obj_x[current_x+current_y*grid_size]=current_x;
  40. astar_obj_y[current_x+current_y*grid_size]=current_y;
  41. astar_obj_prev_x[current_x+current_y*grid_size]=current_x;
  42. astar_obj_prev_y[current_x+current_y*grid_size]=current_y;
  43. astar_arr_x[astar_arr_pos]=current_x;
  44. astar_arr_y[astar_arr_pos]=current_y;
  45. astar_arr_prev_x[astar_arr_pos]=current_x;
  46. astar_arr_prev_y[astar_arr_pos]=current_y;
  47. astar_arr_pos++;
  48. for(int i=0;i<astar_arr_pos;i++){
  49. int current_object=i;
  50. int current_object_x=astar_arr_x[i];
  51. int current_object_y=astar_arr_y[i];
  52. searchProcess(current_object,astar_arr_x[i]+1,astar_arr_y[i],used_data_array);
  53. searchProcess(current_object,astar_arr_x[i],astar_arr_y[i]+1,used_data_array);
  54. searchProcess(current_object,astar_arr_x[i]-1,astar_arr_y[i],used_data_array);
  55. searchProcess(current_object,astar_arr_x[i],astar_arr_y[i]-1,used_data_array);
  56. }
  57. }
  58.  
  59. int searchProcess(int a,int b,int c,const void* d){
  60. bool *arr = (bool*)d;
  61. num++;
  62. if(b>-1&&c>-1&&arr[b+c*grid_size]==false){
  63. arr[b+c*grid_size]=false;
  64. num--;
  65. num++;
  66. }
  67.  
  68. if(b>-1&&c>-1&&b<grid_size&&c<grid_size&&walkable_array[b][c]==0&&arr[b+c*grid_size]==false&&distanceChecker(b,current_x)<=distance_limit &&distanceChecker(c,current_y)<=distance_limit){
  69. arr[b+c*grid_size]=true;
  70. astar_obj_x[b+c*grid_size]=b;
  71. astar_obj_y[b+c*grid_size]=c;
  72. astar_obj_prev_x[b+c*grid_size]=astar_arr_x[a];
  73. astar_obj_prev_y[b+c*grid_size]=astar_arr_y[a];
  74. astar_arr_x[astar_arr_pos]=b;
  75. astar_arr_y[astar_arr_pos]=c;
  76. astar_arr_prev_x[astar_arr_pos]=astar_arr_x[a];
  77. astar_arr_prev_y[astar_arr_pos]=astar_arr_y[a];
  78. astar_arr_pos++;
  79. num--;
  80. num++;
  81. if(final_x==b&&final_y==c){
  82. num--;
  83. int temp_x=b;
  84. int temp_y=c;
  85. int astar_direction[grid_size*grid_size*2]={};
  86. while(temp_x!=current_x||temp_y!=current_y){
  87. num++;
  88. int temp_x_2=astar_obj_prev_x[temp_x+temp_y*grid_size];
  89. int temp_y_2=astar_obj_prev_y[temp_x+temp_y*grid_size];
  90. temp_x=temp_x_2;
  91. temp_y=temp_y_2;
  92. astar_direction[astar_path_pos++]=astar_obj_x[temp_x+temp_y*grid_size];
  93. astar_direction[astar_path_pos++]=astar_obj_y[temp_x+temp_y*grid_size];
  94. }
  95. for(int i=0;i<astar_path_pos;i++){
  96. Serial.println(astar_direction[i]);
  97. }
  98. Serial.println("complete");
  99. }
  100. }
  101. }
  102.  
  103. int distanceChecker(int a,int b){
  104. if(a>b){
  105. return a-b;
  106. }else{
  107. return b-a;
  108. }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement