CodeCombat 循环控制流

Continue 与 Break 进阶应用(67-69关)

第 67 关

炼金术传承 (Alchemist's Legacy)

战术思路分析:跳过毒药

食人魔在抢水源,但地面上混杂着毒药(`"poison"`)。英雄需要避免触碰毒药。

关键:`continue` 的作用

当程序执行到 **`continue`** 语句时,它会**立即停止当前循环迭代中剩余的代码**,并跳转到 `while` 循环的起始处,开始下一次迭代。
- `if item.type is "poison": continue`
这样可以高效地过滤掉毒药,让英雄不用执行移动到毒药位置的代码。

IF Bad Item: continue (Jump to Start)

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
寻找敌人
3
item = hero.findNearestItem()
寻找物品
4
# 如果没有敌人,使用continue跳出此轮循环继续运行。
5
if not enemy:
如果周围没有敌人
6
continue
跳过本轮,重新开始循环
7
# 如果没有物品,要一瓶药水,然后continue。
8
if not item:
如果周围没有物品
9
hero.say("给我点喝的!")
喊话要水
10
continue
跳过本轮,重新开始循环
11
# 如果item.type是"poison",使用continue跳出此轮循环继续运行。
12
if item.type is "poison":
如果是毒药
13
continue
跳过本轮,避免触碰
14
# 此时,药水一定是一瓶水
15
# 使用moveXY移到药水,然后回到起点!
16
hero.moveXY(44, 35)
移到药水
17
hero.moveXY(34, 47)
回到起点
第 68 关

概念挑战. 伪装大师 (Master of Disguise)

战术思路分析:静默伪装

英雄在伪装状态下,只有在**没有敌人卫兵**时才能移动。如果卫兵在场,英雄必须**原地不动**,保持伪装。

关键:`if enemy: continue`

如果检测到敌人,执行 `continue`。这将跳过所有移动代码,英雄保持静止,但程序仍继续运行,等待下一刻的安全。

IF Enemy: continue
Else: Move()

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
寻找卫兵
3
if enemy:
如果卫兵存在
4
continue
跳过移动,保持原地不动
5
item = hero.findNearestItem()
6
if item:
如果没有卫兵且找到了物品
7
hero.moveXY(item.pos.x, item.pos.y)
移动收集宝石
第 69 关

组合挑战. 逃到春天 (Escape to Spring)

战术思路分析:三阶段逃脱

这是一个复杂的任务,需要三个阶段的循环控制:
1. **阶段一(战斗):** 在 30 秒内,使用 `continue` 跳过不能攻击的敌人,用 `break` 结束战斗计时。
2. **阶段二(收集):** 收集金币直到达到 20 金,然后用 `break` 结束收集循环。
3. **阶段三(逃跑):** 移动到终点。

循环控制总结

- **`break`**: 用于满足目标后**退出**循环 (如 `hero.time > 30` 或 `hero.gold > 20`)。
- **`continue`**: 用于在循环中**跳过**当前迭代中不该执行的代码 (如 `enemy.type == "burl"` )。

Loop 1 (Time): Continue or Break
Move
Loop 2 (Gold): Break
Move

Python 程序解法

1
# 阶段 1: 战斗 (时间限制)
2
while True:
开始无限循环
3
if hero.time > 30:
如果超过 30 秒
4
break
中断战斗循环
5
enemy = hero.findNearestEnemy()
寻找敌人
6
if enemy:
如果敌人存在
7
if enemy.type == "burl" or enemy.type == "sand-yak":
如果是树精或牦牛(不能打的)
8
continue
跳过攻击代码
9
hero.attack(enemy)
攻击其他敌人
10
hero.moveXY(46, 34)
移动到收集区域
11
12
# 阶段 2: 收集 (金钱限制)
13
while True:
开始收集循环
14
item = hero.findNearestItem()
寻找物品
15
if item:
如果物品存在
16
hero.moveXY(item.pos.x, item.pos.y)
移动收集
17
if hero.gold > 20:
如果金钱超过 20
18
break
中断收集循环
19
20
# 阶段 3: 逃跑
21
hero.moveXY(78, 34)
移动到出口逃离