欢迎来到冰天雪地的苔原塔竞技场!这不是普通的闯关,而是一场双人对抗的塔防大战。你和你的对手各自镇守一座基地,面对源源不断从裂隙(The Rift)涌出的怪物大军(Horde)。
你的任务只有一句话:比你的对手存活更久。怪物会同时进攻你和对手的基地,谁的基地先被攻破,谁就输了。你需要综合运用三大武器系统来撑到最后一刻:
hero.build 在领土上修建弓箭手、法师、加农炮、冰霜四种塔。hero.special 制造引力井、推力、爆发或传送,操控怪物的走位。苔原塔是一个挑战级别(Challenge Level)的竞技场——它在玩法上比基础关卡复杂得多。如果你还没玩过前一个竞技场,强烈建议先去玩一下冰封竞速(Iron and Ice Arena)来热身,熟悉建塔和资源管理的基本套路。
场地中央有一颗属于你的心脏(Heart),也就是你的基地。
由于双方面对的是同样的怪物波次,比的就是谁的防御体系更稳、谁能让基地撑得更久。这是一场耐久度的较量。
法力(Mana)是你在苔原塔里最重要、也是唯一的"货币"资源。它就像塔防游戏里的金币——你需要花费法力来建造新塔,或者升级已有的塔。没有法力,你就什么也建不了。
你可以随时用 hero.mana 查看当前的法力值:
# 查看当前法力值 myMana = hero.mana
100。法力满了之后再积攒也不会超过 100,溢出的部分会直接作废。所以不要让法力"溢出"浪费掉——接近上限时务必立即花出去!
法力有两个来源,理解它们能帮你规划经济节奏:
| 来源 | 说明 |
|---|---|
| 每秒自动恢复 | 每一秒你都会自动获得一定量的法力(稳定的基本收入)。 |
| 击败怪物奖励 | 每消灭一个怪物,都会额外奖励法力——怪物越强,奖励越多,杀得越多越有钱! |
你不能在地图上随便乱建。建造受到以下规则限制:
"A" 到 "I"。x 和 y),塔会建在那个格子的正中心。建造之前,可以用 hero.canBuildAt(x, y) 判断某个位置是否可以建造,避免浪费法力。
建塔的核心命令是 hero.build,它有两种用法:用预定义点的名字,或者用坐标。
# 先判断该位置是否可以建造 hero.canBuildAt(x, y) # 方式一:用预定义点的名字("A" 到 "I")建造 hero.build('archer', 'A') # 方式二:用坐标 (x, y) 建造,塔出现在格子中心 hero.build('mage', 15, 40)
第一个参数永远是塔的类型字符串(如 'archer'、'mage'),后面跟着位置信息。
当你在已经有自己塔的格子上再次执行 build 时,会发生有趣的事情:
| 情况 | 结果 |
|---|---|
| 新建类型与原塔相同 | 现有的塔被升级(等级 +1,威力更强)。 |
| 新建类型与原塔不同 | 旧塔被替换成新塔,并且新塔会保留之前的等级出现(法力不浪费)。 |
x 坐标会被自动镜像。这意味着你不需要为蓝队单独写代码——你用红队视角写的逻辑,系统会帮你自动翻转到蓝队那一侧。
这是个非常贴心的设计:你只管按一种视角思考和编程,比赛时无论你被分到哪一队,代码都能正常工作。
塔是你保卫基地的主力。你可以点击界面上的提示按钮查阅塔的参数,也可以用代码动态获取:
# 获取所有可用塔类型的列表 hero.availableTowerTypes # 获取某一种塔的详细参数 hero.getTowerParameters('archer')
每座塔的建造(或升级)成本都是 25 法力。塔的攻击伤害会随等级提升,遵循这个公式:
# 等级越高,伤害越高(向上取整)
伤害 = ROUND(BASE_DAMAGE * (1 + LOG(1.55, LEVEL)))
简单理解:BASE_DAMAGE 是这座塔的基础伤害,等级 LEVEL 越高,伤害增长越多。所以把一座塔升到高级,往往比铺一堆 1 级塔更划算。
| 参数 | 数值 |
|---|---|
| 类型 type | "archer" |
| 攻击冷却 cooldown | 0.5(出手最快) |
| 攻击伤害 damage | 12 |
| 攻击范围 range | 22 |
| 能否对空 | 可对空 |
| 升级加成 | 每升一级,攻击范围 +1 |
弓箭手塔出手频率高、性价比不错,是早期清理大量弱小地面怪(如 munchkin)的好帮手,也是你防线的基石火力。
| 参数 | 数值 |
|---|---|
| 类型 type | "mage" |
| 攻击冷却 cooldown | 1 |
| 攻击伤害 damage | 7 |
| 攻击范围 range | 30(射程最远!) |
| 能否对空 | 可对空(防空主力) |
| 升级加成 | 每升一级,攻击范围 +1 |
| 参数 | 数值 |
|---|---|
| 类型 type | "cannon" |
| 攻击冷却 cooldown | 1.5(较慢) |
| 攻击伤害 damage | 15(单发最高) |
| 攻击范围 range | 20 |
| 爆炸半径 blast radius | 10 |
| 能否对空 | 不能对空 |
| 升级加成 | 每升一级,爆炸范围 +0.5 |
| 参数 | 数值 |
|---|---|
| 类型 type | "frost" |
| 攻击冷却 cooldown | 2(最慢) |
| 攻击伤害 damage | 5(最低) |
| 攻击范围 range | 12(最短) |
| 爆炸半径 blast radius | 10 |
| 减速持续时间 slow duration | 2 秒 |
| 减速系数 slow factor | 0.5(速度减半) |
| 能否对空 | 可对空 |
| 升级加成 | 每升一级,减速系数 −0.0125(减速更强) |
冰霜塔的价值不在伤害,而在控制。它能把周围的怪物大幅减速(系数越低,怪物越慢),为你的其他塔争取更多输出时间。把冰霜塔布在怪物必经的咽喉要道,能极大延缓敌人推进,是辅助核心。
除了建塔,你还能用 hero.special('技能名', x, y) 在指定坐标释放特殊技能(Special Abilities),制造引力效果,直接操控怪物和空间。共有四种:
| 图标 | 技能名 | 效果 |
|---|---|---|
![]() | "pull" 拉力 | 制造一个引力井,把怪物向内吸聚(聚怪)。与加农炮绝配。 |
![]() | "push" 推力 | 制造引力效果,把怪物持续向外推开(驱散/阻挡)。 |
![]() | "burst" 爆发 | 短促而强力的"推"——瞬间把怪物炸飞得很远,是保命神技。 |
![]() | "teleport" 传送 | 把怪物传送到对手基地的方向——把麻烦丢给对面! |
# 在坐标 (40, 40) 制造一个引力井,把怪物聚成一团 hero.special('pull', 40, 40) # 在某处爆发,把逼近基地的怪物炸飞 hero.special('burst', 30, 25)
special 技能完全不消耗法力,是独立冷却的"免费王牌"!但每种技能都有冷却时间,不能无限连发。释放时通用施法时间均为 0.4 秒(英雄会被短暂锁定)。
这里有两个容易混淆的冷却概念,务必分清:
| 技能 | 力量 force | 范围 range | 持续 duration | cooldown | specificCooldown | 其他 |
|---|---|---|---|---|---|---|
"push" | -3000 | 20 | 3 | 0.4 | 5 | — |
"pull" | 3000 | 20 | 3 | 0.4 | 5 | — |
"burst" | -100000 | 20 | 0.2 | 0.4 | 3 | 力量极强、极短,冷却最快 |
"teleport" | — | 12 | — | 0.4 | 4 | 传送距离 60,眩晕 0.3 秒 |
| 连招 | 操作 |
|---|---|
| 🕸️ 天罗地网 | 用 "pull" 把怪物吸聚成团,再用加农炮范围轰炸,一锅端。 |
| 🌊 潮汐连环 | 用 "pull" 吸聚后立刻接 "push",让怪物在你的火力网中来回挨打。 |
| 🔮 乾坤挪移 | 针对高血量精英怪,用 "teleport" 直接把它送回起点,让它重走一遍。 |
| 🛡️ 保命爆发 | 怪物逼近基地时,用 "burst" 瞬间把它们炸飞,争取喘息时间。 |
"burst" / "push" 推进你方一侧的能量屏障里造成额外伤害,甚至在对手那一侧用 "pull",把怪物引向对方的水晶基地!
苔原的古代守护者前来助阵——你可以直接操控两名守卫。它们能移动、攻击、使用特殊能力,还能侦察怪物的信息。它们是你区别于纯塔防的"机动部队"。
| 特性 | 说明 |
|---|---|
| 免疫技能 | 守卫无视所有特殊技能——你的 pull/push 不会影响自己人。 |
| 生命恢复 | 每秒恢复 15 点生命值,很耐打。 |
| 死亡重生 | 若阵亡,10 秒后在原地重生。 |
| 对基地伤害低 | 守卫对敌方基地只造成 0.25 倍伤害(它们是防守者,不是攻城者)。 |
| 抗远程 | 守卫受到远程怪物的伤害只有 0.5 倍。 |
控制守卫的方式和建塔不同——你要写一个事件处理函数,它会在每次守卫生成时被自动调用。这个函数接收一个参数 data,里面装着:
.guard:可供你指挥的守卫对象本身。.place:生成位置的字符串——"S"(上方)或 "T"(下方)。用 hero.on('spawn-guard', 函数) 把你的处理函数注册上去:
def guardAct(data): guard = data.guard place = data.place while True: monster = guard.findNearestMonster() if monster: guard.attack(monster) hero.on('spawn-guard', guardAct)
hero.special 和 hero.build。它们会卡住你的主线程,导致不可预测的混乱结果。事件函数里只用守卫自己的方法(如 guard.attack、guard.special)。
每当守卫攻击一个怪物,那个怪物就会把仇恨(注意力)转向守卫。利用这个机制,守卫有四种能力来"牵着怪物的鼻子走":
| 能力 | 效果 | cooldown | specificCooldown |
|---|---|---|---|
"roar" 咆哮 | 让 20 米半径内所有怪物都来攻击守卫(强制聚怪/拉仇恨) | 0.5 秒 | 5 秒 |
"hide" 隐匿 | 重置所有以该守卫为目标的怪物仇恨(脱战逃跑) | 0.3 秒 | 3 秒 |
"haste" 加速 | 守卫速度提升 2 倍,持续 3 秒 | 0.1 秒 | 10 秒 |
"home" 归位 | 把守卫瞬间传送回它的出生点 | 0.3 秒 | 7 秒 |
roar 把怪物全吸引过来 → 你的加农炮/冰霜塔集中招呼这一团;血量危险时用 hide 甩脱仇恨、再用 haste 加速跑路或 home 直接回家保命。守卫就是你的"活体诱饵 + 机动尖兵"。
| 方法 | 说明 |
|---|---|
moveTo(x, y) | 移动到点 {x, y},阻塞守卫代码直到抵达 |
moveTowards(x, y) | 朝点 {x, y} 移动,非阻塞,只占用 1 帧 |
attack(target) | 攻击指定目标 |
special(abilityName) | 使用上面介绍的守卫特殊能力 |
isReady(abilityName) | 返回布尔值,检查某能力当前是否可用 |
distanceTo(target) | 返回到目标的距离 |
findMonsters() | 返回当前存活怪物的列表 |
findNearest(targets) | 返回 targets 列表中最近的对象 |
findNearestMonster() | 等价于 guard.findNearest(guard.findMonsters()) |
| 属性 | 说明 |
|---|---|
id | 守卫的唯一名称 |
type | 类型,守卫为 "guard" |
health / maxHealth | 当前生命值 / 最大生命值 |
color | 所属队伍,"red" 或 "blue" |
maxSpeed | 守卫的移动速度 |
x / y | 横 / 纵坐标(蓝方 x 自动镜像) |
position | 包含 {x, y} 的向量对象 |
attackRange | 攻击范围 |
attackCooldown | 一次攻击占用的时间(代码阻塞) |
attackDamage | 每次攻击的伤害 |
怪物以波次(Wave)的形式出现,有节奏可循:
你可以提前查询波次信息,针对性地布防:
# 查询第 n 波的怪物信息 hero.getWave(n) # 查询全部波次信息 hero.getWaves()
| 属性 | 说明 |
|---|---|
id | 怪物的唯一 ID |
x / y | 横 / 纵坐标(蓝方 x 镜像) |
health / maxHealth | 当前 / 最大生命值 |
maxSpeed | 怪物的移动速度 |
type | 怪物的类型字符串 |
想知道某种怪物的详细参数,用:hero.getMonsterParameters(monsterType)。
苔原塔里有 11 种怪物,按等级(tier)从弱到强排列。注意几个关键属性:飞行(flying)怪物会无视加农炮,只有法师塔克它;远程(ranged)怪物不用贴近就能攻击你的基地,必须优先处理!
小喽啰munchkin
tier 0 · 地面近战
食人魔ogre
tier 1 · 厚实慢速
投掷者thrower
tier 1 · 地面远程
浮游球orb
tier 1 · 飞行近战
巨魔troll
tier 2 · 厚实慢速
萨满shaman
tier 2 · 地面远程
飞鸟bird
tier 2 · 飞行近战
斗士brawler
tier 3 · 厚实慢速
术士warlock
tier 3 · 地面远程
骑手rider
tier 3 · 飞行远程
元素elemental
tier X · 极厚地面
| 类型 | 等级 | 特征 |
|---|---|---|
"munchkin" 小喽啰 | tier 0 | 弱小,地面,近战 |
"ogre" 食人魔 | tier 1 | 厚实,缓慢,地面,近战 |
"thrower" 投掷者 | tier 1 | 弱,地面,远程 |
"orb" 浮游球 | tier 1 | 飞行,近战 |
"troll" 巨魔 | tier 2 | 厚实,缓慢,地面,近战 |
"shaman" 萨满 | tier 2 | 弱,地面,远程 |
"bird" 飞鸟 | tier 2 | 飞行,近战 |
"brawler" 斗士 | tier 3 | 厚实,缓慢,地面,近战 |
"warlock" 术士 | tier 3 | 弱,地面,远程 |
"rider" 骑手 | tier 3 | 飞行,远程(最棘手!) |
"elemental" 元素 | tier X | 极厚实,地面,近战(最强地面单位) |
把所有系统串起来,一套稳健的苔原塔思路大致是这样的:
build 即可升级。special 不耗法力,要勤用、轮转着用。pull 聚怪喂炮、burst 推开逼近基地的怪、teleport 把麻烦丢回去。spawn-guard 事件让两名守卫自动找最近的怪攻击;危险时 roar 拉仇恨集火、hide + haste + home 保命。切记事件函数里别调用 build / special。getWaves() 提前看清后续怪潮,针对飞行/远程/厚血怪提前调整塔的配置。学会调试,效率翻倍!在比赛中,你可以把关键信息打印出来观察。查看输出的方法:在浏览器中右键点击页面 → 检查 → Console(控制台)标签页。
print("当前法力值:", hero.mana) print("当前波次:", hero.getWaveNumber()) # 检查技能是否冷却完毕 print("拉力技能是否就绪:", hero.isReady("pull")) # 打印已建造的防御塔信息 myTowers = hero.findMyTowers() for t in myTowers: print("塔类型:", t.type, "等级:", t.level, "位置:", t.x, t.y)
你也可以查看对手水晶(基地)的血量,判断战况:
# 查看敌方水晶血量 enemy = hero.getEnemyHero() print("敌方水晶血量:", enemy.health)
| 系统 | 关键命令 / 概念 | 要点 |
|---|---|---|
| 目标 | 守住心脏(基地) | 比对手活得更久即获胜 |
| 法力 | 上限 100,每塔 25,hero.mana | 每秒流入 + 击杀奖励,溢出作废 |
| 建造 | hero.build('类型', 'A') 或坐标 | 同点重建=升级;蓝方 x 自动镜像 |
| 弓箭手 | "archer" | 快、便宜,清杂兵,可对空 |
| 法师 | "mage" | 防空(飞行 4 倍)、穿透、远射 30 |
| 加农炮 | "cannon" | AOE 炸地面团;不能对空 |
| 冰霜 | "frost" | 减速控场,辅助核心 |
| 特殊技能 | hero.special('pull'/'push'/'burst'/'teleport', x, y) | 不耗法力,独立冷却 |
| 守卫 | hero.on('spawn-guard', fn) | 免疫技能、自愈、重生;能力 roar/hide/haste/home |
| 怪物 | hero.getWaves() / getMonsterParameters() | 12 秒一波,飞行/远程要警惕 |
塔阵成墙,技能乱敌,守卫破阵 ⚔️❄️
现在,去苔原塔的赛场上,让你的心脏跳动得比对手更久吧!🏰
CodeCombat 编程知识 · 多人竞技场:苔原塔(Tundra Tower)
扣哒世界(CodeCombat)教研团队