CodeCombat 规则制定者

Manual Goals & Logic Gates

LEVEL 11

切换目标 (Switching Targets)

设计师手记

恭喜你晋升为“游戏设计师”!以前我们只能被动地完成系统给的任务,现在,我们要自己写任务列表了。

Step 1: 创建任务卡

使用 game.addManualGoal("任务描述")
这就像在屏幕右边贴了一张便利贴,上面是个空心框框

Step 2: 拿着红笔打钩

系统不会自动帮你打钩。你需要写代码来判断。
当条件满足(比如击败了3个侦察兵),你必须大喊:
game.setGoalState(目标, True)
这时候,便利贴上才会变成

QUEST LOG
Defeat Boss
Defeat Scouts (2/3)

代码控制打钩

goal_setter.py
1
# 现在你可以为自己的游戏创建一个自定义目标
2
game.spawnMaze(5)
生成迷宫
3
game.spawnXY("scout", 60, 58)
4
game.spawnXY("scout", 28, 29)
5
game.spawnXY("scout", 61, 24)
6
ogref = game.spawnXY("ogre-f", 60, 12)
生成BOSS
7
8
hero = game.spawnPlayerXY("captain", 12, 56)
9
hero.maxHealth = 550
10
hero.attackDamage = 25
11
12
generator = game.spawnXY("generator", 41, 13)
生成器
13
generator.spawnDelay = 5
14
generator.spawnType = "munchkin"
15
16
game.addSurviveGoal()
内置目标:存活
17
game.spawnXY("potion-medium", 28, 12)
18
19
# addManualGoal添加一个带描述的未完成目标
20
scoutGoal = game.addManualGoal("Defeat all scouts")
创建任务1:击败侦察兵
21
# 调用游戏的addManualGoal方法来添加击败Boss的目标
22
bossGoal = game.addManualGoal("Defeat the big boss!")
创建任务2:击败Boss
23
24
def onSpawn(event):
设置敌人AI
25
unit = event.target
26
while True:
27
enemy = unit.findNearestEnemy()
28
if enemy:
29
unit.attack(enemy)
30
game.setActionFor("scout", "spawn", onSpawn)
31
game.setActionFor("ogre", "spawn", onSpawn)
32
33
scoutsDefeated = 0
计数器初始化
34
def onDefeat(event):
裁判逻辑:谁死了?
35
unit = event.target
36
if unit.type == "scout":
如果是侦察兵死了
37
global scoutsDefeated
38
scoutsDefeated += 1
计数+1
39
hero.say("Scout down!")
40
if scoutsDefeated >= 3:
如果侦察兵死够了
41
# 使用setGoalState来标记scoutGoal完成。
42
game.setGoalState(scoutGoal, True)
任务1完成!
43
hero.say("All Scouts down!")
44
if unit.type == "ogre":
如果是Boss死了
45
# 使用game.setGoalState来标记bossGoal完成。
46
game.setGoalState(bossGoal, True)
任务2完成!
47
hero.say("Defeated the big boss!")
48
49
game.setActionFor("scout", "defeat", onDefeat)
50
game.setActionFor("ogre", "defeat", onDefeat)
LEVEL 12

别碰他们 (Don't Touch Them)

禁忌规则设计

在这个关卡,我们不仅要定义“怎么赢”,还要定义“怎么输”。 目标很复杂:杀侦察兵(Scout),但是绝对不能碰矮人(Munchkin)

立即失败条件

如果任何一个 Munchkin 死掉了:
game.setGoalState(dontTouchGoal, False)
设置成 False,意味着任务失败,游戏直接结束(Game Over)。

连锁成功条件

那个“不要碰矮人”的任务,什么时候算成功呢?
只有当其他所有任务都做完了,它才算成功。
我们在 checkGoals 里不断检查:如果任务A完成了 AND 任务B完成了 -> 任务C成功。

规则引擎

if MunchkinDies:
  FAIL GAME
if OthersDone:
  SUCCESS
rules_engine.py
1
def createGenerator(spawnType, x, y, spawnAI):
辅助函数:创建生成器
2
generator = game.spawnXY("generator", x, y)
3
generator.spawnType = spawnType
4
generator.spawnAI = spawnAI
5
6
createGenerator("scout", 12, 12, "AttacksNearest")
生成侦察兵(要杀的)
7
createGenerator("scout", 68, 56, "AttacksNearest")
8
createGenerator("munchkin", 12, 56, "Scampers")
生成矮人(不能碰的)
9
createGenerator("munchkin", 68, 12, "Scampers")
10
11
player = game.spawnPlayerXY("duelist", 40, 34)
12
player.maxHealth = 1000
13
player.attackDamage = 20
14
player.maxSpeed = 20
15
16
spawnMunchkinsGoal = game.addManualGoal("生成6个矮人。")
目标1
17
dontTouchGoal = game.addManualGoal("不要攻击矮人。")
目标2(禁忌目标)
18
defeatScoutsGoal = game.addManualGoal("击败6名侦察兵。")
目标3
19
game.spawnedMunchkins = 0
20
game.defeatedScouts = 0
21
ui.track(game, "spawnedMunchkins")
22
ui.track(game, "defeatedScouts")
23
def onSpawn(event):
24
game.spawnedMunchkins += 1
记录生成数量
25
26
def onDefeat(event):
死亡处理
27
unit = event.target
28
if unit.type == "scout":
29
game.defeatedScouts += 1
侦察兵死了,好事
30
if unit.type == "munchkin":
31
# 如果有矮人被击败,dontTouchGoal失败。
32
game.setGoalState(dontTouchGoal, False)
任务失败!游戏结束
33
player.say("Oops.")
34
35
def checkGoals():
状态检查循环
36
# 如果game.defeatedScouts大于5:
37
if game.defeatedScouts >= 6:
38
game.setGoalState(defeatScoutsGoal, True)
目标3达成
39
# 如果game.spawnedMunchkins大于5:
40
if game.spawnedMunchkins >= 6:
41
game.setGoalState(spawnMunchkinsGoal, True)
目标1达成
42
# 如果其他两个目标都完成了。
43
if spawnMunchkinsGoal.success:
检查目标1状态
44
if defeatScoutsGoal.success:
检查目标3状态
45
# 将dontTouchGoal状态设置为成功。.
46
game.setGoalState(dontTouchGoal, True)
全目标达成!
47
48
game.setActionFor("munchkin", "spawn", onSpawn)
49
game.setActionFor("munchkin", "defeat", onDefeat)
50
game.setActionFor("scout", "defeat", onDefeat)
51
52
while True:
53
checkGoals()
每帧都要检查