第七节:6×6南瓜种植代码解析 | 编程小白向 | 编程农场

视频文稿

打开编程农场,农场任务天天有,今天的任务最特别,这里是不会编程还硬做攻略,做不出来还硬拖时间的菜鸟程序员,圆大橘。今天,大橘农场继续营业。

我们来看看今日农场主任务:

高效规划南瓜的种植,最大化利用农场土地。

看来,农场主引进新作物了,那么农场编辑器也应该更新了吧,我们来看看解锁了什么?

就看3秒,后面要用到什么,记得看看自己有没有解锁对应内容哦~

我们先来看看南瓜怎么种。

第一,南瓜只在土壤上生长,所以我们种植时需要先检查地块类型是否为土地,不是土地就进行till耕地;

第二,如果一个正方形内的所有南瓜都完全成熟,它们就会一起长成一个巨型南瓜。巨型南瓜的产量取决于南瓜的大小。而6X6的南瓜收益是最大的。那么,为了满足任务要求,我们需要让6X6的农场种满南瓜。

第三,每个南瓜成熟后都会有固定20%的死亡概率,南瓜死亡后会留下一个枯萎南瓜,收获时不会掉落任何物品,且枯萎南瓜会阻止区域内的南瓜合成巨型南瓜,不过补种能够直接移除枯萎南瓜。那么,为了种出6X6的巨型南瓜,我们需要让无人机反复扫描农场,发现枯萎南瓜就立马补种,直到巨型南瓜长成。

好了,南瓜的种植比前面所有作物都要复杂,不过不用着急,大橘早已攻破其种植技术,现在就带大家一步步还原6X6巨型南瓜的种植过程。

首先,咱们先用老办法尝试种植南瓜,看看会发生啥。

所谓老办法,就是先收获无人机下方的成熟作物,如果地块类型不是土地,就耕地,然后直接种植南瓜。欸,记得加上上节刚掌握的浇水系统,检测土壤含水量,低于0.3就浇水,这样能加快作物生长速度。

把新定义的南瓜种植函数传入Utils模块中的route函数中即可。不知道Utils模块怎么来的,记得去看第六节的视频哦~

执行命令,经常看大橘农场的小伙伴可能就发现了,为啥这次的无人机路线没有了蛇形返程?哈哈,经过评论区,多位朋友提醒,无人机遍历一遍农场,到最后一格时,只要往边缘再移动一格就会回到原点,比再加一个返程代码简单。这次我终于记得更新了移动程序。

说回正题,我们发现,无人机遍历一遍农场,种满南瓜后,确实有不少南瓜坏死变成了枯萎南瓜,这导致没能合成我们要的巨型南瓜。

怎么解决?也简单,我们注意到can_harvest检查枯萎南瓜返回的是false,那我们设计一个智能系统,让无人机循环检查每个地块上的作物,遇到成熟南瓜不操作,遇到枯萎南瓜就种植新南瓜不就行了吗?

但是,循环什么时候进,怎么保证6X6中全部的南瓜都成熟后退出循环?

诶,看看我们已解锁的功能,发现list列表就能实现。

首先创建一个空列表来记录成熟南瓜的坐标。当无人机移动到每个位置时,先检查这个坐标是否已经在成熟列表中,如果已经在列表中,就跳过这个位置不检查。如果发现南瓜已经成熟,就把当前坐标添加到成熟列表中。这样随着巡逻次数的增加,列表里记录的成熟坐标越来越多,直到记录完农场所有坐标退出循环。

然而这个系统还没完成,因为成熟南瓜的位置是随机分布的,列表记录的坐标也是杂乱无章的,无人机必须使用定点移动方法才能精准跳转到任意指定坐标,以往的奇偶遍历移动法已经不够用了。那么这个定点移动该如何实现?

再发挥自己的惊世天赋后,大橘有了答案。 我们可以采用分步校正的思路来实现无人机的定点移动,用target_x和target_y作为目标的坐标参数变量,用感官功能里的 get_pos_x()get_pos_y()内置函数获取无人机当前位置。先通过循环将无人机的X坐标调整到目标值,每次只朝东西方向移动一格来逐步逼近;完成水平定位后,再用同样的思路通过南北移动来精确调整Y坐标,最终实现精准的坐标级定位。

看起来没问题吧?那我们就把这个定义的智能函数放入我们上节提到但还没用过的Scheme农场规划模块里,这就是我们的南瓜智能检测与补种系统。然后,我们在main工作台,import导入Scheme模块,再在南瓜种植指令下方调用智能检查与补种系统即可。

执行命令,我们看到完成一轮南瓜种植后,无人机开始逐格检查作物,检查过的成熟南瓜坐标进行记录,下次不会再检查,发现枯萎南瓜就马上补种,反复循环直到所有枯萎南瓜都被补种,退出循环,终于合成了6X6的巨型南瓜。

不过,想必有的小伙伴还会觉得这套系统不够智能。

因为无人机跳出检查程序循环的判断条件是全部农场都没有枯萎南瓜,这需要无人机一遍遍巡逻地块才行。而我们知道,还有一种方法更适合用于判断是否跳出循环,那就是农场是否出现了6X6的巨型南瓜。那无人机如何去第一时间知道农场合成了巨型南瓜呢?

我们解锁的内置函数中,有一个函数可以做到:

measure测量函数可以测量指定方向上的相邻实体并返回一些数值,而如果测量对象是南瓜则会返回一个神秘数字。

欸~经过一些小伙伴的测试发现,这个神秘数字其实是每个南瓜专属的ID码。至于怎么利用呢?那就交给屏幕前的小伙伴去实验了,大橘太菜就不去折腾。

而且这次大橘还有任务交给小伙伴们?那就是进一步完善这个南瓜种植规划程序。我们目前只完成了南瓜的种植与检查部分,但南瓜的种植是需要消耗胡萝卜的,而胡萝卜的种植也要消耗草和木头,而如果我们开始种植南瓜或在检查枯萎南瓜补种阶段,缺少了胡萝卜则会导致程序空转,这个是大家需要进一步考虑的哟。比如,确保物品栏的胡萝卜满足一定数量时,才可以开始南瓜种植。还有注意胡萝卜也是要消耗草和木头的,我们是不是也要对胡萝卜的种植系统进行改进?如果草不足就先种草,木头不足就先种木头,最后种胡萝卜。

好啦,大橘还得去接着研究农场将要引入的新作物仙人掌的种植方法,而且听说农场又要扩张了。

完整代码

Utils模块:

# 负责无人机的基础功能

############################################################


# 无人机移动路线;
        # 把遍历移动定义为route函数;
def route(do = None):

        # 把get_world_size()返回的值赋值给size,简化代码;
        size = get_world_size()
        
        # === 去程:从西南角到东北角 ===
        for col in range(size):
                for row in range(size):
                        
                        # 如果有操作就在当前地块执行;
                        if do != None: # 检查是否输入了操作,不是空值(None);
                                do () # 在当前地块执行操作;
                                
                        # 垂直移动(蛇形)
                        if row < size - 1:
                                if col % 2 == 0:
                                        move(North)  # 偶数列向上移动
                                else:
                                        move(South)  # 奇数列向下移动
                
                # 水平移动到下一列(除非是最后一列)
                if col < size - 1:
                        move(East)
        move(East)
        
        
##############################################################
# 移动到指定坐标
        
def move_to(target_x, target_y):
        # 移动到目标X坐标
        while get_pos_x() != target_x:
                if get_pos_x() < target_x:
                        move(East)
                else:
                        move(West)
        
        # 移动到目标Y坐标
        while get_pos_y() != target_y:
                if get_pos_y() < target_y:
                        move(North)
                else:
                        move(South)
                        
plantcrop模块:

# 处理各种作物的种植逻辑;

###################################################################                

# 灌木的种植;
def plant_Bush():
        # 种植前先把下方作物收获了;
        if can_harvest():
                harvest()
        # 收获成熟作物后,种植灌木;
                plant(Entities.Bush)
                
                
                
###################################################################                
                
# 胡萝卜的种植;
def plant_Carrot():
        size = get_world_size()
        # 种植前先把下方作物收获了; 
        if can_harvest():
                harvest()
        
        # 收获成熟作物后,用判断语句尝试直接种植胡萝卜;
        if not plant(Entities.Carrot):
                # 如果直接种植失败,说明地块类型不是土,或者缺少草和灌木;
                
                # 首先检查是否缺少草
                if num_items(Items.Hay) == 0:
                        # 缺少草,先种植草
                        if get_ground_type() != Grounds.Grassland:
                                till()
                        plant(Entities.Grass)
                        return  # 等待下一轮再来种植胡萝卜
                
                # 然后检查是否缺少灌木
                elif num_items(Items.Wood) == 0:
                        # 缺少灌木,先种植灌木
                        if get_ground_type() != Grounds.Soil:
                                till()
                        plant(Entities.Bush)
                        return  # 等待下一轮再来种植胡萝卜
                
                else:
                        # 有草和灌木,但是地块类型不对,进行翻耕
                        if get_ground_type() != Grounds.Soil:
                                till()
                        plant(Entities.Carrot)
        
        # 智能浇水:检查含水量并浇水
        if get_water() < 0.3 and num_items(Items.Water) > 0:
                use_item(Items.Water)
                        
        
###################################################################        
        
# 树与灌木混合种植;
def plant_Tree_and_Bush():
        # 获取无人机当前坐标赋值给x和y,简化代码;
        x, y = get_pos_x(), get_pos_y()
        # 棋盘模式判断:(x+y)为偶数时种树,奇数时种灌木
        if (x + y) % 2 == 0:
                # 种树的位置
                # 先检查是否有成熟作物
                if can_harvest():
                        harvest()
                
                # 确保地块适合种树(草地需要耕地)
                if get_ground_type() == Grounds.Grassland:
                        till()
                
                # 种植树
                plant(Entities.Tree)
                
                # 智能浇水:检查含水量并浇水
                if get_water() < 0.3 and num_items(Items.Water) > 0:
                        use_item(Items.Water)
        else:
                # 种灌木的位置
                # 先检查是否有成熟作物
                if can_harvest():
                        harvest()
                
                # 种植灌木
                plant(Entities.Bush)
                
                # 智能浇水:检查含水量并浇水
                if get_water() < 0.3 and num_items(Items.Water) > 0:
                        use_item(Items.Water)
                        
#####################################################################
                        
# 南瓜种植;
def plant_pumpkin():
        # 先检查是否有成熟作物
        if can_harvest():
                harvest()
        # 确保地块适合种树(草地需要耕地)
        if get_ground_type() == Grounds.Grassland:
                till()
                
        # 种植树
        plant(Entities.Pumpkin)
        
        # 智能浇水:检查含水量并浇水
        if get_water() < 0.3 and num_items(Items.Water) > 0:
                use_item(Items.Water)
                
Scheme模块:
import Utils

# 农场整体规划
size = get_world_size()

# 扫描检查枯萎南瓜并补种;
def check_pumpkin():
        # 记录已成熟南瓜的坐标,避免重复检查
        mature_pumpkins = []
        
        while len(mature_pumpkins) < size * size:  # 当成熟南瓜数量达到36个时停止
                # 遍历所有位置
                for x in range(size):
                        for y in range(size):
                                # 如果这个坐标已经在成熟列表中,跳过检查
                                if [x, y] in mature_pumpkins:
                                        continue
                                        
                                Utils.move_to(x, y)
                                
                                # 检查南瓜状态
                                if can_harvest():
                                        # 南瓜已成熟,添加到成熟列表
                                        mature_pumpkins.append([x, y])
                                else:
                                        # 处理未成熟或死亡的南瓜
                                        entity_type = get_entity_type()
                                        if entity_type == Entities.Dead_Pumpkin:
                                                # 南瓜死亡,重新种植
                                                plant(Entities.Pumpkin)
                                        elif entity_type != Entities.Pumpkin:
                                                # 没有南瓜或不是南瓜,重新种植
                                                if get_ground_type() != Grounds.Soil:
                                                        till()
                                                plant(Entities.Pumpkin)
                                                
                # 短暂等待后继续检查
                # 避免过于频繁的检查消耗资源
                
main:
import Utils # 调用Utils中的内容;
import plantcrop # plantcrop中的内容;
import Scheme

while True:
        size = get_world_size()
        # 种植前检查胡萝卜资源是否充足;
        while num_items(Items.Carrot) < size * size * 2:
                Utils.route(plantcrop.plant_Carrot)
        # Utils.route() # 调用route函数;
        Utils.route(plantcrop.plant_pumpkin)
        # Scheme.check_pumpkin 调用枯萎南瓜补种函数;
        Scheme.check_pumpkin()
        harvest()

视频

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容