如何根据用户输入切换数组,复用攻击函数优化多敌人战斗逻辑?
合并重复攻击逻辑,根据目标选择操作对应数组
我目前创建了两个敌人数组(vampire1、vampire2)和对应的两个攻击函数(warrior_attack1、warrior_attack2),希望只写一个攻击函数,根据用户选择的目标敌人,对对应数组的相同索引(如HP、护甲值等)进行操作,简化重复代码。
原代码
import random # 原代码遗漏导入random,此处补充 # 战士:HP, MP, AP, WP, Init warrior = [32,5,2,5,2] # 吸血鬼1:HP, MP, AP, WP, Init vampire1 = [15,0,2,2,2] # 吸血鬼2:HP, MP, AP, WP, Init vampire2 = [15,0,2,2,2] # 战士攻击敌人1 def warrior_attack1(): if vampire1[2] > 0: # 敌人有护甲时攻击护甲 vampire1[2] = vampire1[2] - random.randrange(1,warrior[3]) if vampire1[2] > 0: print("你破坏了敌人的护甲!敌人当前护甲值:" + str(vampire1[2])) elif vampire1[2] <= 0: print("你摧毁了敌人的护甲!") elif vampire1[2] <= 0: # 敌人无护甲时攻击生命值 vampire1[0] = vampire1[0] - random.randrange(1,warrior[3]) if vampire1[0] > 0: print("你击中了敌人,敌人当前生命值:" + str(vampire1[0])) # 战士攻击敌人2 def warrior_attack2(): if vampire2[2] > 0: # 敌人有护甲时攻击护甲 vampire2[2] = vampire2[2] - random.randrange(1,warrior[3]) if vampire2[2] > 0: print("你破坏了敌人的护甲!敌人当前护甲值:" + str(vampire2[2])) elif vampire2[2] <= 0: print("你摧毁了敌人的护甲!") elif vampire2[2] <= 0: # 敌人无护甲时攻击生命值 vampire2[0] = vampire2[0] - random.randrange(1,warrior[3]) if vampire2[0] > 0: print("你击中了敌人,敌人当前生命值:" + str(vampire2[0])) def warrior_turn(): command = input("\n轮到战士行动:" + "\n选择你的行动" + "\n1. 攻击。" + "\n2. 魔法。\n") if command == "1": command = input("\n选择要攻击的敌人:" + "\n1. 吸血鬼1" + "\n2. 吸血鬼2" + "\n3. 吸血鬼3" + "\n4. 吸血鬼4\n") if command == "1": if vampire1[0] > 0: warrior_attack1() else: print("吸血鬼1已死亡,请选择其他目标!") warrior_turn() warrior_turn()
优化后的代码
import random # 战士:HP, MP, AP, WP, Init warrior = [32, 5, 2, 5, 2] # 吸血鬼:HP, MP, AP, WP, Init vampire1 = [15, 0, 2, 2, 2] vampire2 = [15, 0, 2, 2, 2] # 通用攻击函数,接收目标敌人数组作为参数 def warrior_attack(target): # 优先攻击护甲(数组索引2) if target[2] > 0: damage = random.randrange(1, warrior[3]) target[2] -= damage if target[2] > 0: print(f"你破坏了敌人的护甲!敌人当前护甲值:{target[2]}") else: print("你摧毁了敌人的护甲!") # 无护甲时攻击生命值(数组索引0) else: damage = random.randrange(1, warrior[3]) target[0] -= damage if target[0] > 0: print(f"你击中了敌人,敌人当前生命值:{target[0]}") def warrior_turn(): command = input("\n轮到战士行动:\n选择你的行动\n1. 攻击。\n2. 魔法。\n") if command == "1": target_choice = input("\n选择要攻击的敌人:\n1. 吸血鬼1\n2. 吸血鬼2\n3. 吸血鬼3\n4. 吸血鬼4\n") # 建立选择与敌人数组的映射,新增敌人只需添加映射 target_map = { "1": vampire1, "2": vampire2 } if target_choice in target_map: target = target_map[target_choice] if target[0] > 0: warrior_attack(target) else: print(f"吸血鬼{target_choice}已死亡,请选择其他目标!") warrior_turn() else: print("无效的目标选择,请重新选择!") warrior_turn() warrior_turn()
优化说明
- 将重复的两个攻击函数合并为通用攻击函数
warrior_attack,通过参数target接收目标数组,实现逻辑复用,避免重复代码。 - 使用字典
target_map建立用户选择与敌人数组的关联,后续新增敌人时只需在字典中添加条目,无需修改攻击逻辑。 - 提取随机伤害为单独变量,并用f-string替代字符串拼接,提升代码可读性。
内容的提问来源于stack exchange,提问作者Rafael José
相关产品推荐
相关产品推荐

