CodeCombat 森林篇:多参数

一次传递多个信息

def func(x, y):
多形参 (Multiple Parameters):
用逗号分隔。
就像给了英雄一张有经纬度的地图。
func(type, x, y)
混合类型 (Mixed Types):
你可以同时传递字符串(造什么)和数字(在哪里造)。
No.43

返回荆棘农场

坐标参数 (X, Y)

以前我们只传一个 target
现在我们需要告诉函数**去哪里**。

def maybeBuildTrap(x, y):

hero.moveXY(x, y)

...

调用: maybeBuildTrap(43, 50)

x 变成了 43,y 变成了 50。

solution.py
1
def maybeBuildTrap(x, y):
定义双参数函数。
2
hero.moveXY(x, y)
移动到传入的坐标。
3
enemy = hero.findNearestEnemy()
到了后侦察。
4
if enemy:
有敌人吗?
5
hero.buildXY("fire-trap", x, y)
就在那个坐标造陷阱。
7
while True:
三点巡逻循环。
8
maybeBuildTrap(43, 50)
检查上路 (Top)。
9
maybeBuildTrap(25, 34)
检查左路 (Left)。
10
maybeBuildTrap(43, 20)
检查下路 (Bottom)。
No.44

Agrippa 重构

代码重构 (Refactoring)

之前的代码太乱了?全是嵌套的 if/else?
我们把最复杂的“战斗判断”部分提取出来,做成一个函数。

目标: 让主循环只负责找人,函数负责打架。

solution.py
1
def cleaveOrAttack(enemy):
战斗逻辑封装。
2
if hero.isReady("cleave"):
判断技能。
3
hero.cleave(enemy)
劈。
4
else:
否则。
5
hero.attack(enemy)
打。
7
while True:
主循环变得很清爽。
8
enemy = hero.findNearestEnemy()
找怪。
9
if enemy:
有怪?
10
distance = hero.distanceTo(enemy)
测距。
11
if distance < 5:
够近?
12
cleaveOrAttack(enemy)
交给函数去打!
No.45

封闭的十字路口

混合参数类型

你的函数可以极其灵活!
你可以传递:
1. 字符串 type (造什么?)
2. 数字 x, y (在哪里造?)

hero.buildXY(typeToBuild, x, y)
solution.py
1
def maybeBuildSomething(typeToBuild, x, y):
三个参数!
2
hero.moveXY(x, y)
移动到位。
3
enemy = hero.findNearestEnemy()
侦察。
4
if enemy:
有敌人?
5
hero.buildXY(typeToBuild, x, y)
建造指定类型!
7
while True:
巡逻建造。
8
maybeBuildSomething("fire-trap", 40, 20)
下路:造陷阱。
9
maybeBuildSomething("fence", 26, 34)
左路:造围栏。
10
maybeBuildSomething("fire-trap", 40, 50)
上路:造陷阱。
11
maybeBuildSomething("fence", 54, 34)
右路:造围栏。
No.46

贪婪陷阱

诱饵战术

食人魔很贪婪。
策略: 1. 巡逻到指定地点。 2. 如果地上有**金币** (作为诱饵)。 3. 在金币的位置造**陷阱**。

solution.py
1
def maybeBuildTrap(x, y):
定义逻辑。
2
hero.moveXY(x, y)
前往点位。
3
coin = hero.findNearestItem()
找诱饵。
4
if coin:
有诱饵?
5
hero.buildXY("fire-trap", x, y)
埋雷!
7
while True:
四点巡逻。
8
maybeBuildTrap(12, 56)
左上。
9
maybeBuildTrap(68, 56)
右上。
10
maybeBuildTrap(68, 12)
右下。
11
maybeBuildTrap(12, 12)
左下。
No.47-48

最后的大炮 & 函数巡逻

森林篇结业

恭喜!你已经掌握了:
变量与坐标
If/Else 逻辑
自定义函数
参数传递

最后两个挑战是对这些知识的综合运用。
定义一个 patrol(x, y) 函数,打败所有试图靠近的敌人!

solution.py (函数巡逻)
1
def patrol(x, y):
定义通用巡逻函数。
2
hero.moveXY(x, y)
移动。
3
enemy = hero.findNearestEnemy()
侦察。
4
if enemy:
有敌?
5
hero.attack(enemy)
打。
7
while True:
无限巡逻。
8
patrol(18, 34)
点1。
9
patrol(40, 46)
点2。
10
patrol(62, 34)
点3。
11
patrol(40, 22)
点4。