Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Ejercicio clases Aldea y Dragon
#1
Enunciado:
Crear la clase aldea y dragón.
Hacer que el dragón ataque una aldea y preguntarle a la aldea cuántos edificios tiene antes y después del ataque.

Código:
import random
class Aldea():
    def __init__(self):
        self.edificios = random.randint(20, 100)

class Dragon(Aldea):
    def __init__(self):
        super().__init__()

    def atacar(self):
        self.edificios = self.edificios - 15
        print("El dragon ha destruido 15 edificios")


dragon = Dragon()
aldea = Aldea()
print(aldea.edificios)
dragon.atacar()
print(aldea.edificios)

Hola gente, he investigado como resolverlo pero no he encontrado soluciones. No encuentro la forma de que la clase Dragon pueda modificar el atributo edificios de la clase Aldea. Desde ya muchas gracias. Saludos
Responder
#2
Hola, bienvenido.

No creo que sea un problema para resolver con herencia. La herencia implica que una clase hija hereda los métodos y atributos de la clase padre (por ejemplo, las clases Estudiante y Profesor podrían heredar de la clase Persona, porque tanto los estudiantes como los profesores son personas). Si Dragon hereda de Aldea, entonces Dragon va a tener su propio atributo edificios, pero no va a tener acceso al atributo edificios de Aldea. Lo más adecuado aquí sería que el método atacar() reciba como argumento la aldea a la cual se quiere atacar:

Código:
import random

class Aldea:
    def __init__(self):
        self.edificios = random.randint(20, 100)

class Dragon:

    def atacar(self, aldea):
        aldea.edificios = aldea.edificios - 15
        print("El dragon ha destruido 15 edificios")

dragon = Dragon()
aldea = Aldea()
print(aldea.edificios)
dragon.atacar(aldea)
print(aldea.edificios)

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
Brick 
Muchas gracias fue de mucha ayuda!
De casualidad sabes como importar clases de otros archivos

Quiero que el programa se pueda ejecutar en el archivo principal "a"
Por ejemplo en el archivo principal "a" tengo el menu utilzando metodos de las clases.
En el archivo  "b" tengo la clase Aldea
En el archivo "c" Tengo la clase Dragon

Yo lo intente asi:
Archivo a
Código:
from b import Aldea
from c import Dragon
while True:

        eleccion = int(input("En las oscuras tierras de las brujas y los trolls, vivía hace mucho tiempo el dragón más terrible que nunca existió.\n"
        "Sus mágicos poderes le permitían ser como una nube, para moverse rápido como el viento, ser ligero como una pluma y tomar cualquier forma,\n"
        "desde una simple ovejita, a un feroz ogro. Y por ser un dragón nube, era el único capaz de lanzar por su boca no sólo llamaradas de fuego,\n"
        "sino brillantes rayos de tormenta.\n\n"
        "El dragon se encuentra en su forma base\n"
        "Que forma desea que adopte el dragon?\n"
                    "1- Quedarse como dragon\n"
                    "2- Nube\n"
                    "3- Ogro\n"
                    "4- Oveja\n"))

        if eleccion == 1:
            forma1 = "dragon"
            print("El dragon se queda en su forma base")
            break
        elif eleccion == 2:
            forma1 = "nube"
            print("El dragon se ha transformado en nube")
            break
        elif eleccion == 3:
            forma1 = "ogro"
            print("El dragon se ha transformado en ogro")
            break
        elif eleccion == 4:
            forma1 = "oveja"
            print("El dragon se ha transformado en oveja")
            break
        else:
            print("Opcion incorrecta, Por favor seleccione una opcion correcta")

nube = Dragon(forma1)
aldea1 = Aldea()
aldea2 = Aldea()
while True:

    opcion = int(input("*** MENU PRINCIPAL ***:\n"
    "1- Consultar Energia del Dragón\n"
    "2- Consultar Distancia a la Aldea\n"
    "3- Consultar cuantos edificios tiene la aldea\n"
    "4- Preguntar cuanto tarda el Dragón en viajar a la aldea\n"
    "5- Preguntar cuantas calorias gasta el Dragón en viajar a la aldea\n"
    "6- Hacer que el Dragón duerma\n"
    "7- Hacer que el Dragón hiberne\n"
    "8- salir\n"))
    if opcion == 1:
        print("El dragon tiene", nube.calorias, "calorias")
    elif opcion == 2:
        print("La distancia a la aldea es", aldea1.distancia, "km")
    elif opcion == 3:
        aldea1.mostrar_edificios()
    elif opcion == 4:
        nube.cuanto_tarda(aldea1)
    elif opcion == 5:
        nube.cuantas_calorias(aldea1)
    elif opcion == 6:
        nube.dormir()
    elif opcion == 7:
        nube.hibernar()
    elif opcion ==8:
        print("FIN DEL JUEGO")
        break
    else:
        print("Opcion incorrecta, Por favor seleccione una opcion correcta")

# PUNTO 6

while True:

    opcion = int(input("*** MENU PRINCIPAL ***:\n"
    "1- Consultar Energia\n"
    "2- Consultar Distancia a la Aldea 1\n"
    "3- Consultar Distancia a la Aldea 2\n"
    "4- Consultar cuantos edificios tiene la aldea 1\n"
    "5- Consultar cuantos edificios tiene la aldea 2\n"
    "6- Preguntar cuanto tarda el Dragón en viajar a la aldea\n"
    "7- Preguntar cuanto tarda el Dragón en viajar a la aldea 2\n"
    "8- Preguntar cuantas calorias gasta el Dragón en viajar a la aldea 1\n"
    "9- Preguntar cuantas calorias gasta el Dragón en viajar a la aldea 2\n"
    "10- Hacer que el Dragón duerma\n"
    "11- Hacer que el Dragón hiberne"
    "12- salir\n"))
    if opcion == 1:
        print("El dragon tiene", nube.calorias, "calorias")
    elif opcion == 2:
        aldea1.mostrar_distancia()
    elif opcion == 3:
        aldea2.mostrar_distancia()
    elif opcion == 4:
        aldea1.mostrar_edificios()
    elif opcion == 5:
        aldea2.mostrar_edificios()
    elif opcion == 6:
        nube.cuanto_tarda(aldea1)
    elif opcion == 7:
        nube.cuanto_tarda(aldea2)
    elif opcion == 8:
        nube.cuantas_calorias(aldea1)
    elif opcion == 9:
        nube.cuantas_calorias(aldea2)
    elif opcion == 10:
        nube.dormir()
    elif opcion == 11:
        nube.hibernar()
    elif opcion == 12:
        print("FIN DEL JUEGO")
        break
    else:
        print("Opcion incorrecta, Por favor seleccione una opcion correcta")
Archivo B:
Código:
import random


class Aldea():
    def __init__(self):
        #Atributos
        self.distancia = random.randint(500, 5000)
        self.edificios = random.randint(20, 100)

    def mostrar_distancia(self):
        print("La distancia a la aldea es {0} km".format(self.distancia))

    def mostrar_edificios(self):
        print("La aldea tiene {0} edificios".format(self.edificios))
Archivo C:
Código:
from a import aldea1,aldea2
class Dragon():
    def __init__(self, forma):
        #Atributos
        self.forma = forma
        self.calorias = 50000

        #Metodos
    def cuanto_tarda(self, aldea):
        if aldea == aldea1:
            if self.forma == "nube":
                tiempo = aldea1.distancia/500
                tiempo = round(tiempo, 1)
                print("Tardara {0} horas en llegar a la aldea".format(tiempo))
            elif self.forma == "dragon":
                tiempo = aldea1.distancia/75
                tiempo = round(tiempo, 1)
                print("Tardara {0} horas en llegar a la aldea".format(tiempo))
            elif self.forma == "ogro":
                tiempo = aldea1.distancia/2
                tiempo = round(tiempo, 1)
                print("Tardara {0} horas en llegar a la aldea".format(tiempo))
            elif self.forma == "oveja":
                tiempo = aldea1.distancia/5
                tiempo = round(tiempo, 1)
                print("Tardara {0} horas en llegar a la aldea".format(tiempo))
        elif aldea == aldea2:
            if self.forma == "nube":
                tiempo = aldea2.distancia/500
                tiempo = round(tiempo, 1)
                print("Tardara {0} horas en llegar a la aldea".format(tiempo))
            elif self.forma == "dragon":
                tiempo = aldea2.distancia/75
                tiempo = round(tiempo, 1)
                print("Tardara {0} horas en llegar a la aldea".format(tiempo))
            elif self.forma == "ogro":
                tiempo = aldea2.distancia/2
                tiempo = round(tiempo, 1)
                print("Tardara {0} horas en llegar a la aldea".format(tiempo))
            elif self.forma == "oveja":
                tiempo = aldea2.distancia/5
                tiempo = round(tiempo, 1)
                print("Tardara {0} horas en llegar a la aldea".format(tiempo))

    def cuantas_calorias(self, aldea):
        if aldea == aldea1:
            if (self.forma == "nube") or (self.forma == "dragon"):
                k = 2 * aldea1.distancia + (2000 * (aldea1.distancia / 100))
                print("Gastara {0} calorias en viajar a la aldea".format(k))
            elif self.forma == "oveja":
                k = 2 * aldea1.distancia + 1 * aldea1.distancia
                print("Gastara {0} calorias en viajar a la aldea".format(k))
            elif self.forma == "ogro":
                k = 2 * aldea1.distancia + 25 * aldea1.distancia
                print("Gastara {0} calorias en viajar a la aldea".format(k))
            while True:
                op = int(input("Desea viajar a la aldea?\n"
                               "1- SI \n"
                               "2- NO \n"))
                if op == 1:
                    if self.calorias >= k:
                        self.calorias = self.calorias - k
                        print("El dragon viajo a la aldea ")
                        while True:
                            op2 = int(input("Desea atacar la aldea? \n"
                                        "1- SI\n"
                                        "2- NO\n"))
                            if op2 == 1:
                                self.atacar(aldea)
                            elif op2 == 2:
                                print("El dragon no ataco la aldea")
                                break
                            else:
                                print("Opcion incorrecta por favor seleccione una opcion correcta")
                    else:
                        print("El dragon no tiene suficiente energia para viajar a la aldea")
                        break
                elif op == 2:
                    print("El dragon no ha viajado a la aldea")
                    break
                else:
                    print("Opcion incorrecta por favor seleccione una opcion correcta")
        elif aldea == aldea2:
            if (self.forma == "nube") or (self.forma == "dragon"):
                k = 2 * aldea2.distancia + (2000 * (aldea2.distancia / 100))
                print("Gastara {0} calorias en viajar a la aldea".format(k))
            elif self.forma == "oveja":
                k = 2 * aldea2.distancia + 1 * aldea2.distancia
                print("Gastara {0} calorias en viajar a la aldea".format(k))
            elif self.forma == "ogro":
                k = 2 * aldea2.distancia + 25 * aldea2.distancia
                print("Gastara {0} calorias en viajar a la aldea".format(k))
            while True:
                op = int(input("Desea viajar a la aldea?\n"
                               "1- SI \n"
                               "2- NO \n"))
                if op == 1:
                    if self.calorias >= k:
                        self.calorias = self.calorias - k
                        print("El dragon viajo a la aldea ")
                        while True:
                            op2 = int(input("Desea atacar la aldea? \n"
                                            "1- SI\n"
                                            "2- NO\n"))
                            if op2 == 1:
                                self.atacar(aldea)
                            elif op2 == 2:
                                print("El dragon no ataco la aldea")
                                break
                            else:
                                print("Opcion incorrecta por favor seleccione una opcion correcta")
                    else:
                        print("El dragon no tiene suficiente energia para atacar la aldea")
                        break
                elif op == 2:
                    print("El dragon no ha viajado a la aldea")
                    break
                else:
                    print("Opcion incorrecta por favor seleccione una opcion correcta")

    def dormir(self):
        self.calorias = self.calorias + 100*7
        print("El dragon ha dormido 7 horas")

    def hibernar(self):
        self.calorias = self.calorias + 50000
        print("El dragon ha dormido 1 mes")

    def atacar(self, aldea):
        if self.calorias >= 500:
            self.calorias = self.calorias - 500
            if aldea == aldea1:
                if self.forma == "nube":
                    aldea1.edificios = aldea1.edificios - 1
                    print("El dragon ha atacado la aldea y ha destruido 1 edificio")
                elif self.forma == "dragon":
                    aldea1.edificios = aldea1.edificios - 5
                    print("El dragon ha atacado la aldea y ha destruido 5 edificios")
                elif self.forma == "ogro":
                    aldea1.edificios = aldea1.edificios - 7
                    print("El dragon ha atacado la aldea y ha destruido 7 edificios")
                elif self.forma == "oveja":
                    aldea1.edificios = aldea1.edificios
                    print("El dragon ha atacado la aldea pero no ha destruido ningun edificio")
            elif aldea == aldea2:
                if self.forma == "nube":
                    aldea2.edificios = aldea2.edificios - 1
                    print("El dragon ha atacado la aldea y ha destruido 1 edificio")
                elif self.forma == "dragon":
                    aldea2.edificios = aldea2.edificios - 5
                    print("El dragon ha atacado la aldea y ha destruido 5 edificios")
                elif self.forma == "ogro":
                    aldea2.edificios = aldea2.edificios - 7
                    print("El dragon ha atacado la aldea y ha destruido 7 edificios")
                elif self.forma == "oveja":
                    aldea2.edificios = aldea2.edificios
                    print("El dragon ha atacado la aldea pero no ha destruido ningun edificio")
        else:
            print("El dragon no tiene suficiente energia para atacar la aldea")
En el archivo c estoy usando las variables aldea1 y aldea2 que se definen en el menu pero no me funciona
Me sale el error "most likely due to a circular import". Gracias por tu tiempo!
Responder
#4
El problema es que tenés circularidad en la importación. El módulo A importa la clase Dragon del módulo C, pero el módulo C importa aldea1 y aldea2 del módulo A. Ahí hay una mala decisión de diseño. La clase Dragon no debería importar ninguna idea en particular, sino solo trabajar con las aldeas que recibe como argumento y así solucionarías el problema de importación. Habría que pensar cómo diseñarlo en el caso particular de tu código, pero eso ya excede al problema de las clases en sí. En tal caso lo podés plantear como un problema aparte en otro tema.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)