苔原塔 · 强化篇 🛠️

常用 API 大全 —— Hero · Tower · Guard · Vector
每个方法都配 Python 与 C++ 双语言示例

0. 阅读说明

How to Read This Reference

这是苔原塔竞技场的进阶强化篇。如果说前一篇讲的是"玩法规则",那么本篇就是你的编程工具箱——把竞技场里能用到的所有方法和属性按类整理出来,方便你随时查阅。

本篇按四大类组织:Hero 类(你的英雄,掌控全局)、Tower 类(防御塔对象)、Guard 类(古代守卫对象)、Vector 类(向量数学工具)。每一个 API 都同时给出 PythonC++ 两种语言的示例代码,点击代码块上方的标签即可切换。

坐标提示:所有涉及 x 坐标的属性和方法,当你以蓝队身份对战时都会被系统自动镜像。你只需按红队视角编写一套代码即可,无需为蓝队做任何特殊处理。

1. Hero 类 API

The Hero Class —— Command the Whole Battle

1.1 基地属性(Base Properties)

hero.x / hero.y

你的基地中心的横坐标 x 与纵坐标 y。蓝队时坐标自动镜像。

hero.time

从战斗开始到现在经过的实际时间,单位为秒。number

hero.health / hero.maxHealth

基地当前生命值 / 基地最大生命值。number
# 读取基地坐标与状态
baseX = hero.x
baseY = hero.y
elapsed = hero.time

# 基地血量低于一半时,做出反应
if hero.health < hero.maxHealth / 2:
    if hero.isReady("burst"):
        hero.special("burst", hero.x + 10, hero.y)
// 读取基地坐标与状态
auto baseX = hero.x;
auto baseY = hero.y;
auto elapsed = hero.time;

// 基地血量低于一半时,做出反应
if (hero.health < hero.maxHealth / 2) {
    if (hero.isReady("burst")) {
        hero.special("burst", hero.x + 10, hero.y);
    }
}

1.2 资源与类型(Resources & Types)

hero.mana

英雄当前的法力值(上限 100)。number

hero.towerTypes / hero.monsterTypes

towerTypes 返回可召唤的塔类型列表;monsterTypes 返回怪物波次中会遇到的怪物类型列表。list
# 攒够 25 法力才建塔
if hero.mana >= 25:
    hero.build("archer", "A")

# 读取所有可用塔类型和怪物类型
towers = hero.towerTypes
monsters = hero.monsterTypes
// 攒够 25 法力才建塔
if (hero.mana >= 25) {
    hero.build("archer", "A");
}

// 读取所有可用塔类型和怪物类型
auto towers = hero.towerTypes;
auto monsters = hero.monsterTypes;

1.3 建造方法(Building Methods)

hero.build(towerType, place)

在预定义点位(字母 "A""I")建造一座塔。只能建在本队颜色紫色(公共)格子上。建造消耗法力——若法力不足,代码会被阻塞直到攒够为止。若格子被对手的塔占据则无法建造;若被你自己的塔占据,则升级该塔到下一级,并在类型不符时切换为 towerType 类型。

hero.build(towerType, x, y)

在包含坐标点 {x, y} 的格子中心建造一座塔,规则同上。返回 tower 对象
可用塔类型:可通过界面上的 "HINTS"(提示)按钮hero.availableTowerTypes 属性查阅所有可用塔类型。
# 方式一:用点位名建造
hero.build("archer", "A")

# 方式二:用坐标建造,并接收返回的塔对象
tower = hero.build("mage", 15, 40)
level = tower.level

# 在同一点位再建一次 = 升级
hero.build("archer", "A")   # 升级 A 点的弓箭塔
// 方式一:用点位名建造
hero.build("archer", "A");

// 方式二:用坐标建造,并接收返回的塔对象
auto tower = hero.build("mage", 15, 40);
auto level = tower.level;

// 在同一点位再建一次 = 升级
hero.build("archer", "A");   // 升级 A 点的弓箭塔

hero.canBuildAt(x, y)

检查包含坐标点 {x, y} 的格子是否可以建造(可升级也返回 true)。boolean
# 先确认能建,再建,避免法力被阻塞浪费
if hero.canBuildAt(30, 50):
    hero.build("cannon", 30, 50)
// 先确认能建,再建,避免法力被阻塞浪费
if (hero.canBuildAt(30, 50)) {
    hero.build("cannon", 30, 50);
}

1.4 特殊技能(Special Abilities)

hero.special(specialType, x, y)

向坐标点 {x, y} 释放一个引力技能。特殊技能不消耗法力,但需要时间冷却。可用的 specialType 有:"pull"(引力井,吸聚怪物)、"push"(推开怪物)、"burst"(短促强力的推)、"teleport"(把怪物传送到对手基地方向)。

hero.isReady(specialType)

检查某个特殊技能是否已冷却完毕、可以使用。boolean
# 拉力就绪时,把怪物吸聚到加农炮射程内
if hero.isReady("pull"):
    hero.special("pull", 40, 40)

# 怪物逼近基地,用爆发救场
if hero.isReady("burst"):
    hero.special("burst", hero.x + 10, hero.y)
// 拉力就绪时,把怪物吸聚到加农炮射程内
if (hero.isReady("pull")) {
    hero.special("pull", 40, 40);
}

// 怪物逼近基地,用爆发救场
if (hero.isReady("burst")) {
    hero.special("burst", hero.x + 10, hero.y);
}

1.5 查询塔与对手(Find Towers & Enemy)

hero.findTowers() / hero.findMyTowers() / hero.findEnemyTowers()

分别返回:地图上的所有塔 / 我方所有塔 / 敌方所有塔。list of tower

hero.getEnemyHero()

返回对手英雄(对方水晶/基地)的引用。hero 对象
# 遍历我方所有塔,统计类型与等级
myTowers = hero.findMyTowers()
for t in myTowers:
    type = t.type
    level = t.level

# 比较双方基地血量
enemy = hero.getEnemyHero()
if hero.health > enemy.health:
    hero.build("archer", "A")
// 遍历我方所有塔,统计类型与等级
auto myTowers = hero.findMyTowers();
for (auto& t : myTowers) {
    auto type = t.type;
    auto level = t.level;
}

// 比较双方基地血量
auto enemy = hero.getEnemyHero();
if (hero.health > enemy.health) {
    hero.build("archer", "A");
}

1.6 参数查询(Parameter Queries)

hero.getTowerParameters(towerType, level=1)

返回指定塔类型在某等级下的参数对象,字段包括:typelevelattackDamageattackRangeattackCooldowncost

hero.getMonsterParameters(monsterType)

返回指定怪物类型的参数对象,字段包括:typeattackDamageattackRangemaxSpeedmanaflying(是否飞行)。
# 查询 3 级法师塔的参数
params = hero.getTowerParameters("mage", 3)
range = params.attackRange

# 判断怪物是否会飞,决定是否需要法师塔
mp = hero.getMonsterParameters("rider")
if mp.flying:
    hero.build("mage", "B")
// 查询 3 级法师塔的参数
auto params = hero.getTowerParameters("mage", 3);
auto range = params.attackRange;

// 判断怪物是否会飞,决定是否需要法师塔
auto mp = hero.getMonsterParameters("rider");
if (mp.flying) {
    hero.build("mage", "B");
}

1.7 波次信息(Wave Information)

hero.getWaves()

返回一个"数组的数组",每个子数组代表一波怪物,列出该波包含的怪物类型。
# getWaves() 返回结构示例:
# [
#   ['munchkin'],                       # 第1波只有 munchkin
#   ['munchkin', 'ogre'],               # 一个 munchkin 再一个 ogre,循环
#   ['ogre', 'thrower', 'munchkin'],    # 三种怪物按此顺序
# ]
waves = hero.getWaves()
total = len(waves)
// getWaves() 返回结构示例:
// [
//   ["munchkin"],                       // 第1波只有 munchkin
//   ["munchkin", "ogre"],               // 一个 munchkin 再一个 ogre,循环
//   ["ogre", "thrower", "munchkin"],    // 三种怪物按此顺序
// ]
auto waves = hero.getWaves();
auto total = waves.size();

hero.getWave(waveNumber) / hero.getWaveNumber()

getWave(n) 返回第 n 波的怪物类型数组(第一波编号为 0);getWaveNumber() 返回当前波次编号(整数,首波为 0)。

hero.getCurrentWave() / hero.getNextWave()

分别返回当前波 / 下一波的怪物类型数组。提前看下一波,调整防御部署。
# 提前侦察下一波,若有飞行怪就补法师塔
nextWave = hero.getNextWave()
if "bird" in nextWave or "rider" in nextWave:
    hero.build("mage", "B")

current = hero.getWaveNumber()
// 提前侦察下一波,若有飞行怪就补法师塔
auto nextWave = hero.getNextWave();
if (nextWave.contains("bird") || nextWave.contains("rider")) {
    hero.build("mage", "B");
}

auto current = hero.getWaveNumber();

1.8 目标策略(Targeting)

hero.setTargeting(tower, targetingType)

设置某座塔选择下一个攻击目标的方式。targetingType 可为:'close'(默认,最近的怪)、'left'(按 X 坐标离基地最近)、'right'(按 X 坐标离基地最远)、'weak'(血量最低)、'strong'(血量最高)。
策略含义适用场景
'close'最近的怪物(默认)通用,保护塔自身周边
'left'按 X 离基地最近优先打最逼近基地的怪
'right'按 X 离基地最远提前点掉刚进场的怪
'weak'血量最低快速收割、刷法力
'strong'血量最高集火精英厚血怪
# 让 A 点的塔优先攻击最逼近基地的怪
tower = hero.build("archer", "A")
hero.setTargeting(tower, "left")

# 让所有加农炮集火血量最高的精英怪
for t in hero.findMyTowers():
    if t.type == "cannon":
        hero.setTargeting(t, "strong")
// 让 A 点的塔优先攻击最逼近基地的怪
auto tower = hero.build("archer", "A");
hero.setTargeting(tower, "left");

// 让所有加农炮集火血量最高的精英怪
for (auto& t : hero.findMyTowers()) {
    if (t.type == "cannon") {
        hero.setTargeting(t, "strong");
    }
}

1.9 技能与守卫(Anomalies & Guards)

hero.findActiveAnomalies()

返回当前活跃的引力技能对象数组。每个技能包含字段:force(强度,正数=拉、负数=推)、xyendX/endY(传送出口坐标)、name(产生它的技能名)、duration(剩余持续时间)。

hero.wait(t)

等待 t 秒,什么也不做。

hero.on("spawn-guard", fn)

注册一个回调函数,当新守卫生成时被调用,守卫将执行该函数。

hero.findMyGuards() / hero.findEnemyGuards()

分别返回我方守卫数组 / 对手守卫数组。list of guard
# 守卫生成回调:自动攻击最近怪物
def guardAct(data):
    guard = data.guard
    while True:
        monster = guard.findNearestMonster()
        if monster:
            guard.attack(monster)

hero.on("spawn-guard", guardAct)

# 查看活跃技能并等待
anomalies = hero.findActiveAnomalies()
if len(anomalies) == 0:
    hero.wait(1)
// 守卫生成回调:自动攻击最近怪物
void guardAct(auto data) {
    auto guard = data.guard;
    while (true) {
        auto monster = guard.findNearestMonster();
        if (monster) {
            guard.attack(monster);
        }
    }
}

hero.on("spawn-guard", guardAct);

// 查看活跃技能并等待
auto anomalies = hero.findActiveAnomalies();
if (anomalies.size() == 0) {
    hero.wait(1);
}
提醒:不要在 spawn-guard 的回调函数里调用会阻塞的英雄方法(如 hero.buildhero.special),否则会卡住主线程。回调里只使用守卫自己的方法。

1.10 寻敌与工具(Targeting Helpers)

hero.distanceTo(target)

返回从英雄到目标的距离。number

hero.findMonsters()

返回地图上所有存活怪物的数组。list of monster

hero.findNearest(targets)

targets 数组中返回离英雄最近的目标;数组为空时返回 null
# 找到最近的怪物,并对它所在位置释放拉力
monsters = hero.findMonsters()
nearest = hero.findNearest(monsters)
if nearest and hero.isReady("pull"):
    d = hero.distanceTo(nearest)
    if d < 40:
        hero.special("pull", nearest.x, nearest.y)
// 找到最近的怪物,并对它所在位置释放拉力
auto monsters = hero.findMonsters();
auto nearest = hero.findNearest(monsters);
if (nearest && hero.isReady("pull")) {
    auto d = hero.distanceTo(nearest);
    if (d < 40) {
        hero.special("pull", nearest.x, nearest.y);
    }
}

2. Tower 类 API

The Tower Class —— Inspect Your Towers

hero.build(...)hero.findMyTowers() 等方法得到的塔对象拥有以下只读属性:

属性说明
tower.x / tower.y塔中心的横 / 纵坐标(蓝队时自动镜像)
tower.attackDamage塔每次攻击的伤害
tower.attackCooldown塔两次攻击之间的间隔时间
tower.attackRange塔攻击的最大射程
tower.level塔的等级
tower.type塔的类型字符串
# 找出等级最低的塔,优先升级它
towers = hero.findMyTowers()
if len(towers) > 0:
    weakest = towers[0]
    for t in towers:
        if t.level < weakest.level:
            weakest = t
    hero.build(weakest.type, weakest.x, weakest.y)
// 找出等级最低的塔,优先升级它
auto towers = hero.findMyTowers();
if (towers.size() > 0) {
    auto weakest = towers[0];
    for (auto& t : towers) {
        if (t.level < weakest.level) {
            weakest = t;
        }
    }
    hero.build(weakest.type, weakest.x, weakest.y);
}

3. Guard 类 API

The Guard Class —— Command Your Guardians

spawn-guard 回调函数中拿到的 guard 对象拥有以下方法。它们用来移动、攻击、释放守卫专属技能。

guard.moveTo(x, y)

命令守卫前往坐标 {x, y}。该方法阻塞守卫代码,直到守卫到达目标点后才执行下一条命令。

guard.moveToward(x, y)

命令守卫朝坐标 {x, y} 移动。该方法不阻塞,可被后续命令打断。

guard.attack(target)

命令守卫攻击指定目标。

guard.special(abilityName)

命令守卫释放特殊技能。abilityName 可为:"roar"(让周围怪物都来攻击守卫)、"hide"(隐匿,丢失所有怪物仇恨)、"haste"(短时间提升守卫速度)。

guard.isReady(abilityName)

检查守卫的某个特殊技能是否就绪("roar" / "hide" / "haste")。boolean

guard.findNearestMonster()

返回离该守卫最近的怪物。

guard.distanceTo(target) / guard.findMonsters() / guard.findNearest(targets)

分别为:返回到目标的距离 / 返回所有存活怪物数组 / 返回数组中离守卫最近的目标(空则返回 null)。
def guardAct(data):
    guard = data.guard
    while True:
        monster = guard.findNearestMonster()
        if monster:
            # 离得远先靠近,靠近后用咆哮聚怪再攻击
            if guard.distanceTo(monster) > 5:
                guard.moveToward(monster.x, monster.y)
            else:
                if guard.isReady("roar"):
                    guard.special("roar")
                guard.attack(monster)

hero.on("spawn-guard", guardAct)
void guardAct(auto data) {
    auto guard = data.guard;
    while (true) {
        auto monster = guard.findNearestMonster();
        if (monster) {
            // 离得远先靠近,靠近后用咆哮聚怪再攻击
            if (guard.distanceTo(monster) > 5) {
                guard.moveToward(monster.x, monster.y);
            } else {
                if (guard.isReady("roar")) {
                    guard.special("roar");
                }
                guard.attack(monster);
            }
        }
    }
}

hero.on("spawn-guard", guardAct);

4. Vector 类 API

The Vector Class —— Math Utilities

Vector(向量)类为单位提供了访问坐标与进行向量运算的能力。它在计算方向、距离、目标位置时非常有用。

4.1 向量属性与实例方法(Properties & Instance Methods)

成员说明
Vector.x / .y / .z向量的 x / y / z 坐标(通常以米为单位)
Vector.magnitude()返回向量的长度(模)
Vector.heading()返回向量的朝向角度(弧度)。指向右为 0,指向上为 π/2
Vector.distance(other)返回到另一个向量的距离
Vector.dot(other)返回点积:this.x*other.x + this.y*other.y
Vector.equals(other)返回此向量是否等于给定向量
Vector.copy()返回此向量的一个副本

4.2 向量类方法(Class Methods)

类方法说明
Vector.add(a, b)两个向量相加,返回新向量
Vector.subtract(a, b)一个向量减去另一个,返回新向量
Vector.multiply(n)向量乘以标量,返回新向量
Vector.divide(n)向量除以标量,返回新向量
Vector.limit(max)把向量限制到给定长度(更短则不变),返回新向量
Vector.normalize()把向量归一化为长度 1(长度为 0 时除外),返回新向量
Vector.rotate(vector, angle)把向量绕原点旋转给定角度,返回新向量
# 计算从基地指向某怪物的方向向量
base = Vector(hero.x, hero.y)
target = Vector(monster.x, monster.y)

# 方向 = 目标 - 基地,再归一化
direction = Vector.subtract(target, base)
unit = direction.normalize()

dist = base.distance(target)
angle = direction.heading()

# 在基地前方 15 米处释放推力
spot = Vector.add(base, Vector.multiply(unit, 15))
hero.special("push", spot.x, spot.y)
// 计算从基地指向某怪物的方向向量
Vector base(hero.x, hero.y);
Vector target(monster.x, monster.y);

// 方向 = 目标 - 基地,再归一化
auto direction = Vector::subtract(target, base);
auto unit = direction.normalize();

auto dist = base.distance(target);
auto angle = direction.heading();

// 在基地前方 15 米处释放推力
auto spot = Vector::add(base, Vector::multiply(unit, 15));
hero.special("push", spot.x, spot.y);

API 速查表 ✨

类别常用成员
Hero · 属性x y time health maxHealth mana towerTypes monsterTypes
Hero · 建造build(type, place) build(type, x, y) canBuildAt(x, y)
Hero · 技能special(type, x, y) isReady(type)
Hero · 查询findTowers() findMyTowers() findEnemyTowers() getEnemyHero()
Hero · 参数getTowerParameters(type, level) getMonsterParameters(type)
Hero · 波次getWaves() getWave(n) getWaveNumber() getCurrentWave() getNextWave()
Hero · 策略setTargeting(tower, type)
Hero · 技能/守卫findActiveAnomalies() wait(t) on("spawn-guard", fn) findMyGuards() findEnemyGuards()
Hero · 寻敌distanceTo(t) findMonsters() findNearest(targets)
Towerx y attackDamage attackCooldown attackRange level type
GuardmoveTo(x,y) moveToward(x,y) attack(t) special(name) isReady(name) findNearestMonster() distanceTo(t) findMonsters() findNearest(targets)
Vector · 实例x y z magnitude() heading() distance(o) dot(o) equals(o) copy()
Vector · 类方法add subtract multiply divide limit normalize rotate

掌握这些 API,你就握住了苔原塔的全部操控权 ⚔️❄️
把它们组合起来,写出属于你自己的制胜策略吧!🏰

CodeCombat 编程知识 · 多人竞技场:苔原塔(Tundra Tower)· 强化篇 API 大全

扣哒世界(CodeCombat)教研团队