🌻 编程农场 专项课:向日葵与“批处理”收割法

同学们,今天我们要挑战农场里非常特殊的一种植物——向日葵

向日葵能产出“能量”,让你的无人机速度翻倍。但它有一个极其诱人的隐藏规则:如果农场里至少有 10 株向日葵,只要你收割了全场“花瓣最多”的那一株,就能获得 8 倍的超级能量!

官方告诉我们,向日葵的花瓣数量是随机的,最少 7 片,最多 15 片。

为了保证我们每次都能割到最大的,我们要教无人机一套非常严谨的**“农业三步走(批处理)”**策略。

🧠 我们的“批处理”策略

什么叫批处理?就是把任务分阶段,一阶段做完,再做下一阶段,绝不半途而废!

  1. 第一阶段:播种季。 把农场每一寸土地都种满向日葵。

  2. 第二阶段:等待季。 挂机等待,直到农场里所有的向日葵全部成熟,彻底锁定它们的花瓣数量。

  3. 第三阶段:丰收季。 拿着“通缉令”,从 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)