第五节:定义函数 | 模块化规划种植 | 编程农场

视频文稿

打开编程农场,今天农场正在进行面积扩张,浇水系统安装,以及无人机的高级功能升级。所以今天农场主没有新的任务,但是,我的团队被解散了,如今农场只有我一个程序员了。农场主解散我们团队的理由是,降本增效,如今,AI的编程能力逐渐变强,已经能替代多数程序员的工作了。农场主认为农场不再需要这么多的低级程序员,以后就由我加上AI助手处理农场工作了。

至于,为什么选择我留下来呢?因为,,,,我的工资只需要3000草,淦!!!

还是得干啊。

所以今天,我的主要工作就是为高效利用AI助手解决农场问题提前做准备。

由于开掉其他程序员,农场主节省了一笔钱,拿去升级了一次农场,目前农场编辑器已经解锁了定义函数功能、浇水功能、

定义函数是把“重复的逻辑”变成“可随时调用的工具”。让我们的代码更简洁、更好懂、更容易改。

比如农场我们常用的,harvest收割函数,do a flip翻跟头函数等等就是农场编辑器内置的定义函数,这些指令背后包含了复杂重复的代码,农场编辑器把这些复杂,重复的代码给我们打包成了现在可以仅通过简单名称加上()的形式直接调用。

而现在,我们也可以这么做了。比如,我们可以把需要重复用到多行遍历移动代码定义为一个叫route的函数,route是我随便取的名字,当我需要让无人机用遍历的方式在农场移动时,我不用再写一遍那些代码,直接调用route函数就行了。

而且,我可以专门用一个文件,比如Utils,来装我定义的函数,需要用的时候只需要在工作文件开头写上import Utils。就可从Utils导入函数和全局变量。

这样,我们就可以把之前重复使用,或是比较复杂的代码指令都定义一个函数,放在Utils工具文件里,后面工作的时候随时调用。

这也是为了后面能和AI助手更好的合作,让它知道农场目前能使用那些指令。

现在,我得想想要把那些复杂或需要重复使用的代码,定义函数。

第一,我需要把各种作物的种植与收获指令打包,因为这些代码都是重复用的;

例如,灌木的种植:

# 种植前先把下方作物收获了;
        if can_harvest():
                harvest()
# 收获成熟作物后,种植灌木;
                plant(Entities.Bush)

把它打包起来定义一个函数,就用plant_Bush命名吧~

还有胡萝卜的种植:

# 种植前先把下方作物收获了; 
        if can_harvest():
                harvest()
# 收获成熟作物后,用判断语句尝试直接种植胡萝卜;
                if not plant(Entities.Carrot):
                        # 如果直接种植失败,说明地块类型不是土,或者缺少草和灌木;
                        # 由于草和灌木有一定储备,这里暂时不考虑后者原因(后面和感官一起说);、
                        till()
                        plant(Entities.Carrot)
                        

同样把它打包起来定义一个函数,用plant_Carrot命名;

第二,我们得把刚才定义的route路线函数改一改,因为在农场的使用场景中,移动路线的同时都是需要伴随着一些操作的,比如种植灌木和种植胡萝卜。

我们需要在遍历代码中加入其他指令,但是我们不可能在需要添加指令的时候再去修改定义函数,我们得添加全局变量参数,这样一来,需要用什么指令在调用函数的括号内输入即可。

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

        # 把get_world_size()返回的值赋值给size,简化代码;
        size = get_world_size()
        
        # === 去程:从西南角到东北角 ===
        for col in range(size):
                for row in range(size):
                        
                        # 如果有操作就在当前地块执行;
                        if do_1 != None: # 检查是否输入了操作,不是空值(None);
                                do_1() # 在当前地块执行操作;
                        
                        # 垂直移动(蛇形)
                        if row < size - 1:
                                if col % 2 == 0:
                                        move(North)  # 偶数列向上移动
                                else:
                                        move(South)  # 奇数列向下移动
                
                # 水平移动到下一列(除非是最后一列)
                if col < size - 1:
                        move(East)
        
        # === 返程:从东北角回到西南角 ===
        for col in range(size - 1, -1, -1):
                for row in range(size):
                        
                        # 如果有操作就在当前地块执行;
                        if do_2 != None: # 检查是否输入了操作,不是空值(None);
                                do_2() # 在当前地块执行操作;
                                                
                        # 垂直移动(返程蛇形)
                        if row < size - 1:
                                if col % 2 == 0:
                                        move(South)  # 偶数列向下移动
                                else:
                                        move(North)  # 奇数列向上移动
                
                # 水平移动到前一列(除非是第一列)
                if col > 0:
                        move(West)
                        
# 灌木的种植;
def plant_Bush():
        # 种植前先把下方作物收获了;
        if can_harvest():
                harvest()
        # 收获成熟作物后,种植灌木;
                plant(Entities.Bush)
                
# 胡萝卜的种植;
def plant_Carrot():
        # 种植前先把下方作物收获了; 
        if can_harvest():
                harvest()
        # 收获成熟作物后,用判断语句尝试直接种植胡萝卜;
                if not plant(Entities.Carrot):
                        # 如果直接种植失败,说明地块类型不是土,或者缺少草和灌木;
                        # 由于草和灌木有一定储备,这里暂时不考虑后者原因(后面和感官一起说);、
                        till()
                        plant(Entities.Carrot)
import Utils # 调用Utils中的内容;
# Utils.route() # 调用route函数;
Utils.route(Utils.plant_Bush,Utils.plant_Carrot)

后面,我还得把农场新增的浇水、感官等功能写好基本指令后打包定义函数,不过我准备明天再做,因为,,,我得开始摸鱼了,今天的工作已经耽误太多摸鱼的时间,再耽误下去对3000草的程序员来说简直就是失职,哪有程序员不摸鱼的呀。

视频

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

请登录后发表评论

    暂无评论内容