Пытаясь поднять уровень игры и использовать нового врага

#python

Вопрос:

Я пытаюсь использовать нового врага каждый раз, когда герой повышается. Сам код работает без проблем. Уровень игрока повышается, он использует магию и ману, враг наносит ответный удар и все такое прочее. Я просто не могу придумать, как бросать нового врага каждый раз, когда игрок убивает врага. Есть какие-нибудь идеи?

 class Character:
     def __init__(self, name, health, level):
          self.name = name
          self.health = health
          self.level = level
          self.levelup_counter = level   1

     def attack(self):
          c2.health -= 2

c1 = Character("Hero", 10, 1)
c2 = Character("Monster 1", 10, 2)
c3 = Character("Monster 2", 20, 3)
c4 = Character("Monster 3", 40, 4)
# monster_list = [c2,c3,c4]

def stats():
    print("_______________________________________")
    print("Your stats ttEnemy Stats")
    print("---------------------------------------")
    print(f"Health: {c1.health}ttHealth: {c2.health}")
    print(f"Level: {c1.level}ttLevel: {c2.level}")

while True:
     attack = input("Enter 1 to attack: ")
     c1.attack()
     stats()
     if c2.health == 0:
          c1.level  = 1
          print("YOu killed the monster!nYou leveled up!")
          continue
 

Обновить:

Обновить:

Я внес несколько изменений и добавил цикл for для повторения списка монстров. Теперь у меня две проблемы. Во-первых, монстры продолжают повторяться (очевидно) вместо того, чтобы просто один монстр сражался до смерти. Затем появится новый монстр. Во-вторых, я не могу удалить монстра из списка после смерти. Я получаю ошибку «Ошибка типа: объект «Символ» не может быть интерпретирован как целое число»

 class Character:
     def __init__(self, name, health, level):
          self.name = name
          self.health = health
          self.level = level
          self.levelup_counter = level   1
     def attack(self):
          m.health -= 2
     def monster_death(self):
          if m.health == 0:
               monster_list.pop(m)


c1 = Character("Hero", 10, 1)
c2 = Character("Monster 1", 10, 2)
c3 = Character("Monster 2", 20, 3)
c4 = Character("Monster 3", 40, 4)

monster_list = [c2,c3,c4]

def stats():
    print("_______________________________________")
    print("Your stats ttEnemy Stats")
    print("---------------------------------------")
    print(f"Health: {c1.health}ttHealth: {m.health}")
    print(f"Level: {c1.level}ttLevel: {m.level}")

i=0
while True:
     i =1
     for m in monster_list:
          attack = input("Enter 1 to attack: ")
          c1.attack()
          stats()
          if m.health == 0:
               c1.level  = 1
               print("YOu killed the monster!nYou leveled up!")
               m.monster_death()
               continue
 

Комментарии:

1. сохраняйте элементы в списке и используйте for цикл для работы с ними, а затем вы можете добавить нового врага в список или удалить его, когда он умер. И со списком у вас может быть больше врагов на каждом уровне.

2. @furas Да, это не совсем сработало. Я обновляю код.

3. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Обратная связь») в вопрос (не комментарий) в виде текста (не скриншот, не ссылка на внешний портал). Есть и другая полезная информация.

4. если вы хотите one monster fighting until death , то всегда используйте monster_list[0] вместо for -loop. И когда это смерть, тогда также удаляйте monster_list[0] . И новые пользователи добавляются в конце списка.

5. pop() нуждается в указателе в списке, но m является объектом Character — вы должны скорее использовать remove() monster_list.remove(m) или, скорее, с self monster_list.remove(self)

Ответ №1:

Чтобы исправить первую проблему, просто добавьте цикл while для каждого монстра, который продолжается до тех пор, пока здоровье не станет меньше или равно 0. Я показал это в приведенном ниже коде. Кроме того, ваш счетчик «я» был полностью неиспользован из того, что я мог сказать.

 while True:
     for m in monster_list:
          while m.health > 0:
               attack = input("Enter 1 to attack: ")
               c1.attack()
               stats()
               if m.health <= 0:
                    c1.level  = 1
                    print("YOu killed the monster!nYou leveled up!")
                    m.monster_death()
 

Что касается второй проблемы с удалением монстров из списка, я думаю, что это плохая идея, пока вы повторяете цикл for. Удалив монстров из списка во время их просмотра, вы получите ошибки индексирования, и он пропустит монстра номер 3. Если вы хотите избавиться от ошибки, которую вы получаете, просто измените эту строку: monster_list.pop(m) на monster_list.remove(m) .

То, что сказал @furas выше, является хорошим предложением. Вы могли бы сделать что-то вроде этого (псевдокод, но вы поняли идею):

 while len(monster_list) > 0:
     while monster_list[0].health > 0:
          # attack
          if monster_list[0].health <= 0:
               # kill monster and remove monster_list[0]
 

Комментарии:

1. Большое вам спасибо! Да, счетчик » я » был там, потому что я пробовал разные вещи. Но, черт возьми, все, что я делал, — это дополнительный цикл while. Я бы поддержал ваш ответ, если бы мог, но у меня недостаточно доверия к стеку…

2. Не беспокойтесь! Рад, что это было полезно!

3. @PythonFiend Теперь у вас достаточно репутации стека, чтобы проголосовать, вы можете проголосовать за этот ответ прямо сейчас.

Ответ №2:

Вы могли бы держать монстров в списке и всегда сражаться с первым монстром в списке — monster_list[0] . И когда вы убьете его, тогда remove() он — и тогда вы сможете добавить нового монстра в конце списка.


Минимальный рабочий код

 # --- classes ---

class Character:
    
     def __init__(self, name, health, level):
          self.name = name
          self.health = health
          self.level = level
          self.levelup_counter = level   1
          
     def attack(self):
          self.health -= 2
          
     def monster_death(self):
          if self.health <= 0:  # better check `<=` instead of `==`
               monsters.remove(self)

     def __str__(self):
        return f'name: {self.name}, health: {self.health}, level: {self.level}'
    
# --- functions ---

def stats(player, monster):
    print("_______________________________________")
    print("Your stats ttEnemy Stats")
    print("---------------------------------------")
    print(f"Health: {player.health}ttHealth: {monster.health}")
    print(f"Level: {player.level}ttLevel: {monster.level}")

# --- main ---

player = Character("Hero", 10, 1)

monsters = [
    Character("Monster 1", 10, 2),
    Character("Monster 2", 20, 3),
    Character("Monster 3", 40, 4),
]    

#monsters = []
#for i in range(1, 4):
#    monsters.append( Character(f"Monster {i}", i*10, i 1),

i = 3  # used for monster's name

while monsters:
    m = monsters[0]
    print('New monster attacked:', m)  # it will use `__str__` to display `m`
    while True: 
        attack = input("Enter 1 to attack: ")
        m.attack()
        stats(player, m)
        if m.health <= 0:  # better check `<=` instead of `==`
             player.level  = 1
             print("You killed the monster!nYou leveled up!")
             m.monster_death()
             i  = 1
             monsters.append( Character(f"Monster {i}", i*10, i 1) )
             break  # exit nearest `while`