《编程农场》教程 (7):告别“面条代码”!用 def 打造你的专属指令

欢迎回来,农场首席架构师!

随着你在第六课写出了“动态仓管系统”,你的农场逻辑变得越来越聪明,但也带来了一个严重的副作用:你的代码变得越来越长,缩进越来越深(if 里面套 if,再套 if)。 在编程界,这种像面条一样缠绕在一起、让人眼花缭乱的代码,被称为**“面条代码”(Spaghetti Code)**。如果以后你还要加入南瓜、向日葵、仙人掌的逻辑,你的屏幕根本装不下这么长的代码,只要少打一个缩进,整个程序就会瞬间崩溃。

今天,我们就来学习真正的大神级技巧——使用 def(自定义函数),把复杂的逻辑打包,让你的代码变得像诗一样干净整洁!

1. 什么是 def(自定义函数)?

在之前的游戏里,你使用了无数次 harvest()move()plant()。这些都是游戏开发者提前写好的“内置函数”。

但有了 def(Define 的缩写,意思是“定义”),你就可以像游戏开发者一样,创造属于你自己的专属指令! 这就好比你买了一个带宏按键的鼠标,你把“翻土+种胡萝卜”录制到了一个按键上,以后只要按这一个键,它就会自动做完这一整套动作。

语法公式:

Python

def 我的专属指令名称():
    # 这里放你想打包的代码(注意缩进!)
    # 可以是好几行代码

2. 动手实战:拆解庞大的流水线

让我们拿出第六课那段臃肿的代码,进行一场“外科手术级别的代码重构(Refactoring)”。 我们要把复杂的步骤拆解成两个独立的模块:一个是专门负责收割的,一个是专门负责种地的。

模块 A:智能收割机

我们在代码的最上方,定义一个名叫 try_harvest(尝试收割)的专属指令:

def try_harvest():
    if can_harvest():
        harvest()

模块 B:智能种植机

接着,我们把第六课那一长串“查库存、算黑白格、判断种树还是种胡萝卜”的复杂逻辑,全部打包进一个名叫 smart_plant(智能种植)的指令里:

def smart_plant():
    if get_entity_type() == None:
        # 查库存
        wood_count = num_items(Items.Wood)
        
        if wood_count < 1000:
            # 种树逻辑
            if (get_pos_x() + get_pos_y()) % 2 == 0:
                plant(Entities.Tree)
        else:
            # 种胡萝卜逻辑
            if get_ground_type() == Grounds.Grassland:
                till()
            plant(Entities.Carrot)

3. 见证奇迹:大神的清爽主循环

现在,我们已经把最脏最累的活儿打包成了两个极其清晰的“功能模块”。 接下来,看看我们的主干循环(无人机的行动轨迹)会变得多么简单、优雅、霸气!

清空你的面板,把下面的完整代码输进去:

# ================= 1. 定义功能模块 =================

def try_harvest():
    if can_harvest():
        harvest()

def smart_plant():
    if get_entity_type() == None:
        wood_count = num_items(Items.Wood)
        if wood_count < 1000:
            if (get_pos_x() + get_pos_y()) % 2 == 0:
                plant(Entities.Tree)
        else:
            if get_ground_type() == Grounds.Grassland:
                till()
            plant(Entities.Carrot)

# ================= 2. 主程序的极简循环 =================

size = get_world_size()

while True:
    for x in range(size):
        for y in range(size):
            
            # 直接调用你的专属指令!像说话一样自然!
            try_harvest()
            smart_plant()
            
            move(North)
        move(East)

🧠 感受一下这种“降维打击”:

看看最下面的那几行主循环代码!它读起来简直就像人类的自然语言: 对于网格里的每一个坐标: 尝试收割 -> 去智能种植 -> 然后向北移动

即使是完全不懂编程的人,看一眼你的主循环,也能瞬间明白这台机器在干什么。如果以后你想修改种树的数量,你只需要去上面的 smart_plant 模块里改一个数字,主程序根本不需要碰!这就是模块化编程的终极魅力。

⚠️ 极其重要的新手排坑:顺序法则

使用 def 时,有一个必须绝对遵守的死规定:先定义,后使用!

电脑阅读代码是从上往下看的。如果你在最上面直接写了 try_harvest(),但把 def try_harvest(): 写在了最底下,电脑就会直接报错:“我不认识这个指令!” 所以,把你自定义的 def 函数统一放在代码的最顶端,把 while True 这种执行循环放在最底端,这是一个非常好的编程习惯。

结语: 恭喜你,你已经完成了从“代码工人”到“代码架构师”的蜕变。你的代码不仅能跑,而且具备了极高的可读性和扩展性。

现在,你拥有了干净的代码结构,我们终于可以迎接《编程农场》中最激动人心、也是最硬核的挑战了!