You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据用户输入切换数组,复用攻击函数优化多敌人战斗逻辑?

合并重复攻击逻辑,根据目标选择操作对应数组

我目前创建了两个敌人数组(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é

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:30:46