恐龙帽:把它当成贪吃蛇,不要当成普通收割
恐龙帽不是种地脚本。戴上它,有仙人掌就能刷出苹果;每吃一颗,身后多一节尾巴;只有摘掉帽子才会变成骨头。先把规则看懂,完整脚本放在最后,可复制也可自己拼。
第 1 步 — 先把帽子戴上
不戴帽子,什么恐龙规则都不会生效。一个函数,一个帽子名字。执行这一行后,如果你仙人掌够,游戏会买一颗苹果,放在无人机脚下。
change_hat(Hats.Dinosaur_Hat) 整场只有一顶恐龙帽,只有一台无人机戴得上。clear() 会把帽子换回草帽,并清空农田。
第 2 步 — 为什么要有仙人掌
苹果不是 plant() 种出来的。游戏会从背包里扣仙人掌。仙人掌为 0 时,不会出现苹果,后面的追逐也无从谈起。开跑前先看一眼数量。
if num_items(Items.Cactus) == 0:
print("need cactus before the hat is useful") 第 3 步 — 再移动一格才是吃,不是 harvest
站在苹果上还没吃掉。下一次成功的 move 才会吃掉它,并在你刚离开的格子留下一节尾巴。这里不要用 harvest()。仙人掌还够的话,新苹果会刷在随机空格;那一格如果已经种了东西,苹果刷不出来。
# hat is on, apple is under the drone
move(East)
# that move ate the apple and grew the first tail tile 第 4 步 — 尾巴就是墙
下一格是自己的尾巴时,move() 返回 False。最后一节尾巴会在你移动时让开,所以可以踩那一格。戴着恐龙帽时,无人机也不能从农田边缘绕到对面。尾巴铺满整块地时,所有方向都走不动——这就说明长满了。
if can_move(North):
move(North)
else:
print("blocked by tail or the farm edge") 第 5 步 — 站在苹果上问下一颗在哪
对苹果调用 measure() 会返回一对坐标,也就是下一颗苹果的位置。要在还站在当前这颗上、还没移动时调用。吃掉之后,朝这两个数字走。走到了再 measure 一次。
next_x, next_y = measure()
print(next_x, next_y) 第 6 步 — 摘掉帽子才变成骨头
换成任意其他帽子,尾巴会被收走。骨头数量是尾巴长度 n 的平方:1、4、9、16……长度为 16 就是 256 块。不要对尾巴调用 harvest()。
change_hat(Hats.Straw_Hat)
# tail is gone; inventory gained n**2 Items.Bone 可选:先在小农田上练
铺满整块大地很慢,而且你未必需要那么多骨头。set_world_size() 会缩小网格(最小 3)并清空农田。程序结束时效果消失。下面这段练习循环只用到上面讲过的事:缩小、戴帽、测量、走过去、走不动就停、摘帽。
set_world_size(5)
clear()
change_hat(Hats.Dinosaur_Hat)
def walk_to(x, y):
while get_pos_x() != x or get_pos_y() != y:
if get_pos_x() < x:
if not move(East):
return False
elif get_pos_x() > x:
if not move(West):
return False
elif get_pos_y() < y:
if not move(North):
return False
else:
if not move(South):
return False
return True
while True:
nxt = measure()
if nxt == None:
break
next_x, next_y = nxt
if not walk_to(next_x, next_y):
break
change_hat(Hats.Straw_Hat) 这是教学路线,不是冲榜路线。它迟早会撞上自己的尾巴,好让你看到停止条件。农田清空后再戴帽子,苹果才有空位刷出来。