CodeCombat 坐标与类型判断

基础数据处理系列(14-18关)

第 14 关

边地投弹 (Border Bombardment)

战术思路分析:精准定位

火炮瞄准食人魔需要它精确的坐标。敌人(和你的英雄)都有一个名为 `pos` 的**位置属性**,它本身又包含两个子属性:`x` (水平位置) 和 `y` (垂直位置)。

坐标连接复习

你需要将 `x` 和 `y` 坐标连接起来,中间用逗号 (`,`) 分隔,然后说出(Say)命令给火炮。
例如:`hero.say(enemy.pos.x + "," + enemy.pos.y)`

enemy.pos.x
enemy.pos.y

"X,Y" String

Python 程序解法

1
while True:
主循环
2
enemy = hero.findNearestEnemy()
寻找最近的敌人
3
if enemy:
如果敌人存在
4
x = enemy.pos.x
将敌人的 X 坐标存入变量 x
5
y = enemy.pos.y
将敌人的 Y 坐标存入变量 y
6
# 说出x和y位置,用逗号隔开
7
hero.say(x + "," + y)
拼接并说出坐标命令
8
else:
否则(没有敌人)
9
hero.say("停止" + " " + "开火!")
说出停止开火的命令
第 15 关

叫阵 (The Challenge)

战术思路分析:逻辑开关

英雄的嘲讽只有在 `if` 语句为 **True(真)** 时才会生效!

核心概念:等于运算符 (`==`)

**注意:** 赋值用单等号 (`=`),判断是否相等用双等号 (`==`)。
`if` 语句只有在条件 `A == B` 成立(结果为 True)时,才会执行代码块。我们的任务是修正条件,让其永远为 True。

IF (condition == True):
  Say("Taunt!")
True = Action!

Python 程序解法

1
# 只有当 if 条件为真的时候,if 语句下面的命令才会执行。
2
# 在条件中,==表示"等于"。
3
if 2 + 2 == 4:
条件为 True (4==4)
4
hero.say("嘿!")
执行
5
if 2 + 2 == 5:
条件为 False (4!=5)
6
hero.say("是的,你!")
不执行
7
8
# 改变这里的条件,让英雄说 来打我啊!
9
if 3 + 3 == 6: # ∆ 将其设为 true。
修正为 True (6==6)
10
hero.say("来打我啊!")
执行
11
12
if 20 == 20: # ∆ 将其设为 true。
修正为 True (20==20)
13
# 再添加一句嘲讽来引诱食人魔,来点有创意的!
14
hero.say("有种你过来啊!")
执行
第 16 关

濒危树瘤之战 (Endangered Burl)

战术思路分析:目标分类

战场上的单位多种多样:友好的**树瘤(burl)**,弱小的**矮人(munchkin)**,远程的**投矛手(thrower)**,以及危险的**食人魔(ogre)**。你需要根据它们的**类型(type)**决定行动。

类型属性 (`.type`)

所有单位都有一个 `.type` 属性,它返回一个**字符串**(例如 `"thrower"`)。
通过 `if enemy.type == "munchkin":` 这样的语句,你可以为每种敌人编写专属战术。

Burl → Ignore
Munchkin → Attack
Thrower → Attack
Ogre → Run Away

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
寻找最近的单位
3
if enemy:
如果目标存在
4
# 记住:别攻击"burl"类型!
5
if enemy.type == "burl":
判断:类型是否为 "burl"
6
hero.say("I'm not attacking that Burl!")
如果是,则忽略
7
# "type"属性告诉你对象是什么类型。
8
if enemy.type == "munchkin":
判断:类型是否为 "munchkin"
9
hero.attack(enemy)
如果是,则攻击
10
# 使用"if"来来攻击"thrower"。
11
if enemy.type == "thrower":
判断:类型是否为 "thrower"
12
hero.attack(enemy)
如果是,则攻击
13
# 如果是"ogre",使用moveXY逃跑去村口!
14
if enemy.type == "ogre":
判断:类型是否为 "ogre" (大食人魔)
15
hero.moveXY(41, 47)
如果是,则逃跑到指定安全位置
第 17 关

嘲弄 (Taunt)

战术思路分析:函数化决策

矮人(munchkin)很弱,可以直接攻击;而斗士(brawler)很强,需要用嘲讽吸引到陷阱里。

函数内部分支 (`def dealEnemy(enemy):`)

本关卡将决策逻辑封装在一个函数 `dealEnemy(enemy)` 中,这样主循环只需找到敌人并调用这个函数,代码结构更清晰。

  • `if enemy.type == "munchkin"`: **Attack**
  • `if enemy.type == "brawler"`: **Say** (嘲讽)

dealEnemy(target)

→ Check Target.type

Python 程序解法

1
# 这个函数定义了英雄对敌人采取的行动。
定义决策函数
2
def dealEnemy(enemy):
函数接收敌人对象作为参数
3
# 如果敌人的类型是"munchkin":
4
if enemy.type == "munchkin":
判断是否为矮人
5
# 那么就攻击它:
6
hero.attack(enemy)
攻击
7
# 如果敌人的类型是"brawler":
8
if enemy.type == "brawler":
判断是否为斗士
9
# 那么就说些什么来呼叫斗士:
10
hero.say("Hey you!")
嘲讽
11
12
while True:
主循环
13
enemy = hero.findNearestEnemy()
寻找敌人
14
if enemy:
如果找到
15
dealEnemy(enemy)
调用函数处理敌人
16
else:
否则
17
hero.moveXY(30, 34)
回到安全位置
第 18 关

概念挑战. 错误的类型 (Wrong Type)

战术思路分析:目标过滤

战场上鱼龙混杂,`findNearestEnemy()` 可能会把**农民**、**骷髅**等不该打的单位也找出来。我们的任务是只攻击类型为 `"munchkin"` 的敌人。

嵌套条件 (`if` 内部的 `if`)

我们使用两个连续的 `if` 语句来层层筛选:
1. `if enemy:` (确保找到了目标)
2. `if enemy.type == "munchkin":` (确保目标是矮人)
只有当两个条件都为 True 时,`hero.attack(enemy)` 才会执行。

Find Target

IF Exists?

IF Type == "Munchkin"?

Attack!

Python 程序解法

1
# 只攻击 `type` 是"munchkin"的敌人。
2
while True:
3
enemy = hero.findNearestEnemy()
寻找最近的目标
4
if enemy:
第一层筛选:目标是否存在
5
if enemy.type == "munchkin":
第二层筛选:类型是否为 "munchkin"
6
hero.attack(enemy)
执行攻击