视频文稿
打开编程农场,农场主笑盈盈的向我们问好。原来是今天来的客户赞扬了大橘农场的人性化管理,特别夸奖农场主善待无人机,竟然没有一心追求效率,甚至允许无人机休息,是难能可贵的企业家精神。因为这件事儿,客户还决定投资农场,目前大橘农场扩张成了三块土地,还引入了新的作物。 农场主对此非常满意,不仅不扣我们工资,还打算奖励我们。
看来上次写的代码虽然不够高效,但足够值钱啊~
查看农场主留下的任务,发现又有了更新:
持续高效的收获所有作物;
任务不难,我们的操作空间也得到了扩展:
因为农场扩张,编辑器扩展了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)
# 完成一整轮,回到最北边;循环继续(等待灌木再次成熟)








暂无评论内容