def partida_nueva(self): # Tiene que crear una partida a partir de los csv dados inicialmente infeccion = "algo" tipo = ListaLigada("Virus", "Bacteria", "Parasito") while infeccion not in tipo: infeccion = input( "Escoja su tipo de infeccion [Virus-Bacteria-Parasito]: " ).title() if infeccion not in tipo: print( "Intentalo de nuevo, recuerda que debes escoger entre Virus-Bacteria-Parasito" ) self.planeta = Planeta(infeccion) self.planeta.paises = self.planeta.poblar_mundo() for pais in self.planeta: self.planeta.poblacion_mundial += pais.poblacion pais.infeccion = self.planeta.infeccion self.planeta.agregar_aeropuertos() self.planeta.agregar_vecinos() lista_nombres = ListaLigada(*(pais.nombre for pais in self.planeta)) while True: nombre = input( "Desde que país quieres partir la infeccion?: ").title() if nombre in lista_nombres: break else: print("El pais dado no es válido") for pais in self.planeta: if pais.nombre == nombre: pais.infectados = 10
def estadisticas(self): # Resumen del dia: Gente que murio/infecto, a que paises llego la infeccion, # aeropuertos que cerraron, que paises cerraron fronteras y cuales empezaron # a entregar mascarillas # Por pais: estatus general(vivos/inf/muertos) y ver la cola de prioridades del gobierno del dia # Global: Mostrar paises limpios, infectados y muertos y totales de poblacion (v/i/m) # Lista de infecciones y muertes por día # Debe mostrar la tasa de vida y muerte de las personas del día actual o el acumulado hasta la fecha while True: opcion = input("Que estadisticas deseas ver?\n" "1. Resumen del dia\n" "2. Por pais\n" "3. Global\n") try: opcion = int(opcion) if opcion > 3 or opcion < 1: raise ValueError break except ValueError: print("Debes ingresar alguno de los números: 1, 2 o 3") if opcion == 1: print(self.sucesos_dia) elif opcion == 2: lista_nombres = ListaLigada(*(pais.nombre for pais in self.planeta)) while True: nombre = input("Sobre que país quieres saber?: ").title() if nombre in lista_nombres: break else: print("El pais dado no es válido") for pais in self.planeta: if nombre == pais.nombre: estatus = "Vivos: {0}, Infectados: {1}, Muertos: {2}".format( pais.vivos, pais.infectados, pais.muertos) + "\n" estatus += str(pais.gob) print(estatus) else: paises_limpios = ListaLigada(*(pais.nombre for pais in self.planeta if not pais.esta_infectado)) paises_infectados = ListaLigada(*(pais.nombre for pais in self.planeta if pais.esta_infectado)) paises_muertos = ListaLigada(*(pais.nombre for pais in self.planeta if pais.esta_muerto)) vmis = "Vivos/Muertos: {0}/{2}\nSanos/Infectados: {3}/{1}".format( self.planeta.vivos, self.planeta.infectados, self.planeta.muertos, self.planeta.sanos) status = vmis + "\nPaises Limpios:\n" + "\n".join( paises_limpios) + "\nPaises Infectados:\n" + "\n".join( paises_infectados) + "\nPaises Muertos: \n" + "\n".join( paises_muertos) print(status) input("<Presione Enter para continuar>")
def __init__(self, nombre, poblacion, infectados=0, muertos=0): self.nombre = str(nombre).title() self.vecinos = ListaLigada() self.aeropuerto = ListaLigada() self.gob = Gobierno() self.poblacion = int(poblacion) self.infectados = int(infectados) self.muertos = int(muertos) self.cura = False self.infeccion = None self.mascarillas = False self.dias = 0 self.promedio = 0.0 self.respaldos = ListaLigada(None, None)
class Gobierno: def __init__(self): self.cola = ListaLigada() def __repr__(self): return "\n".join(self.cola) def formar_cola(self, pais): cf = Medida(*self.cerrar_fronteras(pais)) ca = Medida(*self.cerrar_aeropuertos(pais)) mm = Medida(*self.mandar_mascarillas(pais)) af = Medida(*self.abrir_fronteras(pais)) if cf.bool: self.cola.append(cf) elif af.bool: self.cola.append(af) if ca.bool: self.cola.append(ca) if mm.bool: self.cola.append(mm) self.cola = self.cola.msort() def cerrar_aeropuertos(self, pais): # basandose en la situacion del pais debe determinar si cierra su aeropuerto # si la mitad esta infectada o un cuarto esta muerto se cierran infectados = pais.porcentaje_infectados muertos = pais.porcentaje_muertos prioridad = 0.8 * infectados return "Cerrar aeropuertos", infectados >= 0.8 or muertos >= 0.2, prioridad def cerrar_fronteras(self, pais): # basandose en la situacion del self.pais debe determinar si se cierran la fronteras terrestres # Se cierran si es que mas del 80% esta infectado o mas del 20% esta muerto infectados = pais.porcentaje_infectados muertos = pais.porcentaje_muertos accion = pais.promedio prioridad = accion * infectados return "Cerrar fronteras", infectados >= 0.5 or muertos >= 0.25, prioridad def mandar_mascarillas(self, pais): # si mas de un tercio de la poblacion esta infectada se mandan mascarillas lo que baja # la tasa de contagiosidad (multiplica por 0.3 la cantidad aleatoria de infectados) infectados = pais.porcentaje_infectados prioridad = 0.5 * infectados return "Mandar mascarillas", infectados >= 0.33, prioridad def abrir_fronteras(self, pais): if pais.cura: prioridad = 1 else: prioridad = pais.porcentaje_infectados * 0.7 return "Abrir fronteras", not (self.cerrar_aeropuertos(pais) or self.cerrar_fronteras(pais)), prioridad
def descubrimiento_infeccion(self): p = self.infeccion.visibilidad * self.infectados * self.muertos**2 / self.poblacion_mundial**3 if p == 1: self.descubierto = True elif p == 0: self.descubierto = False else: fract = int(p * 1000) if fract < 1: self.descubierto = False else: listat = ListaLigada(*(True for i in range(fract))) listaf = ListaLigada(*(False for i in range(1000 - fract))) lista = listaf + listat shuffle(lista) eleccion = randint(0, 1000) self.descubierto = lista[eleccion]
def contagia(self): # a otro pais valor = (7 * self.infectados) / self.vivos p = min(valor, 1) if p == 1: return True else: fract = int(p * 1000) if fract < 1: return False else: listat = ListaLigada(*(bool(i) for i in range(fract))) listaf = ListaLigada(*(not bool(i) for i in range(1000 - fract))) lista = listaf + listat shuffle(lista) eleccion = randint(0, 1000) return lista[eleccion]
def agregar_vecinos(self): with open("borders.csv", "r") as f: archivo = ListaLigada(*f.readlines()[1:]) for linea in archivo: linea = linea.strip() linea = ListaLigada(*linea.split(";")) for pais in self: if linea[0].title() == pais.nombre: pais.vecinos.append(linea[1].title()) if linea[1].title() == pais.nombre: pais.vecinos.append(linea[0].title()) for pais in self: pais.ordenar_vecinos() for elemento in pais.vecinos: if pais.vecinos.count(elemento) > 1: pais.vecinos.remove(elemento) pais.respaldos[1] = pais.vecinos
def poblar_mundo(self): with open("population.csv", "r") as f: archivo = ListaLigada(*f.readlines()[1:]) for i in range(len(archivo)): archivo[i] = archivo[i].strip() archivo[i] = archivo[i].split(",") archivo[i] = Pais(nombre=archivo[i][0], poblacion=archivo[i][1]) return archivo
def agregar_aeropuertos(self): generate_connections() with open("random_airports.csv", "r") as f: archivo = ListaLigada(*f.readlines()[1:]) for linea in archivo: linea = linea.strip() linea = ListaLigada(*linea.split(",")) for pais in self: if linea[0].title() == pais.nombre: pais.aeropuerto.append(linea[1].title()) if linea[1].title() == pais.nombre: pais.aeropuerto.append(linea[0].title()) for pais in self: pais.ordenar_aeropueto() for elemento in pais.aeropuerto: if pais.aeropuerto.count(elemento) > 1: pais.aeropuerto.remove(elemento) pais.respaldos[0] = pais.aeropuerto
def contagio_entre_paises(self): pais_que_contagia = ListaLigada() lista_contagiados = ListaLigada() pais_contagiado = False for pais in self: if pais.contagia: pais_que_contagia.append(pais.nombre) via = randint(0, 1) if via == 0: num = pais.contagiar_aire() pais_contagiado = pais.aeropuerto[num].title() else: num = pais.contagiar_tierra() pais_contagiado = pais.vecinos[num].title() if pais_contagiado: for pais in self: if pais.nombre == pais_contagiado and not pais.esta_infectado: pais.infectados = 10 lista_contagiados.append(pais.nombre) return ListaLigada(lista_contagiados, pais_que_contagia)
def __init__(self): self.cola = ListaLigada()
self.prioridad = prioridad def __repr__(self): return str(self.nombre) + "\n Nivel prioridad: {}".format( self.prioridad) def __eq__(self, other): return self.bool and other.bool and self.prioridad == other.prioridad def __gt__(self, other): return self.bool and other.bool and self.prioridad > other.prioridad def __lt__(self, other): return self.bool and other.bool and self.prioridad < other.prioridad def __le__(self, other): return self.bool and other.bool and self.prioridad <= other.prioridad def __ge__(self, other): return self.bool and other.bool and self.prioridad >= other.prioridad def __ne__(self, other): return self.bool and other.bool and self.prioridad != other.prioridad if __name__ == "__main__": lista = ListaLigada() for i in range(10): lista.append(Medida("", True, i + randint(0, 10))) lista = lista.msort() print(lista)
def pasar_dia(self): # tiene que considerar muertes de humanos, infecciones de humanos, # traslado de la infeccion a otro pais, mejora de la cura, # traslado de la cura, cerrar aeropuertos o fronteras # y entrega de mascarillas infectados_iniciales = self.planeta.infectados muertos_iniciales = self.planeta.muertos cerraron_aeropuertos = ListaLigada() cerraron_fronteras = ListaLigada() entrego_mascarillas = ListaLigada() for pais in self.planeta: pais.gob.formar_cola(pais) try: medidas = pais.gob.cola[0:3] for i in range(3): pais.gob.cola.pop(0) except IndexError: medidas = pais.gob.cola[0:] pais.gob.cola.clear() for medida in medidas: if medida.nombre == "Cerrar aeropuertos": for otro in self.planeta: if otro.nombre in pais.aeropuerto: otro.aeropuerto.remove(pais.nombre) pais.aeropuerto.clear() cerraron_aeropuertos.append(pais.nombre) elif medida.nombre == "Cerrar fronteras": for otro in self.planeta: if otro.nombre in pais.vecinos: otro.vecinos.remove(pais.nombre) pais.vecinos.clear() cerraron_fronteras.append(pais.nombre) elif medida.nombre == "Abrir fronteras": pais.aeropuerto, pais.vecinos = pais.respaldos for otro in self.planeta: if otro.nombre in pais.vecinos: otro.vecinos.append(pais.nombre) elif otro.nombre in pais.aeropuerto: otro.aeropuerto.append(pais.nombre) elif medida.nombre == "Mandar mascarillas": pais.infeccion.contagiosidad *= 0.3 entrego_mascarillas.append(pais.nombre) pais.muerte() pais.contagio_interno() self.planeta.descubrimiento_infeccion() muertos_dia = self.planeta.muertos - muertos_iniciales infectados_dia = self.planeta.infectados - infectados_iniciales datos_dia = ListaLigada( "Infectados del dia: {}".format(infectados_dia), "Muertos del dia : {}".format(muertos_dia)) contagio_paises = self.planeta.contagio_entre_paises() if len(contagio_paises[0]) > 0 and len(contagio_paises)[1] > 0: for nombre_pais, otro_pais in contagio_paises: print("{0} contagio a {1}".format(nombre_pais, otro_pais)) contagio_paises = contagio_paises[0].msort() cerraron_aeropuertos = cerraron_aeropuertos.msort() cerraron_fronteras = cerraron_fronteras.msort() entrego_mascarillas = entrego_mascarillas.msort() if self.planeta.cura >= 100 and not self.planeta.implantado: self.planeta.implantar_cura() if self.planeta.descubierto: self.planeta.progreso_cura() self.planeta.actualizar_promedio() self.sucesos_dia = "\n".join(datos_dia) + "\nPaises infectados hoy:\n " + "\n".join(contagio_paises) + \ "\nPaises que cerraron fronteras:\n" + "\n".join(cerraron_fronteras) + \ "\nPaises que cerraron aeropuerto: \n" + "\n".join(cerraron_aeropuertos) + "\nPaises que" \ " repartieron mascarillas: \n" + "\n".join(entrego_mascarillas)
class Pais: def __init__(self, nombre, poblacion, infectados=0, muertos=0): self.nombre = str(nombre).title() self.vecinos = ListaLigada() self.aeropuerto = ListaLigada() self.gob = Gobierno() self.poblacion = int(poblacion) self.infectados = int(infectados) self.muertos = int(muertos) self.cura = False self.infeccion = None self.mascarillas = False self.dias = 0 self.promedio = 0.0 self.respaldos = ListaLigada(None, None) @property def porcentaje_infectados(self): return self.infectados / self.poblacion @property def porcentaje_muertos(self): return self.muertos / self.poblacion @property def sanos(self): return self.poblacion - self.infectados @property def vivos(self): return self.poblacion - self.muertos @property def esta_infectado(self): if self.infectados > 0: return True else: return False @property def esta_muerto(self): if self.muertos == self.poblacion: return True else: return False def ordenar_aeropueto(self): self.aeropuerto = self.aeropuerto.msort() def ordenar_vecinos(self): self.vecinos = self.vecinos.msort() @property def contagia(self): # a otro pais valor = (7 * self.infectados) / self.vivos p = min(valor, 1) if p == 1: return True else: fract = int(p * 1000) if fract < 1: return False else: listat = ListaLigada(*(bool(i) for i in range(fract))) listaf = ListaLigada(*(not bool(i) for i in range(1000 - fract))) lista = listaf + listat shuffle(lista) eleccion = randint(0, 1000) return lista[eleccion] def contagiar_aire(self): if len(self.aeropuerto) != 0 and self.esta_infectado: pais_contagio = randint(0, len(self.aeropuerto)) return int(pais_contagio) def contagiar_tierra(self): if len(self.vecinos) != 0 and self.esta_infectado: pais_contagio = randint(0, len(self.vecinos)) return int(pais_contagio) def contagio_interno(self): if self.infectados: random = randint(0, 6) if self.mascarillas: random *= 0.3 self.infectados *= int(self.infeccion.contagiosidad * random) def esparcir_cura(self): if self.cura: p = 0.25 p *= self.infeccion.resistencia self.infectados = int(self.infectados - self.infectados * p) def muerte(self): if self.esta_infectado: p = min( max(0.2, (self.dias**2) / 100000) * self.infeccion.mortalidad, 1) muertos = self.infectados * p self.infectados = int(self.infectados - muertos) self.muertos = int(self.muertos + muertos) if self.muertos > self.poblacion: self.muertos = self.poblacion