Python OOP示例中如何同步更新所有攻击玩家的伤害分配值
问题原因
现有逻辑在每次添加新攻击玩家时,仅会给当前新加入的玩家赋值当下计算出的伤害值,早已加入的玩家存储的还是旧计算结果,不会随玩家数量变化自动更新,因此只有最后加入的玩家能拿到正确数值。
修复方法
不要给龙单独记录攻击玩家的计数,直接维护攻击该龙的玩家对象列表。每次新增玩家后,重新计算最新的人均分摊伤害,遍历所有正在攻击这条龙的玩家,同步更新每个人对应该龙的伤害分配值即可。
修改后的完整可运行代码:
class Player: def __init__(self, name): self.name = name self.damage_to_deal = {} # 存储格式: {'龙名称': 需要对该龙造成的伤害值} class Dragon: def __init__(self, name, health): self.name = name self.health = health # 替换原有的玩家计数变量,直接存储所有攻击该龙的玩家对象 self.attacking_players = [] def add_player(self, player): # 将新玩家加入攻击列表 self.attacking_players.append(player) # 计算最新的人均需要承担的伤害 per_damage = self.health / len(self.attacking_players) # 遍历所有攻击该龙的玩家,同步更新伤害值 for attacker in self.attacking_players: attacker.damage_to_deal[self.name] = per_damage # 测试逻辑 if __name__ == "__main__": # 创建3名玩家 player_A = Player(name='Josh') player_B = Player(name='Steven') player_C = Player(name='Robert') # 创建2条龙 dragon_A = Dragon(name='Gamacial', health=475) dragon_B = Dragon(name='Nibiru', health=150) # 3名玩家全部攻击龙A dragon_A.add_player(player_A) dragon_A.add_player(player_B) dragon_A.add_player(player_C) # 仅玩家A、B攻击龙B dragon_B.add_player(player_A) dragon_B.add_player(player_B) # 打印结果 print(f'{player_A.name} will have to do: {player_A.damage_to_deal}') print(f'{player_B.name} will have to do: {player_B.damage_to_deal}') print(f'{player_C.name} will have to do: {player_C.damage_to_deal}')
运行后输出完全符合预期:
Josh will have to do: {'Gamacial': 158.33333333333334, 'Nibiru': 75.0} Steven will have to do: {'Gamacial': 158.33333333333334, 'Nibiru': 75.0} Robert will have to do: {'Gamacial': 158.33333333333334}
如果后续需要扩展玩家退出攻击、龙血量动态变化等功能,只需要在对应触发逻辑中重新计算伤害值,再遍历更新所有关联玩家的对应字段即可,所有关联对象的数据会始终保持同步。
内容的提问来源于stack exchange,提问作者Faindirnomainzein
相关产品推荐
相关产品推荐

