《编程农场》教程 (5):木材大亨!树木的“社交距离”与棋盘格算法
欢迎回来,农场主!既然你已经迫不及待地翻开了“树木(Tree)”的说明书,看来你的胡萝卜已经大丰收,准备进军木材加工业了!
树木是一个极好的资源,每棵树能产出 5 份木材,比低级的灌木(Bush)效率高得多。但是,仔细阅读官方说明书后,你会发现树木有一个非常傲娇的特性:它们需要“社交距离”。
如果你直接套用上一课种胡萝卜的“全图铺满”代码,你的农场将会遭遇灾难——所有的树都会因为太拥挤,导致生长速度变慢 16 倍!这就好比早高峰的地铁,大家都动弹不得。
为了解决这个问题,今天我们将学习计算机图形学和网格编程中最经典的一招:“棋盘格布局 (Checkerboard Pattern)”。
1. 为什么是棋盘格?
说明书上写得很清楚:每在其正北、正东、正西或正南方向地块上种植一棵树,都会使其生长时间翻倍。
注意关键词:正方向(上下左右)会互相影响,但说明书并没有说斜对角会影响!
想象一下国际象棋的棋盘,如果我们只在“黑格”上种树,把“白格”空出来。这样每一棵树的上下左右全都是空的,完美避开了所有减速惩罚,同时又在有限的土地上种下了最多的树!
2. 数学魔法:如何让无人机识别“黑白格”?
在二维网格中,无人机怎么知道自己当前踩的是黑格还是白格呢? 这就要请出编程界最常用的数学符号了:取模运算符 %(求余数)。
在《编程农场》里,每个地块都有自己的坐标 (X, Y),你可以用 get_pos_x() 和 get_pos_y() 来获取。 棋盘格的黄金定律是: 如果一个格子的 X坐标 + Y坐标 是偶数(能被 2 整除,余数为 0),它就是黑格;如果是奇数,它就是白格。
写成 Python 代码就是这样:
Python
# 判断当前是不是“黑格”
if (get_pos_x() + get_pos_y()) % 2 == 0:
种树()
3. 实战:打造极致的“棋盘格全自动伐木场”
现在,让我们把上一课的“极速扫荡机”改造一下。收割的逻辑不变(熟了就砍),但在种树的时候,我们要给无人机加上一层“黑白格滤镜”。
清空你的代码板,输入这段极其优雅的伐木场代码:
Python
size = get_world_size()
while True:
for x in range(size):
for y in range(size):
# 第一步:不管是什么,只要熟了就一刀砍掉!
if can_harvest():
harvest()
# 第二步:如果地上是空的,准备种树
if get_entity_type() == None:
# 【核心魔法】:检查坐标之和是不是偶数
if (get_pos_x() + get_pos_y()) % 2 == 0:
# 树可以直接种在草地上,不需要 till() 翻土!
plant(Entities.Tree)
# 第三步:继续向北飞,巡视下一格
move(North)
# 换列
move(East)
🧠 运行效果:强迫症的福音
当你点击运行时,你会看到无人机飞速掠过农场。它不再傻乎乎地填满每一个格子,而是极其规律地“隔一个种一个”。 因为每棵树都享受着 100% 的最高生长速度,当你扫完一圈回来时,最早种下的那批树刚好成熟!整个农场就像一台精密的齿轮,木材库存开始疯狂暴涨!
结语: 太棒了!你不仅学会了如何避免游戏的负面惩罚机制,还掌握了坐标轴 (X, Y) 与 % 取模运算的组合技。这在以后的自动化编程中是一张绝对的王牌。
现在,你的胡萝卜和木材都已经实现了工业化生产。但在前面的课程中,你跳过了一个非常关键的环节——我们怎么让机器知道什么时候该停下来?如果木材已经爆仓了,无人机还在傻傻地种树,既浪费时间又浪费电。