CodeCombat While 循环基础

条件循环与退出机制(1-6关)

第 1 关

尘埃 (Dust)

战术思路分析:定数攻击

英雄需要精确地攻击 **10 次**,然后撤退。这需要一个**计数器(`attacks`)**来控制 `while` 循环的次数。

关键:自增操作 (`+= 1`)

条件是 `while attacks < 10:`。每次循环体执行后,必须执行 `attacks += 1`,确保循环最终能够退出。

WHILE Attacks < 10:
  Attack()
  Attacks += 1

Python 程序解法

1
attacks = 0
攻击计数器初始化为 0
2
while attacks < 10:
当攻击次数小于 10 时,重复执行
3
enemy = hero.findNearestEnemy()
寻找最近的敌人
4
if enemy:
如果敌人存在
5
hero.attack(enemy)
发起攻击
6
# 给 `attacks` 变量加 1
7
attacks += 1
每次循环后计数器自增 1
8
9
hero.moveXY(79, 33)
循环结束,撤退到伏击点
第 2 关

双颊 (Two Cheeks)

战术思路分析:两阶段任务

英雄需要按顺序完成两个不同的任务:**击败 6 个兽人**(计数器控制)和**收集 30 金币**(属性值控制)。

循环条件切换

- 阶段 1 条件:`while defeatedOgres < 6:`
- 阶段 2 条件:`while hero.gold < 30:` (使用英雄的 `gold` 属性作为动态条件)

WHILE Defeats < 6: Fight
WHILE Gold < 30: Collect

Python 程序解法

1
defeatedOgres = 0
初始化击败计数器
2
while defeatedOgres < 6:
**阶段 1:** 当击败数小于 6 时
3
enemy = hero.findNearestEnemy()
4
if enemy:
5
hero.attack(enemy)
攻击敌人
6
defeatedOgres += 1
计数器加 1
7
else:
8
hero.say("兽人!")
喊话等待
9
hero.moveXY(49, 36)
移动到收集区
10
while hero.gold < 30:
**阶段 2:** 当英雄金币小于 30 时
11
item = hero.findNearestItem()
寻找最近的硬币
12
if item:
13
hero.moveXY(item.pos.x, item.pos.y)
移动收集硬币
14
hero.moveXY(76, 32)
移动到出口
第 3 关

峡谷风暴 (Canyon Storm)

战术思路分析:跟随牦牛

牦牛知道风暴何时来临,只要它们在场,英雄就安全。循环条件是**牦牛是否存在**。

关键:`while yak:`

如果 `yak` 变量包含一个对象(即找到牦牛),Python 视其为 `True`;如果 `yak` 是 `None`(找不到),则为 `False`。
**必须在循环内部更新 `yak` 的值**,否则一旦找到牦牛,循环将永远不会退出。

WHILE Yak Is True:
  Collect()
  Yak = FindEnemy()

Python 程序解法

1
yak = hero.findNearestEnemy()
初次寻找沙牦牛
2
3
while yak:
当牦牛(敌人对象)存在时,循环继续
4
item = hero.findNearestItem()
寻找硬币
5
if item:
6
hero.moveXY(item.pos.x, item.pos.y)
收集硬币
7
# 更新变量 `yak` 的值
8
yak = hero.findNearestEnemy()
更新牦牛变量,检查是否撤退
9
10
hero.moveXY(38, 58)
牦牛撤退后,英雄移动到撤离点
第 4 关

先有付出 才有回报 (Pay for Play)

战术思路分析:生命值限制

炎热的太阳下,英雄的健康值不断下降。英雄必须在 `hero.health` **大于 200** 时停止跑步。

循环条件:`hero.health`

`while hero.health > 200:` 循环条件依赖于一个动态变化的属性值。当 `health` 降到 200 或以下时,循环自动终止。

WHILE Health > 200: Run!

Python 程序解法

1
# 在英雄生命值大于 200 时一直跑。
2
while hero.health > 200:
当生命值大于 200 时,循环继续
3
hero.moveXY(48, 24)
来回跑步
4
hero.moveXY(16, 24)
5
# 移动到 Okar 那里。
6
hero.moveXY(32, 40)
循环结束后移动到 Okar 处
第 5 关

沙漠战役 (Desert Combat)

战术思路分析:定数命令

英雄必须精确地在 X 标记处下达 **5 次**命令,然后才能加入战斗。

防止死循环 (再强调一次)

条件是 `ordersGiven < 5`。**必须**在循环里执行 `ordersGiven += 1`,否则英雄将永远卡在发号施令的循环中。

Counter += 1 in While Loop

Python 程序解法

1
ordersGiven = 0
初始化命令计数器
2
while ordersGiven < 5:
当命令次数小于 5 时
3
# 向下移动 10 米
4
hero.moveXY(hero.pos.x, hero.pos.y - 10)
向下移动到 X 标记
5
hero.say("Attack!")
下达命令
6
# 确保 ordersGiven 要加 1!
7
ordersGiven += 1
计数器自增 1
8
while True:
命令下达完毕,开始无限战斗循环
9
enemy = hero.findNearestEnemy()
10
if enemy:
11
hero.attack(enemy)
攻击敌人
第 6 关

诱饵和开关 (Bait and Switch)

战术思路分析:函数化收集

英雄需要分阶段收集金币(25 金后建造诱饵,50 金后建造第二个)。我们把收集逻辑封装到一个函数 `collectUntil(enoughGold)` 中。

封装循环条件

`while hero.gold < enoughGold:` 循环条件由英雄的 `gold` 属性和函数传入的参数 `enoughGold` 共同决定。

collectUntil(25)
buildXY()
collectUntil(50)

Python 程序解法

1
def collectUntil(enoughGold):
定义收集函数,参数为目标金币数
2
# 当 hero.gold 小于 enoughGold 时:
3
while hero.gold < enoughGold:
循环条件:金币不足目标数
4
coin = hero.findNearestItem()
5
if coin:
6
hero.moveXY(coin.pos.x, coin.pos.y)
移动收集
7
8
collectUntil(25)
调用函数收集 25 金币
9
hero.buildXY("decoy", 40, 52)
建造第一个诱饵
10
hero.moveXY(25, 52)
躲藏
11
collectUntil(50)
调用函数收集到 50 金币
12
hero.buildXY("decoy", 69, 28)
建造第二个诱饵
13
hero.buildXY("decoy", 30, 20)
建造第三个诱饵