private void tabla_de_reglas(Vehiculo vehiculo, Percepcion p) { if (vehiculo.Encendido == false) { } else if (p.Calle == null && p.Interseccion == null)//en modo contingencia los vehiculos frenan cuando se salen de las calles Fisica.frenar(vehiculo, vehiculo); else if (p.VehiculoFrente != null) // si hay un vehiculo alfrente entonces frena Fisica.frenar(vehiculo, p.VehiculoFrente); else if (p.Pare != null && p.PasoCebra == null && Fisica.distanciaAEnMetros(vehiculo, p.Pare) > 8 && vehiculo.VelocidadActualKmH < 15) Fisica.acelerar(vehiculo); else if (p.LomoToro != null && vehiculo.VelocidadActualKmH > p.LomoToro.VelocidadRecomendada) Fisica.frenar(vehiculo, p.LomoToro); else if (p.Pare != null && p.PasoCebra != null && Fisica.distanciaAEnMetros(vehiculo, p.PasoCebra) > 9 && vehiculo.VelocidadActualKmH < 15) Fisica.acelerar(vehiculo); else if (p.Pare != null && vehiculo.VelocidadActualKmH != 0 && p.PasoCebra == null)//frenar con signo pare Fisica.frenar(vehiculo, p.Calle); else if (p.Pare != null && vehiculo.VelocidadActualKmH != 0 && p.PasoCebra != null && Fisica.distanciaAEnMetros(vehiculo, p.PasoCebra) > 0.5)//frenar con paso cebra y pare Fisica.frenar(vehiculo, p.PasoCebra); else if (p.Semaforo != null && p.Semaforo.EstadoLuzRoja && p.PasoCebra == null && Fisica.distanciaAEnMetros(vehiculo, p.Semaforo) > 4 && vehiculo.VelocidadActualKmH < 15) Fisica.acelerar(vehiculo); else if (p.Semaforo != null && p.Semaforo.EstadoLuzRoja && p.PasoCebra != null && Fisica.distanciaAEnMetros(vehiculo, p.PasoCebra) > 5 && vehiculo.VelocidadActualKmH < 15) Fisica.acelerar(vehiculo); else if (p.Semaforo != null && p.Semaforo.EstadoLuzRoja && p.PasoCebra == null)//frenar luz roja del cemaforo Fisica.frenar(vehiculo, p.Calle); else if (p.Semaforo != null && p.Semaforo.EstadoLuzRoja && p.PasoCebra != null)//frenar con luz roja del semaforo y paso cebra Fisica.frenar(vehiculo, p.PasoCebra); else if (p.Semaforo != null && p.Semaforo.EstadoLuzAmarilla && p.PasoCebra == null && Fisica.alcanzoFrenar(vehiculo, p.Calle))//frenar luz roja del cemaforo Fisica.frenar(vehiculo, p.Calle); else if (p.Semaforo != null && p.Semaforo.EstadoLuzAmarilla && p.PasoCebra != null && Fisica.alcanzoFrenar(vehiculo, p.PasoCebra))//frenar con luz roja del semaforo y paso cebra Fisica.frenar(vehiculo, p.PasoCebra); else if (p.Bache != null && Fisica.distanciaAEnMetros(vehiculo, p.Bache) > 1)//reducir la velocidad si hay bache Fisica.frenar(vehiculo, p.Bache); //Cuando cumplio el objetivo o cuando no tiene else if (this.siguienteCalle() == 0 && p.Calle != null && vehiculo.caminoRecto() && vehiculo.VelocidadActualKmH > 0) Fisica.frenar(vehiculo, vehiculo); //Espera antes de elegit un nuevo objetivo else if (this.siguienteCalle() == 0 && p.Calle != null && vehiculo.VelocidadActualKmH == 0 && tiempoActual <= tiempoEspera) tiempoActual++; //Crea un nuevo objetivo else if (tiempoActual > tiempoEspera) { origen = -1; destino = -1; crearObjetivo(); } /* //Reglas rotar hacia Sur Intersecciones else if (p.Interseccion != null && p.Interseccion.Sur != null && p.Interseccion.Sur.Id == this.siguienteCalle() && (ultimaAccion == DOBLARSUR || vehiculo.caminoRecto()) && (p.Interseccion.Sur.SentidoCarril1 == Elemento.DE1A2 || p.Interseccion.Sur.SentidoCarril2 == Elemento.DE1A2) && vehiculo.Orientacion != Elemento.NORTE) { ultimaAccion = Fisica.doblarSur(vehiculo, p.Interseccion); trabAprender += 1; } //Reglas rotar hacia Norte Intersecciones else if (p.Interseccion != null && p.Interseccion.Norte != null && p.Interseccion.Norte.Id == this.siguienteCalle() && (ultimaAccion == DOBLARNORTE || vehiculo.caminoRecto()) && (p.Interseccion.Norte.SentidoCarril1 == Elemento.DE2A1 || p.Interseccion.Norte.SentidoCarril2 == Elemento.DE2A1) && vehiculo.Orientacion != Elemento.SUR) { ultimaAccion = Fisica.doblarNorte(vehiculo, p.Interseccion); trabAprender += 1; } //Reglas rotar hacia Oeste Intersecciones else if (p.Interseccion != null && p.Interseccion.Oeste != null && p.Interseccion.Oeste.Id == this.siguienteCalle() && (ultimaAccion == DOBLAROESTE || vehiculo.caminoRecto()) && (p.Interseccion.Oeste.SentidoCarril1 == Elemento.DE2A1 || p.Interseccion.Oeste.SentidoCarril2 == Elemento.DE2A1) && vehiculo.Orientacion != Elemento.ESTE) { ultimaAccion = Fisica.doblarOeste(vehiculo, p.Interseccion); trabAprender += 1; } //Reglas rotar hacia Este Intersecciones else if (p.Interseccion != null && p.Interseccion.Este != null && p.Interseccion.Este.Id == this.siguienteCalle() && (ultimaAccion == DOBLARESTE || vehiculo.caminoRecto()) && (p.Interseccion.Este.SentidoCarril1 == Elemento.DE1A2 || p.Interseccion.Este.SentidoCarril2 == Elemento.DE1A2) && vehiculo.Orientacion != Elemento.OESTE) { ultimaAccion = Fisica.doblarEste(vehiculo, p.Interseccion); trabAprender += 1; } //Corrige la posicion despues de girar else if (p.Calle != null && ultimaAccion == DOBLARSUR) ultimaAccion = Fisica.doblarSur(vehiculo, p.Calle); else if (p.Calle != null && ultimaAccion == DOBLARNORTE) ultimaAccion = Fisica.doblarNorte(vehiculo, p.Calle); else if (p.Calle != null && ultimaAccion == DOBLAROESTE) ultimaAccion = Fisica.doblarOeste(vehiculo, p.Calle); else if (p.Calle != null && ultimaAccion == DOBLARESTE) ultimaAccion = Fisica.doblarEste(vehiculo, p.Calle); */ //Señal de velocidad maxima y recordar lo visto previamente else if (p.Limite != null && p.Calle != null && señales.obtenerSeñaletica(p.Calle.Nombre) == null) { señales.agregarSeñaletica(p.Calle.Nombre, p.Limite); Fisica.avanzar(vehiculo); } else if (p.Calle != null && señales.obtenerSeñaletica(p.Calle.Nombre) != null && vehiculo.VelocidadActualKmH + 2 < señales.obtenerSeñaletica(p.Calle.Nombre).Velocidad) Fisica.acelerar(vehiculo); else if (p.Calle != null && señales.obtenerSeñaletica(p.Calle.Nombre) != null && vehiculo.VelocidadActualKmH - 2 > señales.obtenerSeñaletica(p.Calle.Nombre).Velocidad) Fisica.frenar(vehiculo, p.Calle); else if (p.Calle != null && señales.obtenerSeñaletica(p.Calle.Nombre) != null && (vehiculo.VelocidadActualKmH + 2 >= señales.obtenerSeñaletica(p.Calle.Nombre).Velocidad || vehiculo.VelocidadActualKmH - 2 <= señales.obtenerSeñaletica(p.Calle.Nombre).Velocidad)) Fisica.avanzar(vehiculo); else if (vehiculo.VelocidadActualKmH + 2 < Configuracion.velocidadMaximaUrbano) Fisica.acelerar(vehiculo); else if (vehiculo.VelocidadActualKmH - 2 > Configuracion.velocidadMaximaUrbano) Fisica.frenar(vehiculo, p.Calle); else if (vehiculo.VelocidadActualKmH + 2 >= Configuracion.velocidadMaximaUrbano || vehiculo.VelocidadActualKmH - 2 <= Configuracion.velocidadMaximaUrbano) Fisica.avanzar(vehiculo); }