CodeCombat 森林篇:参数

Function Parameters: 传递数据的魔法

def func(target):
形参 (Parameter):
就像一个空盒子(比如叫 target)。
在函数内部,我们只操作这个盒子。
func(enemy)
实参 (Argument):
这是实际放进盒子里的东西。
你可以把 enemy1、enemy2 轮流放进去。
No.36

边地之叉

万能的 Target

我们定义一个函数,它的括号里有一个词:target。 这只是一个代号!

函数定义:
def check(target): attack(target)

调用 1:
check(topEnemy) -> target 变成了 topEnemy

调用 2:
check(bottomEnemy) -> target 变成了 bottomEnemy

solution.py
1
def checkAndAttack(target):
定义带参数的函数。
2
if target:
检查传入的目标是否存在。
3
hero.attack(target)
攻击那个目标!
4
hero.moveXY(43, 34)
打完回中心。
6
while True:
主循环。
7
hero.moveXY(58, 52)
去上面。
8
topEnemy = hero.findNearestEnemy()
找上面的怪。
9
checkAndAttack(topEnemy)
传入 topEnemy。
10
hero.moveXY(58, 16)
去下面。
11
bottomEnemy = hero.findNearestEnemy()
找下面的怪。
12
checkAndAttack(bottomEnemy)
传入 bottomEnemy。
No.37-38

盗墓者 & 墓地阴魂

参数中的逻辑

在函数内部,target 就是你的操作对象。 你可以对它做任何事:判断、攻击、或者忽略。

逻辑示例:
如果 target 存在 -> 攻击 target
否则 (没有 target) -> 攻击 "Door" 或者 躲起来。

solution.py (盗墓者)
1
def checkToDefend(target):
定义防御函数。
2
if target:
有传入目标吗?
3
hero.attack(target)
攻击目标。
4
else:
如果是空的...
5
hero.attack("Door")
那就砸门!
7
while True:
主循环。
8
enemy = hero.findNearestEnemy()
寻找敌人。
9
checkToDefend(enemy)
把结果传给函数。
No.39

捉迷藏

对象属性传递

不仅可以传敌人,还可以传**物品 (Item)**!

函数接收物品后,可以访问它的属性,比如坐标:
item.pos.x
item.pos.y

solution.py
1
def checkTakeHide(item):
定义:检查、捡、躲。
2
if item:
有东西吗?
3
hero.moveXY(item.pos.x, item.pos.y)
去物品的位置。
4
hero.moveXY(40, 34)
捡完躲到中间。
6
while True:
主循环。
7
hero.moveXY(68, 56)
去右上角。
8
lightstone = hero.findNearestItem()
找石头。
9
checkTakeHide(lightstone)
把石头传给函数。
10
hero.moveXY(12, 56)
去左上角。
11
lightstone = hero.findNearestItem()
再找一次。
12
checkTakeHide(lightstone)
再次调用。
No.40-42

交给劈斩 & 林地陷阱

终极封装

我们要把之前学过的最复杂的战斗逻辑封装起来!

cleaveWhenClose(target):
1. 测距 (distanceTo(target))
2. 如果近 (<5):
   a. 有大招 -> 劈
   b. 没大招 -> 砍

solution.py (林地陷阱)
1
def cleaveWhenClose(target):
定义战斗逻辑。
2
if hero.distanceTo(target) < 5:
距离够近吗?
3
if hero.isReady("cleave"):
大招好了?
4
hero.cleave(target)
劈它!
5
else:
没好...
6
hero.attack(target)
普攻。
8
while True:
主循环。
9
enemy = hero.findNearestEnemy()
找敌人。
10
if enemy:
有敌人?
11
cleaveWhenClose(enemy)
交给函数处理。