KOUDASHIJIE / ARENA RULEBOOK

竞技场:巫师之战MAGES’ MIGHT

采集魔法水果,掌握元素克制。
在资源与施法之间,写出你的制胜策略。

果农采集火 · 水 · 土15 种法术Python / C++

规则图解手册 · 一起学会采集、施法和防守

01竞技场简介与目标MAGES’ MIGHT · SURVIVE THE DUEL

你是一位会写程序的小巫师!你要指挥果农收集水果,获得魔力,再用法术和对手决斗。你还活着,对手先倒下,你就赢了。

① 果农收水果

果农像小帮手,会把魔法水果带回出生点。

② 水果变魔力

火、水、土三种水果,分别带来三种魔力。

③ 巫师放法术

魔力够了,就能攻击对手、撑起护盾,或帮助果农。

紫色:判断、循环等关键词绿色:双引号里的文字蓝色:函数名字橙色:数字灰色:给你看的注释
下面的 Python 示例使用优化程序中的接口。C++ 用来对照学习相同判断和循环写法,假定编辑器提供同名 hero 接口及相应对象类型;它不是已在竞技场验证的可运行版本。完整可复制程序请看程序讲解页。

先观察,再行动

下面先找到对手,再读取对手的火魔力。enemy_hero 是给对手英雄取的变量名。

enemy_hero = hero.getEnemyHero()
enemy_fire_mana = enemy_hero.fire

02三系魔力与采集循环THE RESOURCE LOOP

把魔力想成三个小罐子:火罐子、水罐子和土罐子。果农带回哪种水果,就为对应的小罐子补充魔力。三种魔力不能互相替代。

选择目标hero.chooseItem收集水果fire / water / earth返回出生点带回水果,补充魔力英雄施法攻击 · 护盾 · 控制每次带回水果后,再次调用选果函数
采集循环图解 · 果农生成时也会调用选果函数。此图表示机制关系,不代表实际地图布局。

火系 fire

黄色的火系水果,提供火魔力。火箭、火球等法术会用到它。

水系 water

蓝色的水系水果,提供水魔力。水箭、水盾等法术会用到它。

土系 earth

绿色的土系水果,提供土魔力。土箭、土生长等法术会用到它。

练习:找到指定位置的火果

findFruits() 找到水果列表;pos 中的 x、y 表示位置;mana 表示水果元素。这里去掉坐标的小数后再比较。

def has_opening_fire_fruit():
    for fruit in hero.findFruits():
        if (int(fruit.pos["x"]) == 44
                and int(fruit.pos["y"]) == 48
                and fruit.mana == "fire"):
            return True
    return False

03生成和指挥果农COLLECTORS & CHOOSEITEM

开局你已经有 1 位果农。使用 hero.spawnCollector() 可以再叫来一位。果农越多,采集的小帮手越多;不过,后面来的果农要等更久。

1s第 2 位3s第 3 位9s第 4 位18s第 5 位27s第 6 位36s第 7 位45s第 8 位54s第 9 位
单次生成耗时,非累计时间 · 开局自带 1 位果农。
生成哪一位果农这一次要等多久
2 位1 秒
3 位3 秒
4 位9 秒
5 位18 秒
6 位27 秒
7 位36 秒
8 位45 秒
9 位54 秒
看表小窍门:第 3 位果农要等 3 秒,是这一次生成要用的时间,不是从开局算起的总时间。生成果农时不能攻击,要选好时机。

练习:开局连续生成四位果农

这是优化程序的开局安排:连续调用四次 spawnCollector()。开局自带一位,因此这是再生成四位,不是把总人数设成四位。

for collector_number in range(4):
    hero.spawnCollector()

选果回调:按队伍颜色返回坐标

前 55 秒,红方去 (60, 42),蓝方去 (40, 42)。Python 把包含 x、y 的字典返回给果农。55 秒以后函数返回 None,不再指定坐标。

Python · 竞技场选果回调
def choose_fruit(collector):
    if hero.time < 55:
        if hero.color == "red":
            return {"x": 60, "y": 42}
        return {"x": 40, "y": 42}

hero.chooseItem = choose_fruit

绑定函数时写 choose_fruit,不加括号。C++ 的坐标回调需要编辑器提供具体的返回类型,不能直接套用 Python 字典。

04施法条件与完整数值SPELLBOOK · ALL 15 SPELLS

释放法术要有足够的对应魔力,并等待冷却结束。canCast 可以检查是否就绪;优化程序则保留原有策略条件后调用 cast,两种检查不要混为一谈。

不必自己猜能不能放。hero.canCast("法术名字") 会帮你检查;检查通过后,再用 hero.cast("法术名字") 施法。

15 种法术,一张表看清楚

费用是“要花多少魔力”;威力是法术的 power 数值;持续时间的单位是秒。点击下面的按钮,可以只看一种元素。

法术标识符魔力类型费用威力 power持续时间 / 秒
fire-arrow火 / fire3251
water-arrow水 / water3251
earth-arrow土 / earth3251
fire-beam火 / fire7752
water-beam水 / water7752
earth-beam土 / earth7752
fire-ball火 / fire152004
water-ball水 / water152004
earth-ball土 / earth152004
fire-shield火 / fire3—0
water-shield水 / water3—0
earth-shield土 / earth3—0
fire-burn火 / fire1051.5
water-refresh水 / water10101.5
earth-grow土 / earth101.55
注意:“持续时间”不是“冷却时间”。表里的时间不能用来判断下次什么时候能放法术,判断时请使用 canCast。护盾的威力显示为“—”,不要把它当成 0 点防御。

补充:检查法术是否已经就绪

这是独立的安全施法写法。它不是优化程序中的原有判断,不会自动改变优化程序的行为。

if hero.canCast("water-arrow"):
    hero.cast("water-arrow")

练习:读取魔力并选择水箭

先检查进攻条件,再尝试施法。这里展示的是比赛策略条件;它不等于 canCast 的施法就绪检查。

enemy_hero = hero.getEnemyHero()
if hero.water >= 6 or hero.time > 100:
    if enemy_hero.fire < 4.3 or hero.fire >= 3:
        hero.cast("water-arrow")

05攻击法术怎么选ARROW / BEAM / BALL

攻击法术用来打击对方英雄。每一类攻击都有火、水、土三个版本:只换元素,不换这一类的费用、威力和持续时间。

箭 arrow

25

费用 3 · 持续 1 秒

需要的魔力少,比较容易放出来。

束/柱 beam

75

费用 7 · 持续 2 秒

比箭花费更多,单次威力也更大。

球 ball

200

费用 15 · 持续 4 秒

单次威力最大,需要先攒够魔力。

练习:土箭什么时候放

hero.earth 是我方土魔力;enemy_hero.water 是对手水魔力。两层 if 都通过才尝试放土箭。

enemy_hero = hero.getEnemyHero()
if hero.earth >= 6 or hero.time > 100:
    if enemy_hero.water < 4.3 or hero.water >= 3:
        hero.cast("earth-arrow")

06护盾与元素克制ELEMENTAL COUNTERS

护盾像一面魔法盾牌。火盾、水盾、土盾都需要 3 点对应元素的魔力。面对不同的攻击,要选择合适的护盾。

火土水fireearthwater克制 →← 克制克制 ↑火克土 · 土克水 · 水克火
箭头从克制方指向被克制方。判断护盾时,关注来袭攻击的元素。
对手放来的攻击我们选什么盾为什么
火系攻击water-shield 水盾水克火
水系攻击earth-shield 土盾土克水
土系攻击fire-shield 火盾火克土
记住小口诀:水挡火,土挡水,火挡土。会选择还不够,放盾的时机也很重要。

练习:遇到火系球或火系束时选盾

先选克制火的水盾;水魔力不足,再考虑火盾。这里只演示选盾,完整程序还会先检查飞行法术的位置。

enemy_missiles = hero.findEnemyMissiles()
for missile in enemy_missiles:
    if missile.type in ("fire-ball", "fire-beam"):
        if hero.water >= 3:
            hero.cast("water-shield")
        elif hero.fire >= 3:
            hero.cast("fire-shield")
        break

07影响采集的三种特殊法术CONTROL THE RESOURCE ECONOMY

除了打英雄和撑护盾,你还可以影响“收水果”这件事。下面三个法术的费用都是 10 点对应魔力。

火燃烧 fire-burn

降低对手果农的血量/耐力。

火魔力 10
威力 5 · 持续 1.5 秒

水净化 water-refresh

恢复我方果农的血量/耐力。

水魔力 10
威力 10 · 持续 1.5 秒

土生长 earth-grow

让自己半场的魔法水果变大。

土魔力 10
威力 1.5 · 持续 5 秒

练习:满足三个条件才选择火燃烧

开局检查结果、时间和敌方果农数量都合适时,才进入火燃烧分支。单独练习时先执行 has_opening_fire_fruit 函数及开局赋值。

opening_has_fire_fruit = has_opening_fire_fruit()
if (opening_has_fire_fruit
        and hero.time < 90
        and len(hero.findEnemyCollectors()) > 2):
    hero.cast("fire-burn")

08信息读取与 API 速查OBSERVE BEFORE YOU ACT

好的策略要先“看清楚”,再“做决定”。程序可以查看果农人数、血量和对手。下面这张表,就是常用指令的小字典。

指令/属性用小学生的话说
hero.spawnCollector()再叫来一位果农
hero.chooseItem给果农安排选水果的方法
hero.collectors装着我方果农的列表
hero.opponent.collectors装着对手果农的列表
collector.pos这位果农在哪里
collector.health这位果农现在有多少血量
collector.maxHealth这位果农满血时有多少血量
hero.spellNames所有法术名字的列表
hero.getSpellData("fire-arrow")查看火箭的资料
hero.canCast("fire-arrow")问一问:现在能放火箭吗
hero.cast("fire-arrow")放一次火箭
hero.findMyCollectors()找出我方果农
hero.findEnemyCollectors()找出对手果农
hero.getEnemyHero()找到对手英雄
接口/属性用途
hero.time当前比赛时间
hero.color我方颜色:red 或 blue
hero.fire / hero.water / hero.earth我方三系魔力
hero.findFruits()水果列表
fruit.mana水果的元素
hero.findEnemyMissiles()敌方飞行法术列表
missile.type飞行法术类型
missile.pos["x"]飞行法术横坐标

练习:读取空中法术的信息

findEnemyMissiles() 返回敌方飞行法术列表。每个法术的 type 是类型,pos["x"] 是横坐标。

enemy_missiles = hero.findEnemyMissiles()
for missile in enemy_missiles:
    missile_type = missile.type
    missile_x = missile.pos["x"]

09入门代码与策略练习BUILD → PLAY → REFINE

完整程序不只是进攻,还会安排坐标采集、判断特殊火果、选择护盾,并在需要时补充果农。先读主循环,再到讲解页逐段学习。

阅读完整程序讲解 →

主循环:先防御,再进攻

这段是完整程序的最后一部分。需要先定义讲解页中的函数和开局变量,不能只复制这一段运行。

while True:
    if handle_incoming_spells():
        cast_attack_spells()
        if len(hero.findMyCollectors()) < 3 and hero.time < 110:
            hero.spawnCollector()

10核心规则速查QUICK REFERENCE

项目记住这些就够了
怎么赢自己活着,对手先倒下
开局果农1 位
第 2~9 位生成时间1 / 3 / 9 / 18 / 27 / 36 / 45 / 54 秒
箭:费用 / 威力 / 持续时间3 / 25 / 1 秒
束、柱:费用 / 威力 / 持续时间7 / 75 / 2 秒
球:费用 / 威力 / 持续时间15 / 200 / 4 秒
护盾:费用 / 持续时间3 / 0 秒;威力为 —
三种特殊法术费用各花对应魔力 10
克制关系火克土 · 水克火 · 土克水
施法顺序先 canCast 检查,再 cast 施法
合上页面前,问问自己:果农带回水果后会发生什么?放法术前要检查什么?对手用水系攻击,我该选什么盾?能回答这三个问题,你就掌握了最重要的规则!

复习:人数不够时补充果农

必须同时满足“少于三位”和“时间不足 110 秒”两个条件,才再生成一位。

if len(hero.findMyCollectors()) < 3 and hero.time < 110:
    hero.spawnCollector()