CodeCombat 嵌套循环

数组遍历与持续操作(15-18关)

第 15 关

游魂 (Wander)

战术思路分析:多次命中

英雄需要对**每个敌人**持续攻击直到死亡,并对**每个物品**持续移动直到收集。

循环结构:遍历 + 持续行动

- **外层循环(遍历):** `while enemyIndex < len(enemies):` (保证每个敌人都被处理)
- **内层循环(行动):** `while enemy.health > 0:` (保证行动持续到条件改变)

Outer: WHILE Index < len(E): Next E
Inner: WHILE E.Health > 0: Attack()

Python 程序解法

1
while True:
外层主循环
2
enemies = hero.findEnemies()
获取敌人列表
3
enemyIndex = 0
初始化敌人索引
4
while enemyIndex < len(enemies):
**外层循环 1:** 遍历敌人列表
5
enemy = enemies[enemyIndex]
获取当前敌人
6
# 当敌人还有生命值时攻击。
7
while enemy.health > 0:
**内层循环 1:** 持续攻击直到死亡
8
hero.attack(enemy)
攻击
9
enemyIndex += 1
敌人索引步进
10
items = hero.findItems()
获取物品列表
11
itemIndex = 0
初始化物品索引
12
# 遍历所有的物品。
13
while itemIndex < len(items):
**外层循环 2:** 遍历物品列表
14
item = items[itemIndex]
获取当前物品
15
# 当距离大于 2 时:
16
while hero.distanceTo(item) > 2:
**内层循环 2:** 持续移动直到靠近
17
hero.moveXY(item.pos.x, item.pos.y)
移动
18
# 别忘了增加 itemIndex
19
itemIndex += 1
物品索引步进
第 16 关

潜伏 (Lurkers)

战术思路分析:类型筛选与坚持

英雄只攻击萨满巫师(`"shaman"`),并持续攻击直到击败。

关键:`if` 筛选 + `while` 持续攻击

- **`if enemy.type == "shaman"`:** 筛选出要攻击的目标。
- **`while enemy.health > 0:`:** 对选中的目标执行内层持续攻击。
**重要:** `enemyIndex += 1` 必须在内层 `while` 之后,但在外层 `while` 内部,以确保遍历继续。

IF E.Type == "shaman": WHILE E.Health > 0: Attack()

Python 程序解法

1
enemies = hero.findEnemies()
获取敌人列表
2
enemyIndex = 0
初始化索引
3
4
while enemyIndex < len(enemies):
遍历敌人数组
5
enemy = enemies[enemyIndex]
获取当前敌人
6
if enemy.type == 'shaman':
如果敌人是萨满巫师
7
while enemy.health > 0:
持续攻击直到生命值耗尽
8
hero.attack(enemy)
攻击
9
# 记得增加 enemyIndex
10
enemyIndex += 1
索引步进 (无论是否攻击)
第 17 关

优待 (Preferential Treatment)

战术思路分析:优先击杀

投掷者(`thrower`)攻击力高,必须**优先**击杀。这需要两个独立的遍历循环(阶段):

两阶段战术

  • **阶段 1:** 遍历一次,只攻击 `thrower`。
  • **阶段 2:** 重新遍历,攻击所有**仍活着**的敌人。
**关键:** 在阶段 2 开始前,必须再次调用 `hero.findEnemies()`,因为阶段 1 可能击败了一些敌人。

Loop 1: IF Type == Thrower: Attack()
Loop 2: IF Enemy Exists: Attack()

Python 程序解法

1
enemies = hero.findEnemies()
获取敌人列表
2
enemyIndex = 0
初始化索引
3
# 阶段 1: 攻击投掷者
4
while enemyIndex < len(enemies):
遍历敌人列表
5
enemy = enemies[enemyIndex]
6
if enemy and enemy.type == "thrower":
如果目标是投掷者
7
hero.attack(enemy)
攻击
8
enemyIndex += 1
索引步进
9
# 阶段 2: 攻击剩下的敌人
10
enemies = hero.findEnemies()
重新获取最新的敌人列表
11
enemyIndex = 0
重置索引
12
while enemyIndex < len(enemies):
遍历敌人列表
13
enemy = enemies[enemyIndex]
14
if enemy:
如果敌人仍然存在(未被击败)
15
hero.attack(enemy)
攻击剩下的所有敌人
16
enemyIndex += 1
索引步进
第 18 关

Sarven 牧羊人 (Sarven Shepherd)

战术思路分析:排除与坚持

英雄必须攻击所有敌人,但要**忽略沙牦牛**(`sand-yak`)。对选中的敌人要持续攻击直到死亡。

结构:`while` (遍历) → `if` (筛选) → `while` (持续攻击)

- 遍历所有敌人,通过 `if enemy.type != "sand-yak"` 排除牦牛。
- 对非牦牛的敌人,使用 `while enemy.health > 0:` 确保击杀。

IF Type != Yak:
  WHILE Health > 0: Attack()

Python 程序解法

1
while True:
外层无限循环,持续防御
2
enemies = hero.findEnemies()
获取敌人列表
3
enemyIndex = 0
初始化索引
4
5
while enemyIndex < len(enemies):
**外层循环:** 遍历敌人列表
6
enemy = enemies[enemyIndex]
获取当前敌人
7
# "!=" 意思是 "不等于"
8
if enemy.type != "sand-yak":
筛选:如果不是沙牦牛
9
# 当敌人的生命值大于0,攻击它!
10
while enemy.health > 0:
**内层循环:** 持续攻击直到死亡
11
hero.attack(enemy)
攻击
12
enemyIndex += 1
索引步进 (遍历下一个)
13
# 攻击完敌人后,回到中间位置
14
hero.moveXY(40, 32)
回到待命点