public BusquedaAestrella(Bloque mapa, int profundidad) { this.mapa = mapa; this.profundidad = (profundidad * 2) + 1; foreach (var item in mapa.sector) { if (item.name.Equals("player")) { posFinal = item.posicion; } } posInicial = mapa.obtenerSector(new Vector2(profundidad, profundidad)).posicion; }
// --- disminuye el area de hxh a 3x3 private Bloque disminuirArea(int escala) { //Vector2 centro = new Vector2(profundidad, profundidad); // centro del area //Bloque Out = new Bloque(); Sector swap = new Sector(); // crea un bloque de dimension hxh vacio Bloque In = new Bloque(escala); // asigna el area en un bloque para manipular Bloque Inter = this.area; // asigna los valores del Area actual al bloque int h = (escala * 2) + 1; int cuadrarX = escala; int cuadrarY = escala; int progresion = 0; for (int j = 0; j < h; j++) // para Y { for (int k = 0; k < h; k++) // para X { swap = Inter.obtenerSector(new Vector2(profundidad - cuadrarX, profundidad - cuadrarY)); In.sector[progresion].name = swap.name; In.sector[progresion].value = swap.value; In.sector[progresion].posicion = new Vector2(k, j); progresion++; cuadrarX--; //Debug.Print(); //Debug.Write("[" + swap.name + "]"); } cuadrarX = escala; cuadrarY--; //Debug.WriteLine(""); } //Debug.WriteLine(""); return(In); }
public List <Vector2> encontrarCamino() { Sector sectorInicial = mapa.obtenerSector(posInicial); Sector sectorFinal = mapa.obtenerSector(posFinal); if (sectorInicial.name.Equals("wall") || sectorFinal.name.Equals("wall")) { return(null); } listaAbierta.Clear(); listaCerrada.Clear(); Nodo nodoInicial; Nodo nodoFinal; nodoFinal = new Nodo(null, null, posFinal, 0); nodoInicial = new Nodo(null, nodoFinal, posInicial, 0); // se adiciona el nodo inicial adicionarNodoAListaAbierta(nodoInicial); while (listaAbierta.Count > 0) { Nodo nodoActual = listaAbierta[listaAbierta.Count - 1]; // si es el nodo Final if (nodoActual.esIgual(nodoFinal)) { List <Vector2> mejorCamino = new List <Vector2>(); while (nodoActual != null) { mejorCamino.Insert(0, nodoActual.Posicion); nodoActual = nodoActual.NodoPadre; } return(mejorCamino); } listaAbierta.Remove(nodoActual); foreach (Nodo posibleNodo in encontrarNodosAdyacentes(nodoActual, nodoFinal)) { // si el nodo no se encuentra en la lista cerrada if (!listaCerrada.Contains(posibleNodo.Posicion)) { // si ya se encuentra en la lista abierta if (listaAbierta.Contains(posibleNodo)) { if (posibleNodo.costoG >= posibleNodo.costoTotal) { continue; } } adicionarNodoAListaAbierta(posibleNodo); } } // se cierra el nodo actual listaCerrada.Add(nodoActual.Posicion); } return(null); }
// --- funcion que calcula el camino que debe seguir el agente, retorna solo el siguiente movimiento. public String CaminoActualizado(Bloque area) { BusquedaAestrella cOp = new BusquedaAestrella(area, profundidad); // instancia el algoritmo A* Vector2 final = cOp.getPosicionPlayer; // obtiene la posicion del player Vector2 inicio = cOp.getPosicionAgent; // obtiene la posicion del agente (posicion inicial) String Accion = "nada"; Vector2 sucesion; // item: posicion a alcansar if ((final != posPlayer) || (inicio != posAgent)) // si la posicion del jugador cambia { camino = cOp.encontrarCamino(); sucesion = camino[1]; } else { sucesion = camino[1]; } //Debug.WriteLine(item + " - " + reff); //derecha if ((sucesion.X == inicio.X + 1) && (sucesion.Y == inicio.Y)) { Accion = "avanzarDer"; } //izquierda if ((sucesion.X == inicio.X - 1) && (sucesion.Y == inicio.Y)) { Accion = "avanzarIzq"; } //arriba if ((sucesion.X == inicio.X) && (sucesion.Y == inicio.Y - 1)) { Accion = "saltar"; } //abajo if ((sucesion.X == inicio.X) && (sucesion.Y == inicio.Y + 1)) { // por definir } //derecha-arriba if ((sucesion.X == inicio.X + 1) && (sucesion.Y == inicio.Y - 1)) { if ((area.obtenerSector(new Vector2(inicio.X + 1, inicio.Y)).value == true)) { Accion = "saltarDer"; } else { Accion = "avanzarDer"; } } //derecha-abajo if ((sucesion.X == inicio.X + 1) && (sucesion.Y == inicio.Y + 1)) { Accion = "avanzarDer"; } //izquierda-arriba if ((sucesion.X == inicio.X - 1) && (sucesion.Y == inicio.Y - 1)) { if ((area.obtenerSector(new Vector2(inicio.X - 1, inicio.Y)).value == true)) { Accion = "saltarIzq"; } else { Accion = "avanzarIzq"; } } //izquierda abajo if ((sucesion.X == inicio.X - 1) && (sucesion.Y == inicio.Y + 1)) { Accion = "avanzarIzq"; } //reff = item; // asigna los valores de las posiciones al agente y al player posPlayer = final; posAgent = inicio; return(Accion); }