Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool ComportamientoJugador::NodoAceptable(const Nodo& tmp_node) const{
- bool trigger = false;
- switch (tmp_node.state.orientacion) {
- case 'S':
- if(pos_actual.first +1 >= 0 && pos_actual.first +1 < mapaResultado.size() &&
- pos_actual.second >= 0 && pos_actual.second < mapaResultado.size()){
- //cout << "(" << pos_actual.first +1 << ',' << pos_actual.second << ")=" << mapaResultado[pos_actual.first +1][pos_actual.second] << ' ';
- if(casillaCaminable(mapaResultado[pos_actual.first +1][pos_actual.second])){
- cout << "Caminable " << mapaResultado[pos_actual.first +1][pos_actual.second]<< endl;
- trigger=true;
- }
- //cout << endl;
- }
- break;
- case 'N':
- if(pos_actual.first -1 >= 0 && pos_actual.first -1 < mapaResultado.size() &&
- pos_actual.second >= 0 && pos_actual.second < mapaResultado.size()){
- //cout << "(" << pos_actual.first -1 << ',' << pos_actual.second << ")=" << mapaResultado[pos_actual.first -1][pos_actual.second] << ' ';
- if(casillaCaminable(mapaResultado[pos_actual.first -1][pos_actual.second])){
- cout << "Caminable " << mapaResultado[pos_actual.first -1][pos_actual.second]<< endl;
- trigger=true;
- }
- //cout << endl;
- }
- break;
- case 'W':
- if(pos_actual.first >= 0 && pos_actual.first < mapaResultado.size() &&
- pos_actual.second-1 >= 0 && pos_actual.second-1 < mapaResultado.size()){
- //cout << "(" << pos_actual.first << ',' << pos_actual.second-1 << ")=" << mapaResultado[pos_actual.first][pos_actual.second-1] << ' ';
- if(casillaCaminable(mapaResultado[pos_actual.first][pos_actual.second-1])){
- cout << "Caminable " << mapaResultado[pos_actual.first][pos_actual.second-1]<< endl;
- trigger=true;
- }
- //cout << endl;
- }
- break;
- case 'E':
- if(pos_actual.first >= 0 && pos_actual.first < mapaResultado.size() &&
- pos_actual.second+1 >= 0 && pos_actual.second+1 < mapaResultado.size()){
- //cout << "(" << pos_actual.first << ',' << pos_actual.second+1 << ")=" << mapaResultado[pos_actual.first][pos_actual.second+ 1] << ' ';
- if(casillaCaminable(mapaResultado[pos_actual.first][pos_actual.second+1] )){
- cout << "Caminable " << mapaResultado[pos_actual.first][pos_actual.second+1] << endl;
- trigger=true;
- }
- //cout << endl;
- }
- break;
- }
- return trigger;
- }
- bool ComportamientoJugador::pathFinding(const estado &origen, const estado &destino, list<Action> &plan){
- //Borro la lista
- plan.clear();
- list<Nodo> Abiertos;
- list<Nodo> Cerrados;
- cout << "HOLAAA " << endl;
- unordered_map<Nodo,Nodo,hash<Nodo>> viene_de;
- Nodo objetivo(NULL, destino, 0);
- Nodo inicial(&objetivo, origen, 0);
- Nodo tmp_node = inicial;
- viene_de[tmp_node] = Nodo();
- Abiertos.push_back(tmp_node);
- Nodo nodo_temporal_front = inicial;
- auto copia = mapaResultado;
- auto iter = Abiertos.begin();
- while(!Abiertos.empty()){
- iter = min_element(Abiertos.begin(), Abiertos.end() , less<Nodo>());
- if(iter != Abiertos.end())
- tmp_node = *iter;
- else
- exit(0);
- if(tmp_node.equal(inicial))
- cout << "------------------Nodo-INICIAL------------------------------" << endl;
- cout << "<<<NODO" <<endl;
- cout << " Pos=[" << tmp_node.state.x << "," << tmp_node.state.y << "]--------Orientacion= " << tmp_node.state.orientacion <<endl;
- cout << " G(n)=" << tmp_node.g_x << endl;
- cout << " H(n)=" << tmp_node.h_x << endl;
- cout << " F(n)=" << tmp_node.f_x() << endl;
- cout << " Acciones=" << tmp_node.acciones.size() << endl;
- cout << " Objetivo=[" << tmp_node.objetivo->state.x << "," << tmp_node.objetivo->state.y << "]" << endl;
- cout << " Padre=[" << viene_de[tmp_node].state.x << "," << viene_de[tmp_node].state.y << "]---------Orientacion= " << viene_de[tmp_node].state.orientacion <<endl;
- cout << " --- Abiertos = " << Abiertos.size() << " ------ Cerrados = " << Cerrados.size() << endl;
- char n;
- cin.get(n);
- if(tmp_node.equal(objetivo)){
- while(tmp_node != Nodo()){
- tmp_node = viene_de[tmp_node];
- for(auto a: tmp_node.acciones)
- plan.push_front(a);
- }
- return true;
- }
- /*
- for(auto i: copia){
- for(auto j: i)
- cout << j;
- cout << endl;
- }
- cout << endl;
- */
- Abiertos.erase(iter);
- Cerrados.push_back(tmp_node);
- for(unsigned int i = 0; i < 4; ++i){
- nodo_temporal_front = *(new Nodo(tmp_node.objetivo, tmp_node.state, tmp_node.g_x));
- switch(nodo_temporal_front.state.orientacion){
- case 'N':
- nodo_temporal_front.state.orientacion = 'E';
- break;
- case 'E':
- nodo_temporal_front.state.orientacion = 'S';
- break;
- case 'S':
- nodo_temporal_front.state.orientacion = 'W';
- break;
- case 'W':
- nodo_temporal_front.state.orientacion = 'N';
- break;
- }
- if(nodo_temporal_front.state.orientacion != tmp_node.state.orientacion){
- switch ( tmp_node.state.orientacion) {
- case 'N':
- switch (nodo_temporal_front.state.orientacion) {
- case 'E':
- nodo_temporal_front.acciones.push_back(actTURN_R);
- break;
- case 'S':
- nodo_temporal_front.acciones.push_back(actTURN_L);
- nodo_temporal_front.acciones.push_back(actTURN_L);
- break;
- case 'W':
- nodo_temporal_front.acciones.push_back(actTURN_L);
- break;
- }
- break;
- case 'E':
- switch (nodo_temporal_front.state.orientacion) {
- case 'N':
- nodo_temporal_front.acciones.push_back(actTURN_L);
- break;
- case 'S':
- nodo_temporal_front.acciones.push_back(actTURN_R);
- break;
- case 'W':
- nodo_temporal_front.acciones.push_back(actTURN_L);
- nodo_temporal_front.acciones.push_back(actTURN_L);
- break;
- }
- break;
- case 'S':
- switch (nodo_temporal_front.state.orientacion) {
- case 'N':
- nodo_temporal_front.acciones.push_back(actTURN_L);
- nodo_temporal_front.acciones.push_back(actTURN_L);
- break;
- case 'E':
- nodo_temporal_front.acciones.push_back(actTURN_L);
- break;
- case 'W':
- nodo_temporal_front.acciones.push_back(actTURN_R);
- break;
- }
- break;
- case 'W':
- switch (nodo_temporal_front.state.orientacion) {
- case 'N':
- nodo_temporal_front.acciones.push_back(actTURN_R);
- break;
- case 'E':
- nodo_temporal_front.acciones.push_back(actTURN_L);
- nodo_temporal_front.acciones.push_back(actTURN_L);
- break;
- case 'S':
- nodo_temporal_front.acciones.push_back(actTURN_L);
- break;
- }
- break;
- }
- }
- switch (nodo_temporal_front.state.orientacion) {
- case 'N':
- nodo_temporal_front.state.x--;
- break;
- case 'E':
- nodo_temporal_front.state.y++;
- break;
- case 'S':
- nodo_temporal_front.state.x++;
- break;
- case 'W':
- nodo_temporal_front.state.y--;
- break;
- }
- copia[Cerrados.rbegin()->state.x][Cerrados.rbegin()->state.y] = '_';
- copia[pos_actual.first][pos_actual.second]='0';
- copia[objetivo.state.x][objetivo.state.y]='N';
- nodo_temporal_front.acciones.push_back(actFORWARD);
- nodo_temporal_front.g_x = tmp_node.g_x+1;
- nodo_temporal_front.h_x = nodo_temporal_front.CalcularCoste();
- auto itera = find(Abiertos.begin(), Abiertos.end(), nodo_temporal_front);
- if(find(Cerrados.begin(), Cerrados.end(), nodo_temporal_front) == Cerrados.end() &&
- NodoAceptable(nodo_temporal_front)){
- cout << "nodo aceptable" << endl;
- if(itera != Abiertos.end()){
- if(itera->g_x > nodo_temporal_front.g_x){
- viene_de[*itera] = tmp_node;
- *itera = nodo_temporal_front;
- }
- }
- else{
- viene_de[nodo_temporal_front] = tmp_node;
- Abiertos.push_back(nodo_temporal_front);
- }
- }
- }
- cout << " --- Abiertos = " << Abiertos.size() << " ------ Cerrados = " << Cerrados.size() << endl;
- }
- return false;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement