CodeCombat 死亡回响

Event: "defeat" (击败事件)

LEVEL 9

失败的痛苦 (The Agony of Defeat)

战利品机制分析

指挥官,你玩过 RPG 游戏吗?当你打败 BOSS 时,地上会“砰”的一声爆出金币和装备。
今天我们就来编写这个“掉落系统”

触发条件 (Trigger)

我们不监视 spawn(出生),而是监视 defeat(死亡)。
当敌人倒下那一刻,代码开始执行。

掉落位置 (Location)

金币不能生成在别处,必须生成在尸体附近。
公式:尸体坐标(unit.pos) + 一点点随机偏移(random)
如果不加偏移,金币会叠在一起,看起来很假哦!

game.spawnXY("gold-coin", x, y)
loot_system.py
1
# "defeat"事件是某单位被击败的事件。
2
game.spawnPlayerXY("captain", 40, 35)
3
game.addSurviveGoal()
4
game.addCollectGoal(8)
目标:收集8枚金币
5
6
def onSpawn(event):
敌人出生逻辑
7
while True:
8
unit = event.target
9
enemy = unit.findNearestEnemy()
10
if enemy:
11
unit.attack(enemy)
12
13
# 当一个单位被击败时,生成一枚金币。
14
def onDefeat(event):
核心:死亡处理器
15
unit = event.target
获取那个"死掉的单位"
16
# 将x设置为unit.pos.x加上-5到5之间的一个随机数字
17
x = unit.pos.x + game.randomInteger(-5, 5)
计算X偏移坐标
18
# 将y设置为unit.pos.y加上-5到5之间的一个随机数字
19
y = unit.pos.y + game.randomInteger(-5, 5)
计算Y偏移坐标
20
# 在x, y处生成一枚"gold-coin"
21
game.spawnXY("gold-coin", x, y)
发奖励!生成金币
22
23
game.setActionFor("munchkin", "spawn", onSpawn)
绑定出生事件
24
game.setActionFor("munchkin", "defeat", onDefeat)
绑定死亡事件
25
26
spawnTime = 0
随机生成器逻辑...
27
while True:
28
if game.time > spawnTime:
29
x = game.randomInteger(10, 70)
30
y = game.randomInteger(10, 60)
31
game.spawnXY("munchkin", x, y)
32
spawnTime = game.time + game.randomInteger(1,4)
LEVEL 10

九头蛇 (Hydra)

九头蛇机制分析

传说中的九头蛇,砍掉一个头,会长出两个新的!在这一关,我们依然使用 defeat 事件,但这次不是掉金币,而是掉... 新的敌人

分裂逻辑

当一个食人魔死亡:
1. 掉落药水(不然玩家打不过)。
2. 立即生成 2 个新食人魔!
3. 更新 UI 计数器(记录杀了多少,还需要杀多少)。

UI 变量追踪

我们使用 game.defeated += 1 来记录战绩。 使用 ui.track(game, "defeated") 让它显示在屏幕上。

spawnXY * 2

hydra_logic.py
1
player = game.spawnPlayerXY("knight", 40, 34)
2
player.attackDamage = 20
增加玩家攻击力
3
4
# 用这个来为被击败的食人魔计数。
5
game.defeated = 0
已击败数量初始化为0
6
# 玩家需要击败多少食人魔
7
game.toDefeat = 16
目标总数16
8
game.addDefeatGoal(game.toDefeat)
设置胜利目标
9
# 使用ui.track将这些有用的变量显示给玩家
10
ui.track(player, "health")
追踪玩家血量
11
ui.track(game, "defeated")
追踪已击败数
12
ui.track(game, "toDefeat")
追踪剩余目标数
13
14
game.spawnXY("munchkin", 30, 14)
生成初始敌人1
15
game.spawnXY("munchkin", 50, 54)
生成初始敌人2
16
17
def onSpawn(event):
18
unit = event.target
19
unit.behavior = "AttacksNearest"
设置为主动攻击模式
20
21
# 为已经击败的敌人计数并生成新敌人。
22
def onDefeat(event):
核心:分裂逻辑
23
unit = event.target
24
# 减少game.toDefeat属性值。
25
game.toDefeat -= 1
剩余目标 - 1
26
# 增加game.defeated属性值:
27
game.defeated += 1
击败总数 + 1
28
# 为新敌人获取随机坐标。
29
x1 = game.randomInteger(10, 40)
位置1:左侧随机
30
x2 = game.randomInteger(40, 70)
位置2:右侧随机
31
y = game.randomInteger(12, 56)
随机高度
32
game.spawnXY("potion-small", unit.pos.x, unit.pos.y)
原地掉落药水
33
# 在点x1, y处生成一个"munchkin":
34
game.spawnXY("munchkin", x1, y)
新敌人 A
35
# 在点x2, y处生成一个"munchkin":
36
game.spawnXY("munchkin", x2, y)
新敌人 B
37
38
game.setActionFor("munchkin", "spawn", onSpawn)
39
# 将处理器函数onDefeat添加到所有 "munchkin"的 "defeat" 事件上
40
game.setActionFor("munchkin", "defeat", onDefeat)
无限循环的开始
教官提示: 敌人会越来越多!如果被包围了,记得按下 空格键 (Space) 使用骑士的特殊技能进行反击!