Skip to content

Commit

Permalink
Verifica si no se puede llegar en la itteracion activ
Browse files Browse the repository at this point in the history
  • Loading branch information
Diego Jara committed Jul 9, 2017
1 parent 69ef9a0 commit 9b86bc6
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 28 deletions.
Binary file modified Assets/Escenas/Batalla.unity
Binary file not shown.
84 changes: 56 additions & 28 deletions Assets/Scripts/Algoritmos/Posiciones.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,26 @@

public class Posiciones : MonoBehaviour {

// Si la posicion contiene una pared, una bomba o una explosión
static bool devuelvecolisionador(Vector3 posicion) {

Collider[] objetos = Physics.OverlapSphere(posicion, .25f);
foreach (Collider objeto in objetos) {
if (objeto.CompareTag("Block") || objeto.CompareTag("Explosion") || objeto.CompareTag("BombCollider")) {
return true;
}
}

return false;
}


public static Vector3 BuscarPosicionSegura(Vector3 comienzo_mundo, bool[,] posiciones_muerte = null) {

Vector3 comienzo = new Vector3();
comienzo.x = Mathf.FloorToInt(comienzo_mundo.x);
comienzo.x = Mathf.Round(comienzo_mundo.x);
comienzo.y = comienzo_mundo.y;
comienzo.z = Mathf.FloorToInt(comienzo_mundo.z);
comienzo.z = Mathf.Round(comienzo_mundo.z);

// Arreglo para saber que posiciones seran afectadas por
if (posiciones_muerte == null) {
Expand All @@ -21,27 +35,15 @@ public static Vector3 BuscarPosicionSegura(Vector3 comienzo_mundo, bool[,] posic
Vector3 activo = comienzo;

// Consultamos la seguridad de las 4 posiciones adyacentes
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
for (int x = -1; x <= 1; x++) {
for (int z = -1; z <= 1; z++) {

// No exploramos las diagonales
if (Mathf.Abs(i) == Mathf.Abs(j)) continue;
if (Mathf.Abs(x) == Mathf.Abs(z)) continue;

Vector3 siguiente_posicion = new Vector3(activo.x + i, activo.y, activo.z + j);
Vector3 siguiente_posicion = new Vector3(activo.x + x, activo.y, activo.z + z);

Collider[] objetos = Physics.OverlapSphere(siguiente_posicion, .25f);

bool choca_con_objeto = false;

// Si la posicion contiene una pared, una bomba o una explosión
foreach (Collider objeto in objetos) {

if (objeto.CompareTag("Block") || objeto.CompareTag("Explosion") || objeto.CompareTag("BombCollider")) {
choca_con_objeto = true;
break;
}
}
if (choca_con_objeto) continue;
if (devuelvecolisionador(siguiente_posicion)) continue;

// No choca con nigun objeto
// Llega a una posicion libre, pero todavia no se sabe si es segura
Expand All @@ -51,15 +53,41 @@ public static Vector3 BuscarPosicionSegura(Vector3 comienzo_mundo, bool[,] posic
if (posiciones_muerte[(int)siguiente_posicion.x, (int)siguiente_posicion.z]) continue;

GameObject[] bombas = GameObject.FindGameObjectsWithTag("Bomb");
Bomba bomba = bombas[bombas.Length - 1].GetComponent<Bomba>();

if (
(bomba.transform.position.z == siguiente_posicion.z && bomba.transform.position.x + bomba.longitud_propagacion >= siguiente_posicion.x) ||
(bomba.transform.position.z == siguiente_posicion.z && bomba.transform.position.x + bomba.longitud_propagacion <= siguiente_posicion.x) ||
(bomba.transform.position.x == siguiente_posicion.x && bomba.transform.position.z + bomba.longitud_propagacion >= siguiente_posicion.z) ||
(bomba.transform.position.x == siguiente_posicion.x && bomba.transform.position.z + bomba.longitud_propagacion <= siguiente_posicion.z)
)
{ // Estoy al alcanze de una explosion, no puedo quedarme aca

bool peligro_explosion = false;

foreach (GameObject bomba_gameObject in bombas) {

Bomba bomba = bomba_gameObject.GetComponent<Bomba>();

if (bomba.transform.position.z == siguiente_posicion.z && siguiente_posicion.x >= bomba.transform.position.x && bomba.transform.position.x + bomba.longitud_propagacion >= siguiente_posicion.x)
peligro_explosion = true;
if (bomba.transform.position.z == siguiente_posicion.z && siguiente_posicion.x <= bomba.transform.position.x && bomba.transform.position.x - bomba.longitud_propagacion <= siguiente_posicion.x)
peligro_explosion = true;
if (bomba.transform.position.x == siguiente_posicion.x && siguiente_posicion.z >= bomba.transform.position.z && bomba.transform.position.z + bomba.longitud_propagacion >= siguiente_posicion.z)
peligro_explosion = true;
if (bomba.transform.position.x == siguiente_posicion.x && siguiente_posicion.z <= bomba.transform.position.z && bomba.transform.position.z - bomba.longitud_propagacion <= siguiente_posicion.z)
peligro_explosion = true;
}

if (peligro_explosion) { // Estoy al alcanze de una explosion, no puedo quedarme aca

// Antes de hacer recursivdad, verifica si hay una solucion antes de terminar esta iteracion
for (int xx = x; xx <= 1; xx++) {
for (int zz = z + 1; zz <= 1; zz++) {
if (Mathf.Abs(xx) == Mathf.Abs(zz)) continue;

Vector3 siguiente_posicion_acortada = new Vector3(comienzo.x + xx, comienzo.y, comienzo.z + zz);

if (posiciones_muerte[(int)siguiente_posicion_acortada.x, (int)siguiente_posicion_acortada.z]) continue;

if (devuelvecolisionador(siguiente_posicion_acortada) == false) {
return siguiente_posicion_acortada;
}

}
}

Vector3 posicion_backtrack = BuscarPosicionSegura(siguiente_posicion, posiciones_muerte);

if (posicion_backtrack == Vector3.zero) {
Expand Down

0 comments on commit 9b86bc6

Please sign in to comment.