#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`