《编程农场》教程 (11):打造你的“瑞士军刀”!构建通用工具箱 tool.py
欢迎回来,农场首席架构师!
随着农场越来越大,我们要写的代码也越来越长。如果在每个文件里都要重新写一遍“怎么走到某个坐标”、“怎么浇水”、“怎么翻土”,代码不仅会变得极其臃肿,而且一旦写错一个缩进,排查起来会让人崩溃。
在真正的软件工程中,大神们会把这些“脏活累活”统一打包进一个**工具箱(Toolbox)**里。今天,我们就来建立一个名为 tool.py 的专属模块,把它打造成你的瑞士军刀!
核心模块 1:导航与移动系统
要在农场里随心所欲地穿梭,我们需要绝对精准的定位系统。
# ==========================================
# 模块:导航与移动
# ==========================================
def move_to(target_x, target_y):
"""
精确制导移动:自动飞向指定的 (x, y) 坐标。
【优化】:加入了 % size 取模运算。这样即使你输入了超出地图大小的坐标,
无人机也不会死循环,而是会利用地图的“折返机制”自动计算最短路径。
"""
size = get_world_size()
tx = target_x % size
ty = target_y % size
while get_pos_x() < tx: move(East)
while get_pos_x() > tx: move(West)
while get_pos_y() < ty: move(North)
while get_pos_y() > ty: move(South)
def sway():
"""
S 形全图扫描算法(蛇形走位)。
相比于普通的逐行扫描,S 形走位在换行时不需要飞回最左边,极大地节约了移动时间!
"""
size = get_world_size()
for i in range(size):
for j in range(size):
# 偶数列正着走,奇数列倒着走
if i % 2 == 0:
y = j
else:
y = size - 1 - j
move_to(i, y)
核心模块 2:农业自动化基础
把最繁琐的资源消耗动作加上“智能判断”,避免浪费背包里的物资。
# ==========================================
# 模块:智能农业操作
# ==========================================
def auto_till():
"""智能翻土:只有当脚下是普通草地时才翻土,避免报错。"""
if get_ground_type() == Grounds.Grassland:
till()
def auto_water():
"""
智能浇水逻辑:保持地块湿润以获得 5 倍生长加速。
只有当背包里有水罐,且当前水分低于 0.75 时才浇水,绝不浪费一滴水!
"""
if num_items(Items.Water) > 0:
if get_water() < 0.75:
use_item(Items.Water)
def prepare_all_soil():
"""
拓荒者指令:使用 S 形走位扫荡全图。
遇到成熟作物就收割,遇到草地就翻土,为你准备一块完美干净的纯耕地农场。
"""
size = get_world_size()
for i in range(size):
for j in range(size):
if i % 2 == 0:
y = j
else:
y = size - 1 - j
move_to(i, y)
# 顺手收割清理场地
if can_harvest():
harvest()
auto_till()
核心模块 3:【新增】进阶实用动作
这些是我为你额外补充的进阶函数,它们在应对南瓜、向日葵等高级作物时极其好用。
# ==========================================
# 模块:高级复合动作 (老师强烈推荐)
# ==========================================
def smart_plant(entity_type):
"""
一键傻瓜式种植。
不用再每次都写 if-else 判断了,只要把种子名字传进来,它会自动帮你清理、翻土并种下。
用法示例:tool.smart_plant(Entities.Carrot)
"""
if get_entity_type() != entity_type:
# 如果当前格子上不是我们要种的东西,直接铲平重种!
if can_harvest():
harvest()
auto_till()
plant(entity_type)
def wait_until_mature():
"""
死等协议。
强制无人机停在当前格子上等待作物成熟,并且在等待期间会自动浇水催熟。
用法:种下胡萝卜后,直接调用 tool.wait_until_mature()
"""
while not can_harvest():
auto_water() # 等待期间别闲着,顺手把水补满
def safe_harvest():
"""
安全收割。
闭着眼睛调用也不会报错的收割函数。
"""
if can_harvest():
harvest()
如何在其他文件中使用你的“工具箱”?
把上面所有的代码保存在一个叫做 tool 的文件里。 然后,在你的主程序文件(比如 main)的最开头,写上这一句:
import tool
# 现在,你可以直接召唤你的工具箱了!
tool.prepare_all_soil()
# 种一颗胡萝卜并等它长大
tool.move_to(0, 0)
tool.smart_plant(Entities.Carrot)
tool.wait_until_mature()
tool.safe_harvest()
你看,你的主程序变得多么干净、整洁!逻辑清晰得就像是一篇说明文。