CodeCombat 时空管理

Lifecycle & Memory Management

LEVEL 19

奔向黄金 (Gold Rush)

限时寻宝

这里的财宝有魔法,它们会在几秒钟后凭空消失! 我们的任务是给每个生成的金币设定一个“死亡倒计时”。

打标签 (Tagging)

当金币生成时,我们在它身上贴个标签:
item.destroyTime = game.time + 5秒

自毁程序 (Self-Destruct)

每个金币都有自己的 onSpawn 循环。
它们时刻盯着表:“现在时间 > 我的销毁时间了吗?”
如果是,就调用 destroy() 自我了断。

Time Left: 0s
vanishing_gold.py
1
# 生成随机位置的宝物,晚些时候将其destroy。
2
def spawnValuable(itemType, lifetime):
辅助函数:生成带寿命的物品
3
x = game.randomInteger(12, 68)
随机X
4
y = game.randomInteger(12, 56)
随机Y
5
item = game.spawnXY(itemType, x, y)
生成物品
6
item.destroyTime = game.time + lifetime
设定死期:当前时间 + 寿命
7
8
def spawnTreasures():
生成一组不同寿命的宝物
9
spawnValuable("bronze-coin", 6)
铜币活6秒
10
spawnValuable("silver-coin", 5)
银币活5秒
11
spawnValuable("gold-coin", 4)
金币活4秒
12
spawnValuable("gem", 2)
宝石只活2秒!
13
14
def onSpawn(event):
物品出生后的逻辑
15
item = event.target
16
while True:
无限循环检查
17
# 如果游戏时间大于物品的destroyTime:
18
if item.destroyTime < game.time:
如果寿命到了
19
# 调用物品的destroy() 方法:
20
item.destroy()
消失!
21
22
game.setActionFor("bronze-coin", "spawn", onSpawn)
23
game.setActionFor("silver-coin", "spawn", onSpawn)
24
game.setActionFor("gold-coin", "spawn", onSpawn)
25
game.setActionFor("gem", "spawn", onSpawn)
26
27
game.spawnTime = 0
28
game.spawnInterval = 3
每3秒生成一波
29
game.score = 0
30
if not db.get("topScore"):
31
db.set("topScore", 0)
32
ui.track(game, "time")
33
ui.track(game, "score")
34
ui.track(db, "topScore")
35
goal = game.addManualGoal("30秒内收集至少50金。")
36
37
player = game.spawnPlayerXY("captain", 40, 34)
38
player.maxSpeed = 25
39
40
def onCollect(event):
收集事件
41
item = event.other
42
if item.value:
43
game.score += item.value
加分
44
player.on("collect", onCollect)
45
46
def checkSpawns():
生成计时器
47
if game.time > game.spawnTime:
48
spawnTreasures()
生成新物品
49
game.spawnTime += game.spawnInterval
50
51
def checkGoal():
目标检查
52
if game.score >= 50:
53
game.setGoalState(goal, True)
54
else:
55
game.setGoalState(goal, False)
56
57
def checkGameOver():
游戏结束检查
58
if game.time > 30:
超过30秒
59
checkGoal()
60
db.set("topScore", game.score)
保存分数
61
62
while True:
63
checkSpawns()
64
checkGameOver()
LEVEL 20

分裂箭 (Splitting Arrows)

战场清道夫

这是一场大规模战争!我们将击败 77 个食人魔。
如果我们把尸体都留在地上,电脑内存会“爆炸”(变卡)。
所以,我们使用 defeat 事件作为触发器,立即销毁尸体。

常规情况 (Normal)

敌人死亡 -> 播放死亡动画 -> 留下尸体 -> 占用内存。

清道夫模式 (Cleanup)

onDefeat 触发 -> 计数+1 -> 立即调用 unit.destroy()
结果:敌人瞬间消失,不留痕迹,游戏运行如丝般顺滑。

Clean Memory

cleanup_crew.py
1
def spawnArcher(x, y):
辅助函数:生成弓箭手
2
archer = game.spawnXY("archer", x, y)
3
archer.behavior = "Defends"
4
archer.attackDamage = 20
5
def spawnMunchkin(x, y):
辅助函数:生成食人魔
6
ogre = game.spawnXY("munchkin", x, y)
7
ogre.behavior = "AttacksNearest"
8
9
def spawnArcherWall():
生成弓箭手墙
10
spawnArcher(30, 12)
11
spawnArcher(30, 23)
12
spawnArcher(30, 34)
13
spawnArcher(30, 45)
14
spawnArcher(30, 56)
15
16
def spawnOgreWave():
生成一波食人魔
17
offset = game.randomInteger(-6, 6)
18
spawnMunchkin(80, 16 + offset)
批量生成
19
spawnMunchkin(80, 22 + offset)
20
spawnMunchkin(80, 28 + offset)
21
spawnMunchkin(80, 34 + offset)
22
spawnMunchkin(80, 40 + offset)
23
spawnMunchkin(80, 46 + offset)
24
spawnMunchkin(80, 52 + offset)
25
26
def onDefeat(event):
清理逻辑
27
unit = event.target
28
# 将游戏的被击败敌人数( defeated )属性增加一:
29
game.defeated += 1
记录战绩
30
# 基本单位调用摧毁(destroy)方法
31
unit.destroy()
立即销毁尸体
32
33
game.setActionFor("munchkin", "defeat", onDefeat)
绑定事件
34
35
game.defeated = 0
36
game.spawnTime = 0
37
goal = game.addManualGoal("击败77个食人魔。")
38
ui.track(game, "defeated")
39
def checkSpawnTimer():
40
if game.time > game.spawnTime:
41
spawnOgreWave()
42
game.spawnTime += 1
43
def checkGoal():
44
if game.defeated >= 77:
45
game.setGoalState(goal, True)
胜利!
46
47
spawnArcherWall()
48
while True:
49
checkSpawnTimer()
50
checkGoal()