CodeCombat 森林篇:函数

更优雅、更规范的代码

def function():
定义 (Define):
教会英雄一个新技能。
注意 def 后面的空格和冒号。
function()
调用 (Call):
使用那个新技能。
让主循环 while True: 变得整洁。
No.31

乡村巡游者

初识函数

在村子里巡逻,重复写 "找敌人 -> 攻击" 太麻烦了。
我们把这套动作打包成一个叫 findAndAttackEnemy 的函数。

def myFunction():
    # 缩进 4 个空格
    hero.say("Hi")
solution.py
1
def findAndAttackEnemy():
定义函数。
2
enemy = hero.findNearestEnemy()
缩进:寻找敌人。
3
if enemy:
缩进:检查敌人。
4
hero.attack(enemy)
双重缩进:攻击。
6
while True:
主程序循环。
7
hero.moveXY(35, 34)
前往A点。
8
findAndAttackEnemy()
调用函数(清怪)。
9
hero.moveXY(60, 31)
前往B点。
10
findAndAttackEnemy()
再次调用函数。
No.32-33

村庄守卫 & 守护神

自定义函数

现在你要自己写函数了!
任务:定义一个叫 cleaveOrAttack 的函数。

Step 1:def 行 (记得加空格)。

Step 2: 缩进写逻辑 (找敌人 -> 判断 cleave -> 攻击)。

Step 3:while True 里调用它。

solution.py (村庄守护神)
1
def cleaveOrAttack():
定义:劈或打。
2
enemy = hero.findNearestEnemy()
找人。
3
if enemy:
有怪?
4
if hero.isReady('cleave'):
能劈?
5
hero.cleave(enemy)
劈。
6
else:
否。
7
hero.attack(enemy)
打。
8
while True:
主程序。
9
hero.moveXY(35, 34)
点1。
10
cleaveOrAttack()
调用。
11
hero.moveXY(47, 27)
点2。
12
cleaveOrAttack()
调用。
No.34-35

造币厂 & 寂静市

模块化思维

通过定义不同的函数,我们将复杂的任务拆解了。

  • pickUpCoin()
    负责:找金币 -> 移动去捡
  • attackEnemy()
    负责:找敌人 -> 攻击

最后在 while True 中交替调用它们,代码逻辑非常清晰!

solution.py (造币厂)
1
def pickUpCoin():
定义捡钱函数。
2
coin = hero.findNearestItem()
找钱。
3
if coin:
有钱?
4
hero.moveXY(coin.pos.x, coin.pos.y)
去捡!
6
def attackEnemy():
定义战斗函数。
7
enemy = hero.findNearestEnemy()
找人。
8
if enemy:
有人?
9
hero.attack(enemy)
打!
11
while True:
循环执行。
12
attackEnemy()
1. 先打架。
13
pickUpCoin()
2. 再捡钱。
No.35

概念挑战:寂静市

最终测试

保护市长!
将逻辑封装在函数 checkAndAttack 中。

逻辑:
- 看到敌人 -> 攻击
- 没看到 -> 回到 (30, 26)

solution.py
1
def checkAndAttack():
定义防御逻辑。
2
enemy = hero.findNearestEnemy()
找人。
3
if enemy:
有?
4
hero.attack(enemy)
打。
5
else:
无?
6
hero.moveXY(30, 26)
回撤。
8
while True:
死循环。
9
checkAndAttack()
执行任务。