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)
Exemple #4
0
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
Exemple #5
0
 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]
Exemple #7
0
 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
Exemple #8
0
 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
Exemple #9
0
 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
Exemple #10
0
 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)
Exemple #11
0
 def __init__(self):
     self.cola = ListaLigada()
Exemple #12
0
        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