CodeCombat 字符串与数学运算

基础数据处理系列(1-8关)

第 1 关

友和敌 (Friend or Foe)

战术思路分析:命令拼接

在这场小冲突中,你的英雄就像一位**通信兵**。你不能只喊“战斗!”,也不能只喊“农民ID-123!”,你需要把完整的命令**连接**起来发送出去。

关键技能:字符串连接(String Concatenation)

就像搭积木一样,我们使用 **`+`** 符号将不同的文字块(字符串)和单位的身份信息(`friend.id`)拼接起来,形成一个完整的、可执行的命令。
"去战斗, " + friend.id + "!"

"Go" + " " + ID + "!"

"Go ID-42!"

Python 程序解法

1
while True:
主循环,持续寻找目标
2
friend = hero.findNearestFriend()
寻找最近的农民朋友
3
if friend:
如果找到了朋友
4
hero.say("去战斗, " + friend.id + "!")
说出 "去战斗, " 连接朋友的 ID 和 "!"
5
enemy = hero.findNearestEnemy()
寻找最近的差役敌人
6
if enemy:
如果找到了敌人
7
hero.say("快滚开, " + enemy.id)
说出 "快滚开, " 连接敌人的 ID
第 2 关

似曾相识的味道 (Déjà Vu)

战术思路分析:用数字唱歌

你要和朋友们一起唱一首关于药水的歌谣。歌词里不断变化的数字(药水数量)必须和固定的歌词(字符串)连接在一起。

难点突破:字符串 + 数字

Python 非常智能,可以直接使用 `+` 符号将数字(如 `10`)和字符串(如 `"药水"`)连接起来。计算机会自动将数字变成文字,然后拼接。

秘诀:更新变量

每次唱完“拿走一个”后,别忘了用 `potionsOnTheWall -= numToTakeDown` 来更新剩余药水的数量,这样下一句歌词才是正确的!

10 + " potions..."

9 + " potions..."

Python 程序解法

1
potionsOnTheWall = 10
墙上的药水数量
2
numToTakeDown = 1
每次拿走的数量
3
while True:
4
hero.say(potionsOnTheWall + " potions of health on the wall!")
第1句歌词:数字 + 字符串
5
hero.say(potionsOnTheWall + " potions of health!")
第2句歌词
6
hero.say("Take " + numToTakeDown + " down, pass it around!")
第3句歌词
7
potionsOnTheWall -= numToTakeDown
药水数量减一
8
hero.say(potionsOnTheWall + " potions of health on the wall.")
第4句歌词(数字已更新)
第 3 关

罪与罚 (Crime and Punishment)

战术思路分析:火炮定位

火炮手只听懂一种语言:**坐标字符串**! 你必须把目标的 X 坐标、一个空格、和 Y 坐标连接起来,组成一个形如 `"45 30"` 的字符串,火炮才能发射。

三段式拼接

我们使用 **`+`** 符号将三个部分连接起来:
1. 目标的 X 坐标 (`enemy.pos.x`)
2. 固定的空格字符串 (`" "`)
3. 目标的 Y 坐标 (`enemy.pos.y`)

X + " " + Y

"30 45"

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
寻找最近的敌人
3
if enemy:
如果敌人存在
4
enemyPos = enemy.pos.x + " " + enemy.pos.y
将 X, 空格, Y 连接起来,存入变量
5
hero.say("敌人的位置在: " + enemyPos)
说出完整的坐标命令(火炮目标)
6
item = hero.findNearestItem()
寻找最近的宝石
7
if item:
如果宝石存在
8
itemPos = item.pos.x + " " + item.pos.y
将宝石的 X, 空格, Y 连接起来
9
hero.say("Item at " + itemPos)
说出宝石坐标,命令火炮攻击并收集宝石
第 4 关

概念挑战. 空中救援行动 (Air Rescue)

战术思路分析:复习与应用

救援队只接收两种指令:`"Friend "` + 朋友ID (疏散) 或 `"Enemy "` + 敌人ID (消灭)。 这是一次字符串连接的快速实战测验!你需要熟练地将命令关键词和目标的身份信息连接起来。

  • **救援命令:** `"Friend " + friend.id`
  • **攻击命令:** `"Enemy " + enemy.id`

Say("Friend " + ID)
Say("Enemy " + ID)

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
寻找敌人
3
if enemy:
如果敌人存在
4
hero.say("Enemy " + enemy.id)
发出消灭命令
5
friend = hero.findNearestFriend()
寻找朋友
6
if friend:
如果朋友存在
7
hero.say("Friend " + friend.id)
发出救援命令
第 5 关

巫师之门 (Wizard's Gate)

战术思路分析:魔法公式

巫师们用神秘的数字锁住了大门。你需要用**数学公式**来解密!每个巫师的数字都依赖于前一个巫师的数字。

编程数学符号

  • 加法:`+`
  • 减法:`-`
  • 乘法:`*` (不是 x)
  • 除法:`/`
  • 求余:`%` (取余数,例如 `10 % 3` 结果是 1)

变量接力棒

你需要用变量(如 `las`, `erz`, `sim`)存储每个巫师的秘密数字,然后用这些变量来计算下一个巫师的数字,就像接力跑一样!

A = 10
B = A * 3
C = B + A

Python 程序解法

1
hero.moveXY(30, 13)
移动到第一个巫师 'Laszlo'
2
las = hero.findNearestFriend().getSecret()
获取 Laszlo 的神秘数字并存储在变量 las 中
3
4
erz = las + 7
用 Laszlo 的数字 **加 7** 得到 Erzsebet 的数字
5
hero.moveXY(17, 26)
移动到 Erzsebet
6
hero.say(erz)
说出计算出的数字
7
8
sim = erz / 4
用 Erzsebet 的数字 **除以 4** 得到 Simonyi 的数字
9
hero.moveXY(30, 39)
移动到 Simonyi
10
hero.say(sim)
说出计算出的数字
11
12
aga = sim * las
用 Simonyi 的数字 **乘以** Laszlo 的数字得到 Agata 的数字
13
hero.moveXY(43, 26)
移动到 Agata
14
hero.say(aga)
说出计算出的数字
第 6 关

巫师出没 (Wizards Haunt)

战术思路分析:数字接龙

你来到了巫师的密室,这里的数字谜题依然是**接力赛**。这次的重点是**除法**:你必须确保每次计算都基于前一个巫师提供的数字。

关键:除法 `/`

注意,在编程中,除法 (`/`) 结果可能是小数。但在 CodeCombat 中,只要公式正确,系统就会接受你计算出的结果。
例如:`10 / 4` 结果是 `2.5`。

Step 1: ZSO = 100
Step 2: MIH = ZSO / 4
Step 3: BEA = MIH / 5
Step 4: SAN = MIH - BEA

Python 程序解法

1
hero.moveXY(18, 20)
移动到 Zsofia
2
zso = hero.findNearestFriend().getSecret()
获取并存储 Zsofia 的秘密数字
3
4
mih = zso / 4
Zsofia 的数字 **除以 4** 得到 Mihaly 的数字
5
hero.moveXY(30, 15)
移动到 Mihaly
6
hero.say(mih)
说出计算结果
7
8
bea = mih / 5
Mihaly 的数字 **除以 5** 得到 Beata 的数字
9
hero.moveXY(42, 20)
移动到 Beata
10
hero.say(bea)
说出计算结果
11
12
san = mih - bea
Mihaly 的数字 **减去** Beata 的数字得到 Sandor 的数字
13
hero.moveXY(38, 37)
移动到 Sandor
14
hero.say(san)
说出计算结果
第 7 关

巫师天际层 (Wizard Sky-layer)

战术思路分析:括号的力量

这里的巫师法术非常复杂!如果运算顺序错了,数字就会错,大门就不会打开。

运算优先级

默认规则是:**乘、除**优先于**加、减**。
例如:`5 + 2 * 3` 结果是 `11` (先算 `2*3=6`)。

控制顺序:括号 `()`

我们使用 **括号 `()`** 来强制计算机先进行括号内的运算。
例如:`(5 + 2) * 3` 结果是 `21` (先算 `5+2=7`)。这是解开本关卡的关键!

(A + B) * (C - D)

保证先算加减,再算乘法

Python 程序解法

1
hero.moveXY(16, 32)
移动到 Eszter
2
esz = hero.findNearestFriend().getSecret()
获取 Eszter 的神秘数字
3
4
tam = (esz * 3) - 2
**(乘以3,减去2)**,括号保证先乘法
5
hero.moveXY(24, 28)
移动到 Tamas
6
hero.say(tam)
说出 Tamas 的数字
7
8
zso = (tam - 1) * 4
**(减去1然后乘4)**,括号保证先减法
9
hero.moveXY(32, 24)
移动到 Zsofi
10
hero.say(zso)
说出 Zsofi 的数字
11
12
ist = (tam + zso) / 2
**(相加,然后除以2)**,括号保证先加法
13
hero.moveXY(40, 20)
移动到 Istvan
14
hero.say(ist)
说出 Istvan 的数字
15
16
csi = (tam + zso) * (zso - ist)
**(相加) 乘以 (Zsofi 减 Istvan)**,两个括号是关键
17
hero.moveXY(48, 16)
移动到 Csilla
18
hero.say(csi)
说出 Csilla 的数字
第 8 关

概念挑战. 真炼金术 (True Alchemy)

战术思路分析:步步为营

炼金术师需要你帮忙计算魔法药水配方。这个挑战的关键在于:**每一步的计算结果都要说出来,并且作为下一步计算的输入。**

变量复用

你不能只写一个总公式。你需要将每一步的结果存入一个新变量 (`sum`, `sub`, `div`, `mult`),然后用 `hero.say()` 将其结果输出。

公式接力

步骤 2 必须使用步骤 1 的结果(`sum`),步骤 3 必须使用步骤 2 的结果(`sub`),以此类推。

R1 = Gold + Silver
Say(R1)
R2 = R1 - Bronze
Say(R2)

Python 程序解法

1
wizard = hero.findNearestFriend()
找到巫师朋友
2
goldCoins = wizard.goldCoins
获取金币数量
3
silverCoins = wizard.silverCoins
获取银币数量
4
bronzeCoins = wizard.bronzeCoins
获取铜币数量
5
# 步骤 1: 将金币和银币的数目相加,然后说出结果。
6
sum = goldCoins + silverCoins
执行加法运算
7
hero.say(sum)
说出第一个结果
8
# 步骤 2: 用前一个结果减去铜币的数量,然后说出新的结果。
9
sub = sum - bronzeCoins
使用 sum 减去铜币数量
10
hero.say(sub)
说出第二个结果
11
# 步骤 3: 将前一个结果除以3,然后说出新的结果。
12
div = sub / 3
使用 sub 除以 3
13
hero.say(div)
说出第三个结果
14
# 步骤 4: 将前一个结果乘以2,然后说出新的结果。
15
mult = div * 2
使用 div 乘以 2
16
hero.say(mult)
说出最终结果