Я работаю над текстовой ролевой игрой, чтобы улучшить свои навыки программирования. Чтобы лучше различать врагов с одинаковыми именами в бою, я передаю список врагов в функцию ниже, которая возвращает врагов с обновленными именами. Он может определить, каких врагов нужно переименовать и во что их переименовать, но когда я собираюсь изменить имя врага на новое имя с помощью функции .set_name(), он меняет каждый экземпляр вражеского объекта с исходным именем на новое имя.
# The area class holds the encounter table for a specific area
class Area:
def __init__(self, name):
self.__area_name = name
self.__encounters = self.get_encounters(self.__area_name)
self.__enemies = self.get_enemies()
def get_encounters(self, area_name):
encounter_table = {"Area 1" : {"Test Enemy 1" : Enemy("Test Enemy 1", [5, 2, 11, 5, 5, 2, "Def", "Speed"],
[[Item(["Weapon", "Stick", 0, 1, 0, 1, 0, 0])], 30, 5]),
"Test Enemy 2" : Enemy("Test Enemy 2", [5, 8, 5, 2, 5, 1, "Attack", "Sp.Atk"],
[[Item(["Weapon", "Dagger", 0, 3, -2, 0, 0, 0]),
Item(["Accessory", "Bandana", 0, 0, 0, 0, 0, 2])], 50, 10]),
},
}
return encounter_table[area_name]
def get_enemies(self):
enemies = []
for encounter in self.__encounters:
if isinstance(self.__encounters[encounter], Enemy):
enemies.append(self.__encounters[encounter])
return enemies
# Relevant enemy code:
class Enemy:
def __init__(self, name, stats, inventory):
self.__name = name
self.__level = 1
self._stats = stats
self.__max_health = self._stats[0]
self.__proficiency = self._stats[6]
self.__inefficiency = self._stats[7]
self.__drops = inventory[0]
self.__exp_yield = inventory[1]
self.__gold = inventory[2]
self.__crit_rate = 100
self.apply_item_buffs()
def set_name(self, name):
self.__name = name
def get_name(self):
return self.__name
# This runs when a battle starts. I've included all the code up until the problematic function, as everything after that works as intended.
def start_fight(player, area):
battle_end = False
# Pulls the area's encounter table and creates the loot table
loot = []
exp_to_gain = 0
gold_to_gain = 0
enemies = area.get_enemies()
fighters = []
# Calculates how many enemies to add to the turn-order
num_of_enemies = random.randint(4, 5)
print(f"{num_of_enemies} Enemies: ")
# Adds that number of enemies to the turn order
# Where each enemy is selected randomly from the area's encounter table
for i in range(num_of_enemies):
enemy_to_add = random.choice(enemies)
print(enemy_to_add.get_name())
fighters.append(enemy_to_add)
fighters = distinguish_fighters(fighters)
# The problem is in this function.
def distinguish_fighters(enemies):
# If there are multiple enemies of the same type in combat, their names will be changed
# I.e. 2 instances of "Enemy" will be renamed "Enemy A" & "Enemy B"
print("")
all_names = []
new_names = []
# Takes each enemy's name and adds it to a list in the order they appear (incl. duplicates)
for enemy in enemies:
all_names.append(enemy.get_name())
#print(enemy.get_name())
# A dictionary linking each name in 'all_names' to the number of times it appears
names = {i:all_names.count(i) for i in all_names}
for name in names:
print(f"{name}: {names[name]}")
for enemy in range(len(enemies)):
# E.g. if there are 3 enemies sharing a name,
# it will rename the first one 'Enemy C' and work backwards
unicode = 64 + names[enemies[enemy].get_name()]
# print(f"{enemies[enemy].get_name()} {chr(unicode)}")
new_names.append(f"{enemies[enemy].get_name()} {chr(unicode)}")
names[enemies[enemy].get_name()] -= 1
# The problem is here :>
for name in range(len(new_names)):
enemy = enemies[name]
print(enemy.get_name())
print(f"{enemy.get_name()} -> {new_names[name]}")
enemy.set_name(new_names[name])
return enemies