CodeCombat 生存挑战

多线程计时管理系统

LEVEL 7

茶点时间 (Refresher)

多轨时间管理

指挥官,这次的任务非常棘手!你不仅要面对普通的矮人,还有远程的投矛手,而且还得记得喝药水保命。
如果我们只用一个闹钟,肯定会乱套。我们需要三个独立的闹钟并行工作:

  • Munchkin Timer 每 6 秒
  • Thrower Timer 每 9 秒
  • Potion Timer 每 6 秒
UI 小技巧: 我们还需要告诉玩家下一次药水什么时候来。
公式:剩余时间 = 药水生成时刻 - 当前时刻
UPDATE()
Check 1 Munchkin?
Check 2 Potion?
Check 3 Thrower?
更新 UI 显示
multi_timer.py
1
# 使用计时器生成敌人和物品。
2
def spawnMunchkins():
辅助函数:生成2个矮人
3
munchkin1 = game.spawnXY("munchkin", 2, 12)
4
munchkin2 = game.spawnXY("munchkin", 2, 56)
5
munchkin1.behavior = "AttacksNearest"
设置行为:主动攻击
6
munchkin2.behavior = "AttacksNearest"
7
def spawnThrowers():
辅助函数:生成2个投矛手
8
thrower1 = game.spawnXY("thrower", 2, 16)
9
thrower1.behavior = "AttacksNearest"
10
thrower2 = game.spawnXY("thrower", 2, 52)
11
thrower2.behavior = "AttacksNearest"
12
def spawnPotion():
辅助函数:生成药水
13
game.spawnXY("potion-large", 46, 34)
14
15
game.addSurviveGoal(20)
目标:存活20秒
16
game.munchkinSpawnTime = 0
矮人闹钟:立刻生成
17
game.throwerSpawnTime = 0
投矛手闹钟:立刻生成
18
game.potionSpawnTime = 6
药水闹钟:6秒后生成
19
game.nextPotionIn = 0
UI变量初始化
20
ui.track(game, "time")
显示游戏总时间
21
# 让我们显示到下一瓶药水生成要多长时间。
22
ui.track(game, "nextPotionIn")
显示药水倒计时
23
player = game.spawnPlayerXY("duelist", 40, 34)
生成玩家
24
player.maxSpeed = 15
25
26
def updateTimers():
核心管理函数
27
# 如果游戏时间大于munchkinSpawnTime(矮人生成时间)
28
if game.time > game.munchkinSpawnTime:
检查矮人闹钟
29
game.munchkinSpawnTime = game.munchkinSpawnTime + 6
重设闹钟:+6秒
30
spawnMunchkins()
执行生成
31
# 如果游戏时间大于potionSpawnTime(药水生成时间)
32
if game.time > game.potionSpawnTime:
检查药水闹钟
33
player.say("药水在这!")
提示玩家
34
game.potionSpawnTime = game.potionSpawnTime + 6
重设闹钟:+6秒
35
spawnPotion()
生成药水
36
# 如果游戏的时间(time)大于游戏的投矛手生成时间
37
if game.time > game.throwerSpawnTime:
检查投矛手闹钟
38
game.throwerSpawnTime = game.throwerSpawnTime + 9
重设闹钟:+9秒
39
spawnThrowers()
生成投矛手
40
# 更新UI计时器,直到下一瓶药水生成
41
game.nextPotionIn = game.potionSpawnTime - game.time
计算倒计时数值
42
43
while True:
主循环
44
updateTimers()
不断检查更新所有闹钟