CodeCombat 森林篇:嵌套逻辑

思维的俄罗斯套娃

嵌套 If (Nested If)
如果(IF) 有敌人:
  如果(IF) 距离很近:
    攻击!
一层套一层,处理更复杂的情况。
对象属性 (Properties)
item.pos.x
获取物品的坐标位置,不仅限于找人。
No.26

跃火林中

位置与判断

这一关有两个火球飞来飞去,我们要躲避它们,同时根据**宝石的位置**来决定去向。

第一层判断: 有没有宝石?(if evilstone)

第二层判断: 宝石在哪里?(if pos.x == 34)
如果宝石在左边(34),我们就去右边躲避。

pos = item.pos
获取坐标对象
solution.py
1
while True:
循环。
2
evilstone = hero.findNearestItem()
找宝石。
3
if evilstone:
找到宝石了吗?
4
pos = evilstone.pos
获取它的坐标。
5
if pos.x == 34:
如果X坐标是34(左边)...
6
hero.moveXY(46, 22)
去右边避难。
7
else:
否则(在右边)...
8
hero.moveXY(34, 22)
去左边避难。
9
else:
没宝石了?
10
hero.moveXY(40, 22)
回中间安全点。
No.27

以静制动

战术嵌套

这个关卡是嵌套逻辑的经典应用。

1. 有敌人吗?
2. 距离近吗 (<5m)?
-> 是:攻击
-> 否:防御 (Shield)
没有敌人?
-> 回家防守。
solution.py
1
while True:
循环。
2
enemy = hero.findNearestEnemy()
找敌人。
3
if enemy:
有敌人?
4
dist = hero.distanceTo(enemy)
量距离。
5
if dist < 5:
太近了?
6
hero.attack(enemy)
打!
7
else:
还远...
8
hero.shield()
举盾防守。
9
else:
没敌人?
10
hero.moveXY(40, 34)
回防。
No.28

Agrippa守卫战

忍耐与爆发

敌人太多了,不能看见就打。
要等他们**聚在一起**(距离 < 5米)再放 Cleave!

完美连招:
1. 有敌人?
2. 够近吗 (<5)?
3. 大招好了吗 (isReady)?
-> Cleave!
solution.py
1
while True:
循环。
2
enemy = hero.findNearestEnemy()
找人。
3
if enemy:
有敌人。
4
dist = hero.distanceTo(enemy)
测距。
5
if dist < 5:
太近了?
6
if hero.isReady("cleave"):
三层嵌套:技能好了?
7
hero.cleave(enemy)
放大招!
8
else:
没好...
9
hero.attack(enemy)
普攻。
No.29

概念挑战:危险的树

侦察与反击

你穿了迷彩服,敌人看不见你,除非你靠得太近。

逻辑挑战:
1. 有敌人吗?
2. 距离小于 15 吗?
3. 满足上述两点 -> 攻击。
4. 否则 -> 去中间 (40, 34) 躲着。

solution.py
1
while True:
循环。
2
enemy = hero.findNearestEnemy()
侦察。
3
if enemy:
有敌人?
4
dist = hero.distanceTo(enemy)
测距。
5
if dist < 15:
进入射程?
6
hero.attack(enemy)
攻击!
7
else:
没敌人?
8
hero.moveXY(40, 34)
躲好。
No.30

组合挑战:最后的守护者

终极测试

你需要用上学到的所有知识:嵌套If, Else, Cleave, Distance。

近战 (<10m): 有Cleave用Cleave,没有普攻。

远程 (>10m): 呼叫火炮支援 (hero.say(dist))。

solution.py
1
while True:
循环。
2
enemy = hero.findNearestEnemy()
侦察。
3
if enemy:
有敌人?
4
dist = hero.distanceTo(enemy)
测距。
5
if dist < 10:
近战范围。
6
if hero.isReady("cleave"):
大招好了?
7
hero.cleave(enemy)
劈!
8
else:
没好。
9
hero.attack(enemy)
普攻。
10
else:
远程范围。
11
hero.say(dist)
报数开炮!