CodeCombat 坐标相对移动

位置属性与算术运算(47-55关)

第 47 关

强壮的沙牦牛 (Strong Yak)

战术思路分析:相对躲避

沙漠里的牦牛太强壮了,不能硬碰硬。当它靠近时,我们必须**相对于当前位置**向右移动 10 米来躲避。

关键:获取并修改 X 坐标

1. 获取当前 X:`x = hero.pos.x`
2. 计算新 X:`x = x + 10` (或简写为 `x += 10`)
3. 移动到新坐标:`hero.moveXY(x, y)` (Y 保持不变)

Current X + 10

Move to safety!

Python 程序解法

1
while True:
2
# 获取英雄当前位置的x和y坐标。
3
x = hero.pos.x
读取当前 X 坐标
4
y = hero.pos.y
读取当前 Y 坐标
5
# 找到最近的耗牛。
6
yak = hero.findNearestEnemy()
7
# 如果到牦牛的距离小于10:
8
if hero.distanceTo(yak) < 10:
如果牦牛太近
9
# 向右移动,在英雄位置的x坐标值基础上加10。
10
x += 10
在当前 X 上增加 10 (向右移动)
11
hero.moveXY(x, y)
移动到新的 X 坐标
第 48 关

绿洲 (The Oasis)

战术思路分析:动态平移

英雄默认要向右边的绿洲前进 (`x + 10`)。但如果牦牛太近,必须反向移动 (`x - 10`) 来躲避。

关键:If/Else 切换方向

- `if 牦牛靠近`: `x -= 10` (向左)
- `else`: `x += 10` (向右,前进)
**注意:** 移动动作 `hero.moveXY(x, y)` 放在 `if` 和 `else` 的代码块内执行。

IF Danger: X - 10
ELSE: X + 10

Python 程序解法

1
while True:
2
x = hero.pos.x
获取当前 X 坐标
3
y = hero.pos.y
获取当前 Y 坐标
4
enemy = hero.findNearestEnemy()
5
if enemy and hero.distanceTo(enemy) < 10:
如果敌人存在且距离小于 10 米
6
#  用x减10来向左移动。
7
x -= 10
X 减 10 (向左移动)
8
hero.moveXY(x, y)
移动
9
else:
否则 (安全或没有敌人)
10
# 用x加10来向右移动。
11
x += 10
X 加 10 (向右前进)
12
hero.moveXY(x, y)
移动
第 49 关

Sarven路 (Sarven Road)

战术思路分析:对角线移动

除非有敌人(食人魔侦察兵),否则英雄必须沿着对角线(右上)前进。

同时增加 X 和 Y

同时增加 X 和 Y 坐标,就能实现对角线移动:
`hero.moveXY(hero.pos.x + 5, hero.pos.y + 5)`

X' = X + 5
Y' = Y + 5

Python 程序解法

1
while True:
2
# 如果有敌人,则攻击。
3
enemy = hero.findNearestEnemy()
4
if enemy:
如果敌人存在
5
hero.attack(enemy)
攻击敌人
6
# 否则,继续向右上移动。
7
else:
否则 (没有敌人)
8
xPos = hero.pos.x
读取当前 X
9
yPos = hero.pos.y
读取当前 Y
10
hero.moveXY(xPos + 5, yPos + 5)
向右上角移动 (X+5, Y+5)
第 50 关

概念挑战. 干燥灌溉 (Dry Irrigation)

战术思路分析:左上斜移

你需要沿着左上方的斜线前进。这意味着 X 坐标要**减少**,Y 坐标要**增加**。

位移量: X-6, Y+4

注意,可以直接在 `moveXY` 的参数中进行算术运算,无需先将 `hero.pos.x` 存入变量。

X' = X - 6
Y' = Y + 4

Python 程序解法

1
while True:
2
hero.moveXY(hero.pos.x - 6, hero.pos.y + 4)
向左上斜移:X 减 6,Y 加 4
3
enemy = hero.findNearestEnemy()
寻找敌人
4
if enemy:
如果敌人存在
5
hero.attack(enemy)
攻击敌人
第 51 关

Sarven间隙 (Sarven Gap)

战术思路分析:相对建造

英雄向下前进 (`y - 10`)。如果看到敌人,必须在敌人的**左侧 20 米处**建造围栏,阻止它前进。

关键:敌人的相对 X

我们使用敌人的 X 坐标作为基准:
`x = enemy.pos.x - 20`
`y = enemy.pos.y`
这样,无论敌人在哪,围栏都会精确地出现在它的左边。

Build At X = Enemy.X - 20

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
3
if enemy:
如果敌人存在
4
# 在敌人左边20个单位处使用buildXY建造一段"fence"
5
x = enemy.pos.x - 20
计算围栏 X 坐标 (敌人 X - 20)
6
y = enemy.pos.y
使用敌人的 Y 坐标
7
hero.buildXY("fence", x, y)
建造围栏
8
else:
否则 (没有敌人)
9
# 向下使用moveXY移动10米。
10
x = hero.pos.x
读取当前 X
11
y = hero.pos.y - 10
Y 减 10 (向下移动)
12
hero.moveXY(x, y)
移动
第 52 关

十字路口 (The Crossroads)

战术思路分析:四向定位

食人魔从东南西北四个方向进攻。英雄必须通过比较自身和敌人的坐标来确定它们的来向,并在正确的 X 标记处放置陷阱。

关键:判断方向

  • 左边来:`enemy.pos.x < hero.pos.x`
  • 右边来:`enemy.pos.x > hero.pos.x`
  • 下方来:`enemy.pos.y < hero.pos.y`
  • 上方来:`enemy.pos.y > hero.pos.y`
**注意:** 使用 `elif`(else if)确保只有满足第一个匹配的方向时才放置陷阱。

IF X ELIF X>hero.X: Trap Right

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
3
if enemy:
如果敌人存在
4
if enemy.pos.x < hero.pos.x:
如果敌人 X 小于英雄 X (从左边来)
5
hero.buildXY("fire-trap", 25, 34)
在左侧 X 标记处放置陷阱
6
elif enemy.pos.x > hero.pos.x:
否则,如果敌人 X 大于英雄 X (从右边来)
7
hero.buildXY("fire-trap", 55, 34)
在右侧 X 标记处放置陷阱
8
elif enemy.pos.y < hero.pos.y:
否则,如果敌人 Y 小于英雄 Y (从下方来)
9
hero.buildXY("fire-trap", 40, 19)
在下方 X 标记处放置陷阱
10
elif enemy.pos.y > hero.pos.y:
否则,如果敌人 Y 大于英雄 Y (从上方来)
11
hero.buildXY("fire-trap", 40, 49)
在上方 X 标记处放置陷阱
12
hero.moveXY(40, 34)
英雄回到中心待命
第 53 关

截断 (Interception)

战术思路分析:中点保护

你是保护农民的守卫,必须站在农民和敌人之间最完美的中点位置。这需要使用**求中点公式**。

关键公式:中点坐标

X 坐标:`X = (A.x + B.x) / 2`
Y 坐标:`Y = (A.y + B.y) / 2`

X = (Friend.X + Enemy.X) / 2
Y = (Friend.Y + Enemy.Y) / 2

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
找到最近的敌人
3
friend = hero.findNearestFriend()
找到最近的农民
4
# 通过将friend.pos.x和enemy.pos.x相加来计算x
5
x = (friend.pos.x + enemy.pos.x) / 2
计算 X 轴中点
6
# 现在对y做同样的事情
7
y = (friend.pos.y + enemy.pos.y) / 2
计算 Y 轴中点
8
# 移动到计算得到的X和Y坐标。
9
hero.moveXY(x, y)
移动到中点位置
第 54 关

雷蹄 (Hoofing It)

战术思路分析:上下拦截

牦牛随机从上方或下方来袭。你需要比较 `yak.pos.y` 和 `hero.pos.y`,来决定在牦牛的上方还是下方建造围栏,引导它们走向水坑。

Y 轴比较逻辑

- `if yak.pos.y > hero.pos.y`: 牦牛在**上方** → 围栏建在 `yak.pos.y - 10` (牦牛的**下方**)
- `else`: 牦牛在**下方** → 围栏建在 `yak.pos.y + 10` (牦牛的**上方**)

Yak.Y > Hero.Y ?

Build Y = Yak.Y - 10

Python 程序解法

1
while True:
2
yak = hero.findNearestEnemy()
寻找最近的牦牛
3
if yak:
如果牦牛存在
4
# 如果yak.pos.y大于hero.pos.y
5
if yak.pos.y > hero.pos.y:
判断:牦牛是否在英雄**上方**
6
# 使用buildXY在牦牛下方10米处建造一段"fence"
7
hero.buildXY("fence", yak.pos.x, yak.pos.y - 10)
建造在牦牛 Y - 10 处 (下方)
8
else:
否则 (牦牛在下方或同高)
9
# 使用buildXY在牦牛上方10米处建造一段"fence"
10
hero.buildXY("fence", yak.pos.x, yak.pos.y + 10)
建造在牦牛 Y + 10 处 (上方)
11
else:
否则 (没有牦牛)
12
# 使用moveXY向右朝绿洲移动10米。
13
hero.moveXY(hero.pos.x + 10, hero.pos.y)
向右前进 10 米
第 55 关

概念挑战. 友好的雷区 (Friendly Mines)

战术思路分析:Y轴避险

食人魔被困在上下方的雷区中,你可以利用它们的位置来引导自己安全通过。英雄必须一直向右走,但需要根据敌人的垂直位置上下微调。

相对 Y 轴移动

- `if enemy.pos.y > hero.pos.y`: 敌人在**上面** → 英雄向上微调 (`y + 4`)
- `else`: 敌人在**下面** → 英雄向下微调 (`y - 4`)
**关键:** X 轴的移动 (`x + 12`) 必须在每次循环的最后执行。

IF Enemy.Y > Hero.Y: Y += 4
ELSE: Y -= 4
Move X += 12

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
寻找最近的敌人
3
if enemy:
如果敌人存在
4
if enemy.pos.y > hero.pos.y:
判断:敌人是否在英雄**上方**
5
hero.moveXY(hero.pos.x, hero.pos.y + 4)
向上微调 4 米
6
else:
否则 (敌人在下方或同高)
7
hero.moveXY(hero.pos.x, hero.pos.y - 4)
向下微调 4 米
8
hero.moveXY(hero.pos.x + 12, hero.pos.y)
向右前进 12 米 (每次循环都会执行)