《编程农场》教程 (2):农场扩张!掌握 move() 移动与 for 循环遍历网格
欢迎回来,见习农夫!
在上一课中,我们制造了一台会“永远原地收割”的永动机。但是,当你解锁了**“扩张”**之后,你的农场变大了!它不再是孤零零的一个地块,而变成了一片广阔的土地。
一直停在原地的无人机只能眼巴巴地看着旁边的草长高。所以今天,我们要为无人机安装“导航系统”,让它在农场里飞起来!
1. 动起来:认识move() 函数与四个方向
为了让无人机移动,游戏引入了一个全新的函数:move()。 同时,还配发了四个方向常量(注意首字母必须大写!):
North:向上(北)East:向右(东)South:向下(南)West:向左(西)
比如,move(North) 这个指令,就会让无人机向上移动 1 格。
🌍 农场的魔法边缘(折返机制)
《编程农场》的地图有一个非常神奇的物理特性——它是无缝连接的! 这就好比经典的《吃豆人》游戏:如果无人机一直向上飞,当它越过农场最上面的边缘时,它不会撞墙爆炸,而是会瞬间从农场最下方的边缘钻出来,继续向上飞!
试试下面这段代码:
Python
while True:
move(North)
你会看到无人机像坐上了无限循环的高速电梯,一直往上飞,永远不会停。
2. 告别无限:你好,for 循环!
在上一课中,我们用了 while True: 来做无限循环。但在扩张后的农场里,如果我们要精确地扫荡每一块地,仅靠漫无目的的瞎飞是不行的。
我们需要无人机做固定次数的动作。这时候,就需要请出编程界的另一位大佬:for 循环。
在《编程农场》中,它通常长这样:
Python
# 让无人机做 5 次后空翻
for i in range(5):
do_a_flip()
range(n):它就像一个计数器,表示一个从 0 到 n-1 的数字范围,总共包含n个元素。for i in range(5)::翻译成白话文就是:“接下来的缩进代码,给我老老实实地重复执行 5 次!”
3. 动态适应:聪明的 get_world_size()
随着游戏推进,你的农场会从 3x3 扩张到 4x4、5x5 甚至更大。 如果你在代码里写死 for i in range(3):,等农场变成 4x4 时,无人机就会漏掉最外面那一圈的地。
为了让我们的代码永远不会因为农场扩张而失效,游戏提供了一个神器:get_world_size() 函数。 它会智能读取当前农场的边长。如果是 3x3,它就等于 3;如果是 10x10,它就等于 10。
让我们把它们结合起来,写一段能完美收割“一整列”草的代码:
Python
for i in range(get_world_size()):
if can_harvest():
harvest()
move(North)
运行这段代码,无论你的农场有多高,无人机都会从下到上,一边收割一边移动,完美清理完第一列的每一个格子!
4. 终极实战:遍历整个二维网格!
现在,我们能收割一整列了。但农场是一个二维的正方形网格,怎么才能让无人机像扫地机器人一样,不留死角地扫过每一寸土地呢?
答案是:循环嵌套(在 for 循环里面,再塞一个 for 循环)!
想象一下你平时是怎么拖地的:先从下往上拖完一列 ➡️ 然后往右横移一步 ➡️ 再从下往上拖完下一列。
把它翻译成代码,就是我们今天的毕业级脚本:
Python
# 先把农场的大小存起来,免得每次都去量
size = get_world_size()
# 外层循环:控制我们要扫多少“列” (X轴)
for x in range(size):
# 内层循环:控制我们在这一列里向上走多少“格” (Y轴)
for y in range(size):
if can_harvest():
harvest()
move(North) # 边收割边往上走
# 当上面这个内层循环结束时,说明一整列已经走完了!
# 此时,无人机向右移动一格,准备开始扫荡下一列
move(East)
代码解析(注意缩进!):
无人机进入内层循环,不断执行
harvest()和move(North),直到爬到最顶端,完成了一列的收割。内层循环结束,退回到外层循环的缩进级别,执行
move(East)。无人机向右跨出一步。接着又重新开始新一轮的内层循环,再次从下往上爬。
由于地图的“折返机制”,当它一直往上爬时,天然就会回到最下面;当它扫完最后一列向右走时,天然就会回到第一列的起点。
把这段代码复制进游戏运行,欣赏你的无人机像打印机一样,整齐划一地推平整座农场吧!