第六节:棋盘种树代码分析 | 说好回家玩游戏,你玩兄弟脑筋!|编程农场

视频文稿

打开编程农场,农场天天有任务今天的任务最特别。我是圆大橘,再次声明,普通编程农场里没有农场主任务,大橘农场非同一般是大橘定制版。

农场主说,利用新升级的浇水与感官功能,让无人机自动、高效地收获木材。

这听起来有点复杂,但我们可以

打开GPT

打开deepseek

打开豆包

打……

这听起来有点复杂,但其实——这正是我前几天打包函数的意义所在。

上次我们学了如何定义函数、用模块分类。今天我们要正式把这些工具派上用场。


首先,我们要让农场的代码更结构化。

经过评论区高人指点后,我打算创建三个模块:

第一个是 Utils工具模块,专门负责无人机的基础功能,比如移动、路线遍历等。 第二个是 PlantCrop模块,主要处理各种作物的种植逻辑,比如种树、种灌木、种胡萝卜。 第三个是 Scheme模块,是为后续农场的整体规划准备的,还待使用。


在今天的任务里,我们只用到前两个模块:

  1. Utils 模块

里面定义了一个非常关键的函数——route()

它的功能,是让无人机按照蛇形路线遍历整个农场。

这段代码看起来长,但逻辑很清晰:

  • get_world_size() 获取农场的大小;
  • 外层循环控制列移动;
  • 内层循环控制行移动;
  • col(列号)为偶数时,向北走;为奇数时,向南走;
  • 每到一个地块,就可以执行传入的函数,比如种树、种灌木。

这就相当于我们定义了一个“通用巡逻系统”。 只要在调用 route() 的时候,告诉它每个地块要干什么,它就能全自动完成遍历。

这就是函数参数的威力——灵活、可复用。


  1. PlantCrop 模块

接下来,我们来看看植物种植逻辑。

今天要完成的,是“树和灌木的棋盘间隔种植”。这正是解决树不能临近种植的办法。

代码逻辑是这样的:

x, y = get_pos_x(), get_pos_y()
if (x + y) % 2 == 0:
        plant(Entities.Tree)
else:
        plant(Entities.Bush)

这行 (x + y) % 2 == 0 的判断,其实就是在检查“坐标和的奇偶性”。

Python 里 % 是取余运算符。 当 (x + y) 是偶数时,就种树;是奇数时,就种灌木。 于是——种植完的农场就像一个棋盘:树、灌木、树、灌木……整整齐齐!


当然,这只是最基础的逻辑。

为了让种植更智能,我还在每次种植前加入了感官检查:

  • 如果 can_harvest() 返回真,就先收割;
  • 如果是草地,就先 till() 耕地;
  • 如果含水量不足 0.3,就自动浇水。

这些判断语句构成了整个无人机的“思考过程”。


  1. 主程序

最后,在主程序中,我们只需要三行:

import Utils
import plantcrop
Utils.route(plantcrop.plant_Tree_and_Bush, plantcrop.plant_Tree_and_Bush)

这一行代码,就能让无人机按照蛇形路线遍历农场,在每个地块上自动判断并执行种树或种灌木的操作。

这段代码背后,其实融合了我们过去学过的所有知识:

  • 循环结构 for 控制无人机移动;
  • 判断结构 if 决定种什么;
  • 函数封装让逻辑模块化;
  • 参数传递让函数更灵活;
  • import 模块让整个系统更可维护。

这正是 Python 的编程思想:

“让复杂的逻辑变得简单,让重复的任务变得自动。”


当然,作为资本家手下的得力小将,我们不能让无人机休息,只需要给主程序套一个while无限循环即可。

随着程序运行,无人机在农场忙碌的穿梭,它不会种错位置,也不会忘记浇水。

当它完成一轮遍历后,整个农场就被布置成一个树与灌木交叉生长的棋盘。

看着无人机有条不紊地工作,我突然有点感慨——

也许,AI接管农场的时代,真的快到了。

不过——AI再聪明,它也不会摸鱼。

而摸鱼,是程序员最后的尊严!

所以,我决定:

趁无人机在努力干活的时候,我,去摸鱼。

代码

# Utils模块
# 无人机移动路线;
        # 把遍历移动定义为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)
# plantcrop模块
# 灌木的种植;
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)
        
# 树与灌木混合种植;
def plant_Tree_and_Bush():
        # 获取无人机当前坐标赋值给x和y,简化代码;
        x, y = get_pos_x(), get_pos_y()
        # 棋盘模式判断:(x+y)为偶数时种树,奇数时种灌木
        if (x + y) % 2 == 0:
                # 种树的位置
                # 先检查是否有成熟作物
                if can_harvest():
                        harvest()
                
                # 确保地块适合种树(草地需要耕地)
                if get_ground_type() == Grounds.Grassland:
                        till()
                
                # 种植树
                plant(Entities.Tree)
                
                # 智能浇水:检查含水量并浇水
                if get_water() < 0.3 and num_items(Items.Water) > 0:
                        use_item(Items.Water)
        else:
                # 种灌木的位置
                # 先检查是否有成熟作物
                if can_harvest():
                        harvest()
                
                # 种植灌木
                plant(Entities.Bush)
                
                # 智能浇水:检查含水量并浇水
                if get_water() < 0.3 and num_items(Items.Water) > 0:
                        use_item(Items.Water)
# main主程序
import Utils # 调用Utils中的内容;
import plantcrop # plantcrop中的内容;
while True:
        # Utils.route() # 调用route函数;
        Utils.route(plantcrop.plant_Tree_and_Bush,plantcrop.plant_Tree_and_Bush)

视频

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

请登录后发表评论

    暂无评论内容