《编程农场》教程 (9):巨型南瓜的挑战!用列表与字典记录农场状态

欢迎回来,农场架构师!

在前面的课程中,你的无人机已经像一台精密的时钟一样,完美处理了胡萝卜、木材等基础资源。今天,我们将面对游戏里第一个真正考验你“全局思维”的魔王级作物——南瓜(Pumpkin)

南瓜有一个极其迷人的物理特性:当一片方形区域内的所有南瓜都完全成熟时,它们会合体成一个“巨型南瓜”! 收割巨型南瓜的收益是呈指数级爆炸的(比如 6x6 的巨型南瓜,产量是极其恐怖的)。

但这有个致命的难点:南瓜在成熟后,有 20% 的概率会枯萎(死亡)。只要地里有一颗南瓜枯萎了,合体就会失败!

今天,我们就来学习如何一步步驯服南瓜,并利用上一课学到的列表(List)和字典(Dictionary),给无人机装上“记忆系统”。

第一阶段:最简单的南瓜种植与盲目收割(踩坑演示)

按照我们之前种胡萝卜的逻辑,最简单的南瓜种植和收割代码是这样的:

size = get_world_size()

while True:
    for x in range(size):
        for y in range(size):
            # 熟了就割
            if can_harvest():
                harvest()
            
            # 空地就种
            if get_entity_type() == None:
                if get_ground_type() == Grounds.Grassland:
                    till()
                plant(Entities.Pumpkin)
                
            move(North)
        move(East)

❌ 为什么这种“盲目遍历”对南瓜无效? 如果你运行这段代码,你会发现你永远得不到巨型南瓜。因为无人机一旦看到某个南瓜熟了,就会立刻一刀砍掉。结果就是:地里的南瓜永远是零零散散的,根本等不到大家一起成熟合体的那一刻。

第二阶段:优化遍历条件(必须要“全局视野”)

为了得到巨型南瓜,我们的策略必须改变: 不能见一个割一个!必须等全图的南瓜 100% 都存活且成熟,才能挥动镰刀!

那遇到没熟或者枯萎的南瓜怎么办? 官方说明书有个隐藏提示:在枯萎的南瓜上直接种植 plant(),会自动替换掉枯死的部分。(枯萎的南瓜 can_harvest() 会返回 False)。

所以我们的新逻辑是:

  1. 巡视全图。

  2. 只要遇到不是成熟南瓜的格子(空地、杂草、没熟的、枯死的),统统补种

  3. 必须有一种方法,能记住刚才走过的格子到底熟没熟。

第三阶段:利用“列表 (List)”记录状态(初级记忆)

我们怎么让无人机拥有记忆呢?我们可以拿一个**列表(List)**当记事本。 无人机每走一格,就在列表里记下一笔:熟了记 True,没熟记 False

size = get_world_size()
status_list = [] # 拿出一个空的记事本

while True:
    # 每次巡逻前,清空记事本
    status_list = []
    
    for x in range(size):
        for y in range(size):
            # 如果是完美的成熟南瓜
            if get_entity_type() == Entities.Pumpkin and can_harvest():
                status_list.append(True) # 在记事本末尾写下 True
            else:
                status_list.append(False) # 只要有瑕疵,就写下 False
                
                # 顺手把瑕疵修复了(清理杂物并重新种南瓜)
                if get_entity_type() != None and can_harvest():
                    harvest()
                if get_ground_type() == Grounds.Grassland:
                    till()
                plant(Entities.Pumpkin)
                
            move(North)
        move(East)
        
    # 巡逻完一整圈后,检查记事本!
    # 如果记事本里没有 False,说明全图完美,可以收割巨型南瓜了!
    if False not in status_list:
        harvest() 

⚠️ 列表方案的局限性: 这段代码能跑通,但列表是一个“一维的线”。当你翻看 status_list[15] 时,你很难瞬间反应过来这个状态对应的是农场二维网格里的哪一个具体坐标 (X, Y)。这在以后的高级编程中会非常痛苦。

第四阶段:利用“字典 (Dictionary)”打造完美记忆面板

既然农场是一个二维的 (X, Y) 网格,那我们就用专门为键值对(Key-Value)而生的字典(Dictionary)! 我们可以直接把坐标 (x, y) 当作标签(Key),把南瓜的状态当作内容(Value)存进去!

这种方法被称为**“建立内存数据库”**,它是游戏后期的核心神技。让我们来看看这段极其优雅的最终版巨型南瓜代码:

size = get_world_size()
farm_memory = {} # 拿出一个高级字典柜

while True:
    # 假设一开始全图都是完美的
    all_perfect = True 
    
    for x in range(size):
        for y in range(size):
            
            # 第一步:检查当前脚下的地块
            if get_entity_type() == Entities.Pumpkin and can_harvest():
                # 熟透的南瓜!在字典的 (x, y) 抽屉里存入 True
                farm_memory[(x, y)] = True
            else:
                # 没熟或者枯萎了!在 (x, y) 抽屉里存入 False
                farm_memory[(x, y)] = False
                all_perfect = False # 发现一个瑕疵,这一轮不可能合体了
                
                # 立刻修复这个瑕疵:暴力物理覆盖重种!
                if get_entity_type() != None and can_harvest():
                    harvest() # 拔掉杂草
                if get_ground_type() == Grounds.Grassland:
                    till()
                plant(Entities.Pumpkin) # 种下新南瓜,自动替换枯萎的旧南瓜
                
            # 走向下一格
            move(North)
        move(East)
        
    # 第二步:一轮扫荡结束,无人机恰好回到了 (0,0) 原点
    # 检查刚才的记录,如果全图完美没有任何瑕疵...
    if all_perfect:
        # 见证奇迹的时刻!一刀挥下,收割爆仓的巨型南瓜!
        harvest()
        
        # 收割完后,为了防止下一轮误判,重置字典
        for key in farm_memory:
            farm_memory[key] = False

🧠 代码拆解:为什么字典写法是天花板?

  1. 绝对精准的定位farm_memory[(x, y)] = True 这句话,让无人机在脑海中建立了一张和真实农场 1:1 完美映射的虚拟地图。

  2. 极简的逻辑判定:我们不需要在全图乱跑去挥镰刀,而是设了一个 all_perfect = True。只要在巡逻时遇到哪怕一颗坏南瓜,这个值就会变成 False,死死锁住最后的 harvest() 收割动作。只有当整整一圈跑下来,没有触发任何修复动作时,无人机才会砍下那至关重要的一刀。

  3. 完美规避枯萎:游戏里枯萎的南瓜 can_harvest() 会返回 False,我们的代码完美捕捉到了这一点,并直接用 plant() 强行替换它,维持了合体的希望。

结语: 太精彩了!你刚才运用了计算机科学中非常经典的“状态机(State Machine)”思维,成功破解了《编程农场》中最复杂的连带性作物的种植难题。

依靠这段带有字典记忆的代码,巨型南瓜将在你的农场里连绵不绝地诞生。