Простой способ уменьшить значения без создания нового атрибута? - PullRequest
1 голос
/ 06 апреля 2010

Я делаю программу, в которой вы стреляете из бластера, и у меня 5 патронов. Я уничтожаю иностранца, у которого есть 5 единиц здоровья. В конце я создаю экземпляр игрока и заставляю его взорвать 6 раз, чтобы убедиться, что программа работает правильно. Но то, как я это сделал, делает так, чтобы сумма не уменьшалась. Легко ли это исправить, или мне просто нужно придать новый атрибут патронам и здоровью? Вот что у меня есть:

class Player(object):
""" A player in a shooter game. """
def blast(self, enemy, ammo=5):
    if ammo>=1:
        ammo-=1
        print "You have blasted the alien."
        print "You have", ammo, "ammunition left."
        enemy.die(5)
    else:
        print "You are out of ammunition!"


class Alien(object):
    """ An alien in a shooter game. """
    def die(self, health=5):
        if health>=1:
            health-=1
            print "The alien is wounded. He now has", health, "health left."
        elif health==0:
            health-=1
            print "The alien gasps and says, 'Oh, this is it.  This is the big one. \n" \
                  "Yes, it's getting dark now.  Tell my 1.6 million larvae that I loved them... \n" \
                  "Good-bye, cruel universe.'"
        else:
            print "The alien's corpse sits up momentarily and says, 'No need to blast me, I'm dead already!"

# main
print "\t\tDeath of an Alien\n"

hero = Player()
invader = Alien()
hero.blast(invader)
hero.blast(invader)
hero.blast(invader)
hero.blast(invader)
hero.blast(invader)
hero.blast(invader)

raw_input("\n\nPress the enter key to exit.")

Ответы [ 5 ]

6 голосов
/ 06 апреля 2010

Подумайте об этом: количество доступных боеприпасов является частью состояния игрока. Состояние объекта лучше всего представить в виде переменных экземпляра этого объекта. Поэтому вы должны , а не иметь ammo в качестве аргумента blast - в этом методе он должен быть self.ammo, инициализироваться 5 или любым другим значением в __init__, которое вы забыли кодировать ;-) .

Дело не в поиске причудливых обходных путей, чтобы скрыть и спрятать это состояние где-то в другом месте, а в том, чтобы делать вещи самым простым, простым и эффективным способом. Зачем тебе когда-либо хотеть чего-нибудь, кроме такого пути?!

3 голосов
/ 06 апреля 2010

Вам необходимо следить за здоровьем пришельца.Все, что вы сейчас делаете, это уменьшаете локальную переменную «health» в функции Alien.die.

Вот небольшой фрагмент, который поможет вам двигаться в правильном направлении:

class Alien(object):
    def __init__(self):
        self.health = 5
    def do_damage(self, amount):
        self.health -= amount

Аналогичное отслеживание требуется для боеприпасов игрока.

1 голос
/ 25 апреля 2011

Я просто модифицирую вышеуказанную программу, сделав 2 атрибута с именами ammo и health Я думаю, что они делают программу настолько легкой. Попробуйте разные результаты, изменив начальные значения атрибутов.

class Player(object):
""" A player in a shooter game. """ 
def __init__(self, ammo):
    self.ammo = ammo

def blast(self, enemy):
    if enemy.health > 0:
        if self.ammo > 0:
            print "The player has blasted the alien.\n"
            print "The player has", self.ammo, "ammunition left."
            enemy.die()  
        elif self.ammo == 0:
            print "The player can't blast the alien because he is out of ammunition.\n"
        self.ammo -= 1

class Alien(object):
""" An alien in a shooter game. """ 
def __init__(self, health):
    self.health = health

def die(self):
    if self.health > 0:
        self.health -= 1
        print "The alien is wounded. He now has", self.health, "health left.\n"
    if self.health == 0:
        self.health -= 1
        print "The alien gasps and says, 'Oh, this is it. This is the big one. \n"\
          "Yes, it's getting dark now. Tell my 1.6 million larvae that I "\
          "loved them...\nGood-bye, cruel universe.'\n"
    elif self.health < 0:
        print "The alien's corpse sits up momentarily and says, 'No need to blast me, I'm dead already!"

print "\t\tDeath of an Alien\n"
hero = Player(6)
invader = Alien(3)
blast = int(raw_input("How many times do you want to blast the alien? "))
for cnt in range(blast - 1):
    hero.blast(invader)
0 голосов
/ 06 апреля 2010

В class Player в методе с именем blast() ваши ссылки на ammo неверны. Вы хотите сослаться на self.ammo во всех случаях в пределах определения этой функции / метода.

Кроме того, вы, вероятно, (почти наверняка) определите метод __init__, чтобы установить начальное значение боеприпасов на 5 (и, возможно, позже предоставите метод reload() для установки self.ammo обратно на 5 ... и т. Д. .

0 голосов
/ 06 апреля 2010

Возможно, вы хотите сделать что-то вроде этого:

class Player:

   def __init__(self, ammo=5):
      self.ammo=ammo

   def blast(self, enemy):
      if self.ammo>0:
         self.ammo-=1
         enemy.die(5)
      else:
         print "U are out of ammunition!"

Вам нужно использовать self.health и для пришельца.

...