🌻 编程农场 专项课:向日葵与“批处理”收割法
同学们,今天我们要挑战农场里非常特殊的一种植物——向日葵。
向日葵能产出“能量”,让你的无人机速度翻倍。但它有一个极其诱人的隐藏规则:如果农场里至少有 10 株向日葵,只要你收割了全场“花瓣最多”的那一株,就能获得 8 倍的超级能量!
官方告诉我们,向日葵的花瓣数量是随机的,最少 7 片,最多 15 片。
为了保证我们每次都能割到最大的,我们要教无人机一套非常严谨的**“农业三步走(批处理)”**策略。
🧠 我们的“批处理”策略
什么叫批处理?就是把任务分阶段,一阶段做完,再做下一阶段,绝不半途而废!
第一阶段:播种季。 把农场每一寸土地都种满向日葵。
第二阶段:等待季。 挂机等待,直到农场里所有的向日葵全部成熟,彻底锁定它们的花瓣数量。
第三阶段:丰收季。 拿着“通缉令”,从 15 片花瓣开始往下点名收割。在这个阶段,我们只管割,绝不补种!(因为一旦补种,新长出来的幼苗花瓣数又是随机的,会破坏我们从大到小的点名顺序)。
等丰收季结束,地全空了,我们再重新回到第一阶段。
👨💻 代码实现:全自动向日葵反应堆
我们将这三个阶段清清楚楚地写在代码里。请注意看,代码是怎么做到“条理分明”的:
import utils # 导入我们之前写好的移动和翻土工具箱
def run_sunflower_reactor():
size = get_world_size()
# =========================================
# 第 1 步:播种季(全图统一播种)
# =========================================
for x in range(size):
for y in range(size):
utils.goto(x, y) # 飞到指定坐标
# 如果是空地,就翻土并种下向日葵
if get_entity_type() == None:
utils.prepare_soil()
plant(Entities.Sunflower)
# =========================================
# 第 2 步:等待季(全图统一等待成熟)
# =========================================
# 必须等全部成熟,花瓣数彻底锁定,才能开始降序收割!
while True:
all_mature = True # 先假设全都熟了
for x in range(size):
for y in range(size):
utils.goto(x, y)
# 如果发现有向日葵还没熟,就推翻假设
if get_entity_type() == Entities.Sunflower and not can_harvest():
all_mature = False
# 如果巡逻了一圈发现全都熟了,就打破等待循环,进入下一步!
if all_mature:
break
# =========================================
# 第 3 步:丰收季(纯粹的降序收割,绝对不补种!)
# =========================================
# range(15, 6, -1) 意味着让目标数字从 15 一直递减到 7
for target_petals in range(15, 6, -1):
for x in range(size):
for y in range(size):
utils.goto(x, y)
# 如果脚下是向日葵
if get_entity_type() == Entities.Sunflower:
# 并且花瓣数刚好等于我们正在找的目标数字
if measure() == target_petals:
harvest()
# 割完直接走人,寻找下一个,绝不补种!
# =========================================
# 主程序:让反应堆永远运行下去
# =========================================
if __name__ == "__main__":
while True:
run_sunflower_reactor()
💡 老师的课后小结
同学们,大家看这段代码,虽然它有点长,但它的逻辑结构就像写文章的分段一样,无比清晰。
在编程中,这是一种非常高级的**“状态机思维”**。当我们在“播种状态”时,就绝对不想着收割;当我们在“收割状态”时,就绝对不手痒去补种。把复杂的事情拆解成几个单纯的步骤,你的代码就永远不会乱。
这是我的utils
def goto(target_x, target_y):
while get_pos_x() < target_x:
move(East)
while get_pos_x() > target_x:
move(West)
while get_pos_y() < target_y:
move(North)
while get_pos_y() > target_y:
move(South)
def auto_till():
if get_ground_type() == Grounds.Grassland:
till()
def prepare_all_soil():
size = get_world_size()
for i in range(size):
for j in range(size):
# 继续使用你高效的 S 形走位
if i % 2 == 0:
y = j
else:
y = size - 1 - j
move_to.move_to(i, y)
# 如果上面有杂草或灌木,先顺手收割掉清理场地
if can_harvest():
harvest()
# 调用我们刚写的翻土函数
auto_till()
def auto_water():
#智能浇水逻辑:保持地块湿润以获得5倍加速
# 只有当有水罐 且 水位低于 0.75 时才使用
if num_items(Items.Water) > 0:
if get_water() < 0.75:
use_item(Items.Water)