CodeCombat 坐标与位置属性

基础数据处理系列(9-13关)

第 9 关

币屑 (Coin Shrapnel)

战术思路分析:寻宝三部曲

藏宝室里布满了陷阱,只有跟着硬币的轨迹才能安全逃脱。这里的硬币就像**会移动的导游**。

关键概念:嵌套属性

把物品看成一个装有信息的箱子。
1. 找到箱子:`item` (物品对象)
2. 找到箱子里的位置图:`item.pos` (位置对象)
3. 找到图上的坐标:`item.pos.x` 和 `item.pos.y`

步骤拆解(变量存储):

`itemPosition = item.pos` → `itemX = itemPosition.x` → `hero.moveXY(itemX, itemY)`

item → pos → x, y

item.pos.x

Python 程序解法

1
while True:
主循环,持续寻找硬币
2
item = hero.findNearestItem()
找到最近的物品(硬币)
3
if item:
如果找到了物品
4
# 这将物品的pos,也就是坐标,存储在变量中。
5
itemPosition = item.pos
将物品的位置对象赋值给 itemPosition
6
# 将物品的 X 和 Y 坐标存入变量。
7
itemX = itemPosition.x
获取位置对象的 X 坐标
8
itemY = itemPosition.y
获取位置对象的 Y 坐标
9
# 现在,使用moveXY移动到itemX和itemY:
10
hero.moveXY(itemX, itemY)
移动到硬币的精确位置
第 10 关

白兔 (The White Rabbit)

战术思路分析:跟着光点跑

陷阱太多,跟着发光石(像爱丽丝梦游仙境的白兔一样)是唯一的生路。发光石移动很快,你需要快速锁定它的位置。

嵌套属性的另一种写法

本关的解法与上关类似,但它强调了使用**中间变量**来让代码更清晰易懂。虽然 `hero.moveXY(item.pos.x, item.pos.y)` 可以一步到位,但像下面这样分步操作,能帮助你理解数据流:
1. `position = item.pos` (找到位置图)
2. `x = position.x` (读取 X 坐标)
3. `hero.moveXY(x, y)` (移动)

item → position → x, y

更容易追踪数据

Python 程序解法

1
while True:
2
item = hero.findNearestItem()
找到最近的发光石
3
if item:
如果找到了
4
# 使用 item.pos 将物品位置保存到一个新的变量中:
5
position = item.pos
将位置对象赋值给 position
6
# 使用 pos.x 和 pos.y 保存X和Y坐标:
7
x = position.x
获取 X 坐标
8
y = position.y
获取 Y 坐标
9
# 使用 moveXY() 和 变量X、Y移动至坐标:
10
hero.moveXY(x, y)
移动到目标位置
第 11 关

伪装者 (Impostors)

战术思路分析:拆穿伪装

食人魔伪装成了金币!你必须靠近物品来检查。这个关卡要求你同时处理两种逻辑:

双重逻辑链

1. **安全优先:** 如果发现敌人 (`enemy = hero.findNearestEnemy()`),立即攻击。
2. **寻宝路径:** 否则,寻找最近的物品 (`item = hero.findNearestItem()`),然后移动过去。

精简访问

你可以像下面这样直接使用 `.pos` 属性:`hero.moveXY(item.pos.x, item.pos.y)`。这是一种更简洁的写法。

IF Enemy: Attack()
ELSE IF Item: MoveTo(Item)

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
寻找敌人
3
# 如果你看见了敌人,攻击它:
4
if enemy:
如果敌人存在
5
hero.attack(enemy)
攻击敌人
6
item = hero.findNearestItem()
寻找物品
7
# 如果你看见硬币或者宝石,移动到它的X和Y坐标:
8
if item:
如果物品存在
9
pos = item.pos
获取物品的位置对象
10
hero.moveXY(pos.x, pos.y)
移动到物品的 X 和 Y 坐标
第 12 关

概念挑战. 富有且安全 (Rich and Safe)

战术思路分析:最短路径

食人魔不会攻击宝石,所以捡起宝石就能躲避火焰。你需要以最简洁的方式,将英雄移动到宝石的位置。

精简写法:直接访问

这是最常用的写法!无需中间变量,直接使用点号连接属性:
`hero.moveXY(item.pos.x, item.pos.y)`

item.pos.x, item.pos.y

Clean and Concise

Python 程序解法

1
# 找到物品并且移动它们的位置。
2
while True:
3
item = hero.findNearestItem()
找到最近的宝石
4
if item:
如果找到了
5
hero.moveXY(item.pos.x, item.pos.y)
直接使用 item.pos.x 和 item.pos.y 移动
第 13 关

组合挑战. 风向校正 (Wind Correction)

战术思路分析:炮火计算

大风让炮弹偏离目标!你需要结合所有学过的知识来修正瞄准:

  • **知识点 1 (属性访问):** 获取敌人的原始 Y 坐标:`enemy.pos.y`
  • **知识点 2 (算术运算):** 修正风向:`enemy.pos.y - 4`
  • **知识点 3 (字符串连接):** 拼接炮火命令:`X + "," + Y_corrected`

注意分隔符!

这次火炮需要的是**逗号**(`,`)作为分隔符,而不是空格。所以拼接时必须使用 `","` 字符串。

Y_correct = Y - 4
Say(X + "," + Y_correct)

Python 程序解法

1
# 说出食人魔的x,y坐标,格式是逗号分隔的两个数字。
2
# 为了能够更加精确,用y坐标值减去4,然后再说出。
3
while True:
4
enemy = hero.findNearestEnemy()
寻找最近的敌人
5
if enemy:
如果敌人存在
6
y = enemy.pos.y - 4
将 Y 坐标减去 4,存储在变量 y 中 (算术运算)
7
hero.say(enemy.pos.x + "," + y)
连接 X 坐标、逗号字符串和修正后的 Y 坐标 (字符串连接)