随着我们的农场越来越大,要处理的事情也越来越多:翻土、播种、浇水、收割、寻路……如果把所有指令都堆在一个文件里,代码会变得像面条一样又长又乱。

今天,我们要学习高级农场工程师的绝招:把常用的动作封装成“函数(工具)”,并把它们装进“模块(工具箱)”里!

🛠️ 一、 教无人机新本领:自定义函数 (def)

Python 允许我们自己创造新的指令!我们使用 def(Define,定义)这个关键字,把一长串动作打包成一个简单的名字。

1. 智能浇水小助手 (auto_water)

植物在湿润的土地上生长速度会提升 5 倍!但水资源很宝贵,不能瞎浇。我们要教无人机一个聪明的浇水逻辑:

  • 条件 1: 兜里得有水罐(num_items(Items.Water) > 0)。

  • 条件 2: 地面有点干了,水位低于 75% 才浇水(get_water() < 0.75)。

👨‍💻 代码实现:

def auto_water():
    # 智能浇水逻辑:保持地块湿润以获得5倍加速
    if num_items(Items.Water) > 0:
        if get_water() < 0.75:
            use_item(Items.Water)

💡 教学提示:写完这段代码后,只要你在后面输入 auto_water(),无人机就会自动执行这套聪明的判断,再也不用每次都写一堆 if 了!

2. 农场 GPS 导航 (move_to)

有时候我们需要无人机飞到特定的坐标,比如 (3, 5)。如果用基础指令,你得自己算要往东走几步、往北走几步。太麻烦了!我们来写一个“GPS 导航函数”。

我们给函数加两个“参数”(就像输入导航的目的地):target_x(目标列)和 target_y(目标行)。

👨‍💻 代码实现:

def move_to(target_x, target_y):
    # 如果当前位置在目标的左边,就一直向东(右)飞
    while get_pos_x() < target_x:
        move(East)
    # 如果当前位置在目标的右边,就向西(左)飞
    while get_pos_x() > target_x:
        move(West)
    # 如果当前位置在目标的下面,就向北(上)飞
    while get_pos_y() < target_y:
        move(North)
    # 如果当前位置在目标的上面,就向南(下)飞
    while get_pos_y() > target_y:
        move(South)

💡 教学提示:以后你想去左下角,只需输入 move_to(0, 0),无人机就会自动寻路过去!

3. 全自动推土机 (prepare_soil)

在种新庄稼前,我们通常需要扫荡整个农场,把熟了的作物收割,并顺便翻好土。我们把第二课学到的“嵌套循环”打包成一个函数。

*(注意:在嵌套循环中,为了防止无人机记错数字,外层循环用 i,内层循环一定要换一个字母,比如 j !) *

👨‍💻 代码实现:

def prepare_soil():
    size = get_world_size()
    for i in range(size):
        for j in range(size):  # 注意这里用 j,避免和外层的 i 冲突
            if can_harvest():  # 如果有成熟的就收割
                harvest()
            till()             # 顺手翻土
            move(North)        # 向上走
        move(East)             # 一列扫荡完,去下一列

📦 二、 整理工具箱:如何导入功能 (import)

现在我们有了三个强大的自定义功能:auto_watermove_toprepare_soil。 为了让主程序保持干净,我们可以把它们分别存在不同的文件里,这就叫模块化

步骤 1:新建文件并保存

在编程农场的代码界面,新建一个文件,命名为 my_tools.py(我的工具箱),把上面三个 def 开头的函数全写进去保存。

步骤 2:在主程序中召唤工具箱 (import)

回到你的主程序文件(比如叫 main.py),在代码的最开头写上:

import my_tools

这句话的意思是:“去把 my_tools 那个文件里的装备都给我拿过来!”

步骤 3:使用工具

当你需要用工具箱里的工具时,格式是:工具箱名字.工具名字()

👨‍💻 终极实战:主程序代码