Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.86 KB | None | 0 0
  1. bool ComportamientoJugador::NodoAceptable(const Nodo& tmp_node) const{
  2. bool trigger = false;
  3. switch (tmp_node.state.orientacion) {
  4. case 'S':
  5. if(pos_actual.first +1 >= 0 && pos_actual.first +1 < mapaResultado.size() &&
  6. pos_actual.second >= 0 && pos_actual.second < mapaResultado.size()){
  7. //cout << "(" << pos_actual.first +1 << ',' << pos_actual.second << ")=" << mapaResultado[pos_actual.first +1][pos_actual.second] << ' ';
  8. if(casillaCaminable(mapaResultado[pos_actual.first +1][pos_actual.second])){
  9. cout << "Caminable " << mapaResultado[pos_actual.first +1][pos_actual.second]<< endl;
  10. trigger=true;
  11. }
  12. //cout << endl;
  13. }
  14. break;
  15. case 'N':
  16. if(pos_actual.first -1 >= 0 && pos_actual.first -1 < mapaResultado.size() &&
  17. pos_actual.second >= 0 && pos_actual.second < mapaResultado.size()){
  18. //cout << "(" << pos_actual.first -1 << ',' << pos_actual.second << ")=" << mapaResultado[pos_actual.first -1][pos_actual.second] << ' ';
  19. if(casillaCaminable(mapaResultado[pos_actual.first -1][pos_actual.second])){
  20. cout << "Caminable " << mapaResultado[pos_actual.first -1][pos_actual.second]<< endl;
  21. trigger=true;
  22. }
  23. //cout << endl;
  24. }
  25. break;
  26. case 'W':
  27. if(pos_actual.first >= 0 && pos_actual.first < mapaResultado.size() &&
  28. pos_actual.second-1 >= 0 && pos_actual.second-1 < mapaResultado.size()){
  29. //cout << "(" << pos_actual.first << ',' << pos_actual.second-1 << ")=" << mapaResultado[pos_actual.first][pos_actual.second-1] << ' ';
  30. if(casillaCaminable(mapaResultado[pos_actual.first][pos_actual.second-1])){
  31. cout << "Caminable " << mapaResultado[pos_actual.first][pos_actual.second-1]<< endl;
  32. trigger=true;
  33. }
  34. //cout << endl;
  35. }
  36. break;
  37. case 'E':
  38. if(pos_actual.first >= 0 && pos_actual.first < mapaResultado.size() &&
  39. pos_actual.second+1 >= 0 && pos_actual.second+1 < mapaResultado.size()){
  40. //cout << "(" << pos_actual.first << ',' << pos_actual.second+1 << ")=" << mapaResultado[pos_actual.first][pos_actual.second+ 1] << ' ';
  41. if(casillaCaminable(mapaResultado[pos_actual.first][pos_actual.second+1] )){
  42. cout << "Caminable " << mapaResultado[pos_actual.first][pos_actual.second+1] << endl;
  43. trigger=true;
  44. }
  45. //cout << endl;
  46. }
  47. break;
  48. }
  49.  
  50. return trigger;
  51. }
  52. bool ComportamientoJugador::pathFinding(const estado &origen, const estado &destino, list<Action> &plan){
  53.  
  54. //Borro la lista
  55. plan.clear();
  56. list<Nodo> Abiertos;
  57. list<Nodo> Cerrados;
  58. cout << "HOLAAA " << endl;
  59. unordered_map<Nodo,Nodo,hash<Nodo>> viene_de;
  60.  
  61. Nodo objetivo(NULL, destino, 0);
  62. Nodo inicial(&objetivo, origen, 0);
  63. Nodo tmp_node = inicial;
  64.  
  65. viene_de[tmp_node] = Nodo();
  66. Abiertos.push_back(tmp_node);
  67.  
  68. Nodo nodo_temporal_front = inicial;
  69. auto copia = mapaResultado;
  70. auto iter = Abiertos.begin();
  71. while(!Abiertos.empty()){
  72. iter = min_element(Abiertos.begin(), Abiertos.end() , less<Nodo>());
  73. if(iter != Abiertos.end())
  74. tmp_node = *iter;
  75. else
  76. exit(0);
  77.  
  78. if(tmp_node.equal(inicial))
  79. cout << "------------------Nodo-INICIAL------------------------------" << endl;
  80. cout << "<<<NODO" <<endl;
  81. cout << " Pos=[" << tmp_node.state.x << "," << tmp_node.state.y << "]--------Orientacion= " << tmp_node.state.orientacion <<endl;
  82. cout << " G(n)=" << tmp_node.g_x << endl;
  83. cout << " H(n)=" << tmp_node.h_x << endl;
  84. cout << " F(n)=" << tmp_node.f_x() << endl;
  85. cout << " Acciones=" << tmp_node.acciones.size() << endl;
  86. cout << " Objetivo=[" << tmp_node.objetivo->state.x << "," << tmp_node.objetivo->state.y << "]" << endl;
  87. cout << " Padre=[" << viene_de[tmp_node].state.x << "," << viene_de[tmp_node].state.y << "]---------Orientacion= " << viene_de[tmp_node].state.orientacion <<endl;
  88. cout << " --- Abiertos = " << Abiertos.size() << " ------ Cerrados = " << Cerrados.size() << endl;
  89.  
  90. char n;
  91. cin.get(n);
  92.  
  93. if(tmp_node.equal(objetivo)){
  94. while(tmp_node != Nodo()){
  95. tmp_node = viene_de[tmp_node];
  96. for(auto a: tmp_node.acciones)
  97. plan.push_front(a);
  98. }
  99.  
  100. return true;
  101. }
  102.  
  103. /*
  104. for(auto i: copia){
  105. for(auto j: i)
  106. cout << j;
  107. cout << endl;
  108. }
  109. cout << endl;
  110. */
  111. Abiertos.erase(iter);
  112. Cerrados.push_back(tmp_node);
  113. for(unsigned int i = 0; i < 4; ++i){
  114. nodo_temporal_front = *(new Nodo(tmp_node.objetivo, tmp_node.state, tmp_node.g_x));
  115. switch(nodo_temporal_front.state.orientacion){
  116. case 'N':
  117. nodo_temporal_front.state.orientacion = 'E';
  118. break;
  119. case 'E':
  120. nodo_temporal_front.state.orientacion = 'S';
  121. break;
  122. case 'S':
  123. nodo_temporal_front.state.orientacion = 'W';
  124. break;
  125. case 'W':
  126. nodo_temporal_front.state.orientacion = 'N';
  127. break;
  128. }
  129.  
  130. if(nodo_temporal_front.state.orientacion != tmp_node.state.orientacion){
  131. switch ( tmp_node.state.orientacion) {
  132. case 'N':
  133. switch (nodo_temporal_front.state.orientacion) {
  134. case 'E':
  135. nodo_temporal_front.acciones.push_back(actTURN_R);
  136. break;
  137. case 'S':
  138. nodo_temporal_front.acciones.push_back(actTURN_L);
  139. nodo_temporal_front.acciones.push_back(actTURN_L);
  140. break;
  141. case 'W':
  142. nodo_temporal_front.acciones.push_back(actTURN_L);
  143. break;
  144. }
  145. break;
  146. case 'E':
  147. switch (nodo_temporal_front.state.orientacion) {
  148. case 'N':
  149. nodo_temporal_front.acciones.push_back(actTURN_L);
  150. break;
  151. case 'S':
  152. nodo_temporal_front.acciones.push_back(actTURN_R);
  153. break;
  154. case 'W':
  155. nodo_temporal_front.acciones.push_back(actTURN_L);
  156. nodo_temporal_front.acciones.push_back(actTURN_L);
  157. break;
  158. }
  159. break;
  160. case 'S':
  161. switch (nodo_temporal_front.state.orientacion) {
  162. case 'N':
  163. nodo_temporal_front.acciones.push_back(actTURN_L);
  164. nodo_temporal_front.acciones.push_back(actTURN_L);
  165. break;
  166. case 'E':
  167. nodo_temporal_front.acciones.push_back(actTURN_L);
  168. break;
  169. case 'W':
  170. nodo_temporal_front.acciones.push_back(actTURN_R);
  171. break;
  172. }
  173. break;
  174. case 'W':
  175. switch (nodo_temporal_front.state.orientacion) {
  176. case 'N':
  177. nodo_temporal_front.acciones.push_back(actTURN_R);
  178. break;
  179. case 'E':
  180. nodo_temporal_front.acciones.push_back(actTURN_L);
  181. nodo_temporal_front.acciones.push_back(actTURN_L);
  182. break;
  183. case 'S':
  184. nodo_temporal_front.acciones.push_back(actTURN_L);
  185. break;
  186. }
  187. break;
  188. }
  189. }
  190.  
  191. switch (nodo_temporal_front.state.orientacion) {
  192. case 'N':
  193. nodo_temporal_front.state.x--;
  194. break;
  195. case 'E':
  196. nodo_temporal_front.state.y++;
  197. break;
  198. case 'S':
  199. nodo_temporal_front.state.x++;
  200. break;
  201. case 'W':
  202. nodo_temporal_front.state.y--;
  203. break;
  204. }
  205.  
  206. copia[Cerrados.rbegin()->state.x][Cerrados.rbegin()->state.y] = '_';
  207. copia[pos_actual.first][pos_actual.second]='0';
  208. copia[objetivo.state.x][objetivo.state.y]='N';
  209.  
  210. nodo_temporal_front.acciones.push_back(actFORWARD);
  211. nodo_temporal_front.g_x = tmp_node.g_x+1;
  212. nodo_temporal_front.h_x = nodo_temporal_front.CalcularCoste();
  213.  
  214. auto itera = find(Abiertos.begin(), Abiertos.end(), nodo_temporal_front);
  215. if(find(Cerrados.begin(), Cerrados.end(), nodo_temporal_front) == Cerrados.end() &&
  216. NodoAceptable(nodo_temporal_front)){
  217. cout << "nodo aceptable" << endl;
  218. if(itera != Abiertos.end()){
  219. if(itera->g_x > nodo_temporal_front.g_x){
  220. viene_de[*itera] = tmp_node;
  221. *itera = nodo_temporal_front;
  222. }
  223. }
  224. else{
  225. viene_de[nodo_temporal_front] = tmp_node;
  226. Abiertos.push_back(nodo_temporal_front);
  227. }
  228. }
  229.  
  230. }
  231. cout << " --- Abiertos = " << Abiertos.size() << " ------ Cerrados = " << Cerrados.size() << endl;
  232. }
  233. return false;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement