视频文稿
打开编程农场,农场天天有任务今天的任务最特别。我是圆大橘,再次声明,普通编程农场里没有农场主任务,大橘农场非同一般是大橘定制版。
农场主说,利用新升级的浇水与感官功能,让无人机自动、高效地收获木材。
这听起来有点复杂,但我们可以
打开GPT
打开deepseek
打开豆包
打……
这听起来有点复杂,但其实——这正是我前几天打包函数的意义所在。
上次我们学了如何定义函数、用模块分类。今天我们要正式把这些工具派上用场。
首先,我们要让农场的代码更结构化。
经过评论区高人指点后,我打算创建三个模块:
第一个是 Utils工具模块,专门负责无人机的基础功能,比如移动、路线遍历等。 第二个是 PlantCrop模块,主要处理各种作物的种植逻辑,比如种树、种灌木、种胡萝卜。 第三个是 Scheme模块,是为后续农场的整体规划准备的,还待使用。
在今天的任务里,我们只用到前两个模块:
- Utils 模块
里面定义了一个非常关键的函数——route()。
它的功能,是让无人机按照蛇形路线遍历整个农场。
这段代码看起来长,但逻辑很清晰:
get_world_size()获取农场的大小;- 外层循环控制列移动;
- 内层循环控制行移动;
- 当
col(列号)为偶数时,向北走;为奇数时,向南走; - 每到一个地块,就可以执行传入的函数,比如种树、种灌木。
这就相当于我们定义了一个“通用巡逻系统”。 只要在调用 route() 的时候,告诉它每个地块要干什么,它就能全自动完成遍历。
这就是函数参数的威力——灵活、可复用。
- 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,就自动浇水。
这些判断语句构成了整个无人机的“思考过程”。
- 主程序
最后,在主程序中,我们只需要三行:
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)








暂无评论内容