fbpx

Problema con la property. Módulo 8- Ejercicios propuestos, ejercicio 11

  • Problema con la property. Módulo 8- Ejercicios propuestos, ejercicio 11

    Posted by Leandro Martin Villafuerte on 7 mayo, 2020 en 11:02 pm

    Buenas, me quedé en el ejercicio 11 en donde hay que crear una propiedad en donde se pueda setear el estado de la clase Guerrero para ataque o defensa. No logro que me funcione. El error que me sale es: AttributeError: ‘Guerrero’ object has no attribute ‘_estado’

    Entre las lineas 8 y 17 es en donde no logro que me funcione.

    A continuación dejo el código completo que hice:

    class Guerrero:
    def __init__(self,vida=100,estado_arma=100,estado="Ataque",estado_escudo=100):
    self.vida = vida
    self.estado_arma = estado_arma
    self.estado = estado
    self.estado_escudo = estado_escudo
    @property
    def estado(self):
    return self._estado
    @estado.setter
    def estado(self, estado):
    if self.estado != "Ataque" or self.estado != "Defensa":
    raise ValueError("Los estados sólo pueden ser Ataque o Defensa")
    if self.estado_escudo == 0:
    raise ValueError("El escudo está roto, no puede estar en Defensa")
    self._estado = estado
    @property
    def is_alive(self):
    if self.vida > 0:
    return True
    def atacar(self,guerrero):
    if self.estado_arma >= 2:
    guerrero.vida = guerrero.vida - 20
    self.estado_arma = self.estado_arma - 2
    else:
    print("El arma no funciona")
    pass
    Leandro Martin Villafuerte respondido 2 años, 1 mes 2 Miembros · 2 Respuestas
  • 2 Respuestas
  • Cesar Arteaga Mendoza

    Miembro
    8 mayo, 2020 en 5:13 am

    Buen día Leandro.
    Traté de depurar tu código pero no pude dar con la solución.
    Yo lo realice de una manera distinta y es funcional, acá te dejo el link por si quieres echarle un ojo.
    https://github.com/Chalins200/CursoPython/blob/master/POO/Ejercicio11.py

    Saludos.

    • Leandro Martin Villafuerte

      Miembro
      8 mayo, 2020 en 3:39 pm

      Hola Cesar muchas gracias por la ayuda ya logré que funcione.

      Saludos

      Me quedó así

      class Guerrero:
      def __init__(self,vida=100,estado_arma=100,estado = "ataque",estado_escudo = 100):

      self.vida = vida
      self.estado_arma = estado_arma
      self.estado = estado
      self.estado_escudo = estado_escudo

      @property
      def estado(self):
      return self._estado
      @estado.setter
      def estado(self, cambio):
      if cambio == "ataque" or cambio == "defensa":
      if cambio == "defensa" and self.estado_escudo ==0:
      raise ValueError("No se puede cambiar a defensa, Escudo=0")
      self._estado = cambio
      else: raise ValueError("El estado no existe")

      @property
      def is_alive(self):
      if self.vida > 0:
      return True
      else: return False

      def atacar(self,guerrero):
      if self.is_alive == True:
      if self.estado == "ataque":
      if self.estado_arma >= 2 and guerrero.estado == "ataque":
      guerrero.vida = guerrero.vida - 20
      self.estado_arma = self.estado_arma - 2
      elif self.estado_arma >= 2 and guerrero.estado == "defensa":
      guerrero.estado_escudo = guerrero.estado_escudo - 5
      self.estado_arma = self.estado_arma - 2
      else:
      print("El arma no funciona, Arma=",self.estado_arma)
      else:
      print("El guerrero tiene que estar en ataque")
      else:
      print("El guerrero no está vivo")
      w = Guerrero()
      '''w.estado_escudo = 0
      w.estado = "defensa"
      print(w.estado)'''
      #print(w.is_alive)
      w2 = Guerrero()
      '''w.atacar(w2)
      print("La vida de w2 es",w2.vida)
      print("El estado de arma de w es",w.estado_arma)'''
      '''w.estado_arma = 1
      w.atacar(w2)'''
      '''w2.estado = "defensa"
      w.atacar(w2)
      print("el escudo de w2 es",w2.estado_escudo)
      print("el estado del arma de w es",w.estado_arma)'''
      '''w.estado = "defensa"
      w.atacar(w2)
      print("la vida de w2 es",w2.vida)'''
      '''w.vida = 0
      w.atacar(w2)
      print("La vida de w2 es",w2.vida)'''

Start of Discussion
0 de 0 respuestas Junio 2018
Ahora