第三节:扩张与轮替种植 | 来编程农场,教你写屎山代码 | 编程农场

视频文稿

打开编程农场,农场主笑盈盈的向我们问好。原来是今天来的客户赞扬了大橘农场的人性化管理,特别夸奖农场主善待无人机,竟然没有一心追求效率,甚至允许无人机休息,是难能可贵的企业家精神。因为这件事儿,客户还决定投资农场,目前大橘农场扩张成了三块土地,还引入了新的作物。 农场主对此非常满意,不仅不扣我们工资,还打算奖励我们。

看来上次写的代码虽然不够高效,但足够值钱啊~

查看农场主留下的任务,发现又有了更新:

持续高效的收获所有作物;

任务不难,我们的操作空间也得到了扩展:

因为农场扩张,编辑器扩展了move()函数,用来移动无人机,括号内可以输入东南西北四个方向,例如,move(North) 会将无人机向北移动一格。如果超过农场边缘,无人机将被移动到农场的另一边。

有了新的作物-灌木,扩展了 plant() 种植函数,执行plant(Entities.Bush)这会在无人机下方种植一棵灌木。

还有clear() 函数用于将农场重置为整片草地,并重置无人机位置。

没有新的python语句,看来不用去回顾残缺的记忆了。

我们来分析下农场主的新任务:

持续高效的收获所有作物。

所有作物,当然包含草和灌木,那么我们需要在三块草地上交叉种植草和灌木,草会自然生长不需要种植,所以只需在收割完草后种植灌木即可。

具体怎么写呢?

首先要满足持续工作的要求,我们可以使用while无限循环;

在循环内部,先判断下方作物是否成熟,如果成熟就收割并种植灌木;

否则表演后空翻并向北移动。

# 持续工作;
while True:
        # 判断无人机下方作物是否成熟;
        if can_harvest():
                # 若成熟就收割作物;
                harvest()
                # 并种植灌木;
                plant(Entities.Bush)
        # 否则进行表演并向北移动一格;
        else:
                do_a_flip()
                move(North)

思路应该没错,执行看看。

程序如期运行,但我们发现一个问题,除了第一轮循环收获到了成熟草外,后面都只收获了灌木。

仔细观察,发现是从第二轮循环开始,收割完成熟灌木后,草开始自发生长,但程序紧接着执行了种植函数指令,一下把正在生长的草给覆盖了,这导致后面我们都无法收割到草。

这怎么办呢,编辑器功能受限,仅靠现有指令似乎无法实现全部自动化收割两种作物。思考许久,我们有了思路。

我们尝试的第一步,是先重置农场为草地,让无人机回到起点。这一步是为了统一初始状态,让我们可以预测无人机后续的行为。

接着,由于草会自己生长,而灌木必须手动种植,所以第一轮我们不使用while循环,而是先使用if语句逐步收割草并种下灌木,让草地长满灌木。这样做是为了让后面的循环从等待灌木成熟开始。

我们先执行三次割草并种植灌木的指令,每次种完灌木后向北移动一格,保证三块地上都有灌木。此时无人机停在北格,准备进入循环阶段。

进入 while循环后,第一件事是让无人机回到起点,所以先写一个move函数;

然后进入第一个等待阶段:等待灌木成熟。由于灌木生长时间较长,我们用一个循环不断检测 can_harvest()。如果下方灌木成熟can_harvest()返回true,那执行break退出循环,否则执行表演和互动指令。

一旦检测到成熟的灌木,退出“等待”循环,进入if判断,开始收割灌木,收割完移动到下一格。这里收割灌木时不种植新灌木,因为如果立刻种植,会破坏草生长。我们需要写三个等待灌木成熟循环和三个收割灌木判断语句,因为灌木的生长时间是波动的,大概在3-5秒之间,所以无人机移动到下一块地时都有可能遇到灌木还未成熟的情况,所以得在收割前都进行等待循环判断。

收割完灌木后,进入第二个等待阶段:等待草生长。其实也可以不用写这个循环,因为草长得很快,但我们为了避免农场主升级无人机速度后可能发生的程序出错,还是加了这一步。写法同等待灌木成熟一致。

最后是收割草并种植灌木的阶段。无人机依次检查三块草地:如果草已经成熟,就先收割,然后立即种下灌木,开启下一轮灌木生长期。每处理完一格,向北移动一格,保证整个三格地都完成操作。

这时候外围的大循环,也就循环完一次回到顶部,重新等待灌木成熟。

嗯,思路没错,不过程序显得重复,这是因为目前无法使用运算符,不然这段代码还能简化。执行命令。 初始化农场后,无人机先收割草并种下灌木再向北移动一格,然后回到起点通过表演后空翻和与猪头互动等待灌木成熟,一旦灌木成熟无人机便开始依次收割灌木并向北移动一格,此时每次收割完灌木,草地都会开始自发长草,灌木收割完回到起点时,草已经长好,这时再次进行收割并种植新的灌木,进入新的循环。

通过这种方式,灌木和草交替轮流收割,实现了持续的收获,同时保证草有时间生长而不会被提前覆盖。尽管程序显得臃肿,但我们也尽可能利用可使用的指令满足农场主任务要求了,他不能说我们什么吧?

大家有更好的写法吗?欢迎留言哦。

代码

# 初始化:清田并回到起点
clear()
do_a_flip()
# 第一步:在三块地上都种下灌木,开启第一个灌木生长期
if can_harvest():
        harvest()
        plant(Entities.Bush)
move(North)
if can_harvest():
        harvest()
        plant(Entities.Bush)
move(North)
if can_harvest():
        harvest()
        plant(Entities.Bush)

while True:
        # 回到起点
        move(North)

        # 等待灌木成熟(轮询)
        while True:
                if can_harvest():
                        break
                do_a_flip()
                pet_the_piggy()

        # 灌木成熟 →,收割三格(只收割,不立即种植)
        if can_harvest():
                harvest()       
        move(North)
        
        # 等待灌木成熟(轮询)
        while True:
                if can_harvest():
                        break
                do_a_flip()
                
        if can_harvest():
                harvest()        
        move(North)
        # 等待灌木成熟(轮询)
        while True:
                if can_harvest():
                        break
                do_a_flip()

        if can_harvest():
                harvest()        

        # 收割完灌木后,回到起点并等待草长成(以防无人机升级速度加快)
        move(North) 
        # 等待灌木成熟(轮询)
        while True:
                if can_harvest():
                        break
                do_a_flip()

        # 草成熟 → 收割并立即种下灌木(开启下一轮灌木生长期)
        if can_harvest():
                harvest()
                plant(Entities.Bush)
        move(North)
        if can_harvest():
                harvest()
                plant(Entities.Bush)
        move(North)
        if can_harvest():
                harvest()
                plant(Entities.Bush)
        # 完成一整轮,回到最北边;循环继续(等待灌木再次成熟)

视频

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

请登录后发表评论

    暂无评论内容