编程农场

编程农场

25 个评价
《编程农场》全成就指北
由 kaikisen 制作
这是一篇关于《编程农场》(《The Farmer Was Replaced》)全成就达成思路的指南指北
请注意:本篇内容并不包含实现代码,而只是成就达成思路的提示。
   
奖励
收藏
已收藏
取消收藏
⊡Intro & Tips
首先需要注意的是:本篇内容并不包含实现代码,而只是成就达成思路的提示。
也许有朋友会问——为什么呢?直接show me the code难道不是更加干脆利落吗?
这是因为:
  1. 这个游戏全成就范围内的内容不止要求写单段的小脚本,而鼓励玩家构建一个属于自己的方法库,如果直接挪用代码的话那么连通用库也需要一起搬过去——这样玩家自己本来花精力写的代码反而会成废笔,而可玩性则几乎丧失了;
  2. ——但如果真的需要参考代码,很多其他指南作者/讨论区玩家也发布了各自的实现代码!感谢他们!
  3. 还有就是我有些地方真的写的很屎…怯于示人哦(ˉ▽ ̄~)


《编程农场》在寓教于乐上可以说做的非常好,游戏中的各个植物/机制其实都对应了一些coding中常见的技巧和挑战。
  • 草和灌木——for循环和遍历
  • 树——非紧密排布和循环用法拓展
  • 胡萝卜——条件判断
  • 南瓜——计数和存储
  • 仙人掌——冒泡排序和
  • 恐龙——贪吃蛇寻路算法和哈密顿回路
  • 迷宫——迷宫寻路算法(从基础的右走,到进阶的BFS、DFS甚至A*)

总而言之,本游戏是一个非常适合用于python练手的小游戏,将耕种主题的增量游戏和python自动化脚本编写非常巧妙地结合在了一起,新手可以用这个游戏提前体验上班,而老手则可以下班后闲来无事再用这个游戏体验一下加班(不是)
如果只是浅尝一下,那么随自己喜好编写代码就好;但如果希望达成成就范围内的目标,这是一些可能有帮助的tips:
  • 规范命名,对于常用的脚本用易读易辨认的英文命名,方便后续拓展引用;
  • 尽早建立通用方法库,减少反复编写重构简单逻辑的垃圾时间。推荐的通用方法包括不限于:
    • goto:让无人机移动至指定坐标
    • 浇水:判断土地是否达到目标湿度再决定是否浇水,以节省水量
    • 以及各类植物以草地(clear())为起始的种植方法;
  • 人机协同,临门一脚/代码实现不了/实现过于复杂的时候不妨尝试手动介入(见识一下能工智人30万年的底蕴!)
  • 不求最优但求能跑——这毕竟还是一个游戏,游戏的增量升级远比代码优化给到的提升强得多()
⊡流程基本可获取成就
├技能树&简单增量相关
灌木丛
种植一丛灌木。




干草专业户
收获 1000 干草。




胡萝卜
种植胡萝卜。


种植胡萝卜时,与其单独用一次遍历翻土,更推荐每经过一个地块时判断土地类型并决定是否翻土


木材专业户
收获 1000 木材。




胡萝卜专业户
收获 1000 胡萝卜。




树木
种植一棵树。


树的正北、正东、正西或正南方向地块上每存在一颗树,都会使其生长时间翻倍,所以树的理想种植排布应该是:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1


南瓜
种植一棵南瓜。


种植南瓜时,最大收益自然是形成尽可能大的n*n南瓜饼。单无人机时,较优的方法是:
  1. 创建一个【已成熟地块】的列表,若当前地块已成熟则将坐标加入列表;
  2. for循环遍历坐标时如果,坐标已经存在于【已成熟地块】,则直接跳过地块时,如果不存在,则调用goto函数前往坐标检查作物状态,决定是否再次种植;
  3. 这样可以避免无人机遍历所有地块,而只会径直前往下一个不存在于【已成熟地块】列表中的坐标。


南瓜专业户
收获 1000 南瓜。




向日葵
种植一棵向日葵。


将向日葵的测量值存储在列表中,用max()得出最优的可采收值,收获对应的向日葵即可。


能量专业户
收获 1000 能量。




仙人掌
种植一棵仙人掌。


与南瓜类似,但是加上了二维矩阵的冒泡排序。
  1. 为了检测方便可以采用先横后竖的方法排序;
  2. 为一行(或一列)中坐标为(i,j)的仙人掌测量生长值并存储在字典中。例如
    cache[(i, j)] = measure()
  3. 比较cache中相邻的元素,如果均满足升序(无逆序对)时,就认为排序完成。例如:
    cache[s,h] > cache[s + 1,h]
    否则,则前往逆序元素队列坐标处,替换两者位置。
  4. 当排序完成后,统一收割所有成熟的仙人掌。


仙人掌专业户
收获 1000 仙人掌。




迷宫
生成一座迷宫。


*迷宫相关见后文


黄金专业户
收获 1000 黄金。




恐龙
装备恐龙帽。


*恐龙相关见后文


骨头专业户
收获 1000 骨头。




蒸蒸日上
扩张农场。




大型农场
农场达到最大规模。

├程序相关
Hello World
运行你的第一个程序。




错误
造成一个运行时错误。


必得成就


无限循环
创建一个无限循环。


写一个while True即可


循环导入
创造一个导入循环(import cycle)。


建两个文件相互导入即可:
1. a.py
import b def func_a(): print("这是a") b.func_b()
2. b.py
import a def func_b(): print("这是b") a.func_a()


栈溢出
造成一次栈溢出(stack overflow)。


在方法中调用自身导致溢出即可:
def recurse(n): recurse(n + 1) recurse(1)


高阶编程
将一个函数作为参数传递给另一个函数。


如描述所说,函数本身也可以当做括号里的参数;无人机阵列的for_all(f)就是这样的一个函数传递
├简单操作
杂技高手
来个后空翻。




时尚达人
装备一顶新帽子。




手感不错
抚摸小猪。




泥泞农场
让农场整体水位超过 0.5。


无判断直接遍历浇水即可,可能需要升级一些无人机速度


宝藏猎人
解开一座填满整个农场的迷宫。


非常有用的全场迷宫生成:
plant(Entities.Bush) substance = get_world_size() * 2**(num_unlocked(Unlocks.Mazes) - 1) use_item(Items.Weird_Substance, substance)
新手解迷宫推荐边走(一直靠左走/靠右走)算法,下面贴的是一个极短且精巧的边走算法(作者是LustONE):
def complete_maze(): ix, dirs = 0, [East, South, West, North] while get_entity_type() != Entities.Treasure: ix += 1 - move(dirs[ix % 4])*2 harvest()


妙手回春
治愈一株受感染的植物。


对感染的植物再次使用奇怪物质


长龙
让一个恐龙填满整个农场。


使用简单哈密顿回路充满农场



巨型农场
使用多架无人机。


非常有用且易于拓展的多无人机阵列:
def for_all(f): def row(): for _ in range(get_world_size()-1): f() move(East) f() for _ in range(get_world_size()): if not spawn_drone(row): row() move(North)
└特殊操作
你搞错了
将一整片仙人掌按照错误的顺序排列。


如题,将大小比较逆转,达到左下大右上小的状态。需要额外注意一下边界情况。
*我做的时候试了三四次才解锁,不知道是不是bug,不成功的朋友可以缩小农场大小再试试
*update:dc和评论区有玩家反应确实有触发问题,目前(251020)已知的情报:
  • 1.全逆序排列后需要收割一下来trigger成就解锁;
  • 2.早期版本作者说确实没考虑到相同生长值绿仙人掌的情况,即存在绿色仙人掌就不行;所以即使全地块反向排布了但局部出现了生长值相等的情况也会判定“排序成功”了(但现在大概率修复了?);
  • 3.最近的消息显示3x3和32x32排布都有玩家成功解锁的;
  • 4.另一个应该是bug的触发方法是在(0,0)种一颗仙人掌然后反复播种收割可以直接解锁(?)


混沌编程
打开 20 个代码窗口。


只需要打开,不需要写东西


杂技大师
来 1000 个后空翻。


可以升级无人机速度后,写个loop挂机一会,也可以解锁多无人机之后用阵列一口气做完


蜂群
同时使用 32 架无人机。


升级到最高级即可;到了这一阶段,推荐使用多无人机阵列结合之前的作物种植得到多无人机版本的种植方法,效率会高很多。


巨型南瓜
收获一颗 32x32 的南瓜。


需农场升级达到最大,种出全场南瓜(饼)


长度很重要
让一个恐龙的长度达到 1000。


需农场升级达到最大,爬满哈密顿回路可达32*32=1024长度


时装秀
为 5 架无人机装备 5 顶不同的帽子。


注意分配给无人机的任务不能只是装备帽子,否则任务结束无人机就会消失。依然推荐用多无人机阵列,建立一个包含多种帽子的列表,让无人机按顺序佩戴并穿行农场即可


循环利用
重复使用同一座迷宫 300 次。


迷宫的生成大小可调节。调整奇怪物质用量生成1*1(静止不动)或2*2迷宫(需要边走算法)后,不断对宝箱施加奇怪物质并计数300次,最后收割即可。


农业竞争
登上排行榜。


任意排行榜都可以,只需要跑完排行榜模拟登榜,而不用名列前茅
⊡进阶成就
├作物资源的竞速收获和巨量收获
这一部分开始是游戏比较tricky的地方,在进行以下这些成就挑战时,理想的情况是已经解锁了除???和高帽以外所有的升级项(也就是所有的效率/数值升级项)。
除此之外,其他效率增项如下:
  • 保证水的储备量,运行时观察生长效率,如果植物生长跟不上无人机速度则提升触发浇水的水线阈值;
  • 保证能量(非常重要)的储备量,直接倍增大部分效率;
  • 使用多无人机序列种植;

  • 特别的,对于干草、胡萝卜和木材:使用混合种植:
    • 1.满级混合种植提供800倍的产量加成,原本512的满级产量直接一跃为409k;
    • 2.我尝试了【种植作物—派布无人机分身种植伴生作物—收获作物】的思路,但效率似乎并没有预想的高(有成功优化到吃满加成的高手朋友欢迎分享你的code算我求你了);
    • 3.然而,按照列表顺序(干草→灌木→树→胡萝卜)或者干脆随机顺序种植种植,也能得到惊人的产量,因为伴生作物的选择也是随机的,这样一来在伴生位恰好种到正确伴生植物的概率也不低,依然能得到期望为800/4(还是800/3?)的惊人产量增幅。

  • 特别的,对于南瓜和仙人掌:农田升级之后场地会很大,虽然使用多无人机序列种植、排序速度飞快,但由于无人机相互之间的参数是无法传递的,南瓜和仙人掌的即使排布好了可能也要检测很久。这时我们可以选择:
    • 手动收割(更快更适合冲刺竞速收获成就),观察到成熟/排列完整后人工介入中断检测直接收割;
    • 设定经验比例(不需要操作更适合挂巨量收获成就)。例如,单无人机种植南瓜时常用列表记录成熟南瓜坐标并与田地数量比较,而多无人机运行时,(成熟南瓜坐标列表长度)/(田地地块数量)在大于某个值时往往已经完全成熟了。(32*32+32无人机种植南瓜这个值大概在0.15-0.20)取这个经验值为收获信号点可以极大节省时间。


干草大师
1 分钟内收获 2 亿干草。




胡萝卜大师
1 分钟内收获 2 亿胡萝卜。




木材大师
1 分钟内收获 10 亿木材。




南瓜大师
1 分钟内收获 2000 万南瓜。




仙人掌大师
1 分钟内收获 2000 万仙人掌。




向日葵大师
1 分钟内收获 12000 能量。




干草大亨
收获 10 亿干草。




木材大亨
收获 10 亿木材。




胡萝卜大亨
收获 10 亿胡萝卜。




南瓜大亨
收获 1 亿南瓜。




仙人掌大亨
收获 1 亿仙人掌。




能量大亨
收获 100000 能量。



├高阶资源的竞速收获和巨量收获
*骨头和黄金的竞速收获都计算的是收获的平均效率
一次恐龙探索中,骨头获得效率计算的是:(换帽时获得的骨头)/(从换上恐龙帽开始到换下恐龙帽的时间);
一次迷宫探索中,黄金获得效率计算的是:(采收宝箱时获得的金币)/(建立迷宫开始到采收宝箱的时间)


恐龙大师
1 分钟内收获 100 万骨头。


14*14农场大小跑满吃满头尾相接,可以刚好得到超过100万的骨头( (14*14-1)**2 * 32 = 1216800),也就是说只要在1min内跑满14*14大小农场即可解锁成就。保证充足的仙人掌和能量的情况下,如果只用哈密顿回环线路,花费的时间会恰好比1min多一些。
恐龙行走速度随着尾巴增长会逐渐增加,初期短尾时行走速度慢,所以沿哈密顿回路走会浪费很多时间。
我的方法是:当尾巴较短时(吃掉的苹果<14),直接使用goto函数移动到苹果坐标,当尾巴长度达标时,立刻更换行进策略,回到原点沿着哈密顿回路行进。第一阶段时经常会吃到尾巴,但没关系,吃到尾巴手动重开即可——因为我们只需要成功一次。
*如果效率依然差一点点,可以尝试略微扩张农场大小至16*16或18*18,容错会高一些


迷宫大师
1 分钟内收获 200 万黄金。


探索迷宫走到宝箱上方时,可以重新施加奇怪物质使迷宫反复刷新,期间迷宫的隔墙会逐渐消失,如果使用的是以宝箱坐标为导向的BFS/DFS走法,那么随着隔墙的减少,获得宝箱的速度也会越来越快,所以很容易想到用多无人机阵列同时探索32*32大迷宫获得最大乘数的金币。
——但这是一个陷阱!或者说,有简单高效地多的方法提高金币采收效率:
因为我们总共有32架无人机,而这个数量足够多,足以铺满小型迷宫。

如图,可以用25架无人机铺满5*5的迷宫(也可以铺满2 * 4*4迷宫,这样能用上全部32架无人机效率更高),无论宝箱刷新到哪个位置,都能瞬间采收。重复施加奇怪物质宝箱坐标不动则可确定已经耗尽300轮循环,收获即可。
这个效率是远超出2M gold/1min的,目前无限制300轮迷宫排行榜前茅基本用的是这个方法。


骨头大亨
收获 1 亿骨头。


用哈密顿回路跑满32*32循环即可,可能要挂比较久的时间。


黄金大亨
收获 1 亿黄金。


用暴力破解同样能很快解锁。


然后呢?
解锁所有内容。

└最难成就
全自动化
登上“完全复位”排行榜。


最难的成就,也是整个游戏的终极挑战:设定好脚本后全程无介入直至运行至排行榜解锁。
  • 使用之前的作物种植方法,但推荐微调一下重构成【种植xx直到存储量为num为止】的形式;
  • 一步一调整,保证低阶资源储备,以供给高阶资源种植;
  • 使用
    quick_print(num_unlocked(Unlocks.解锁项目))
    quick_print(num_unlocked(Unlocks.解锁项目, n))
    来检查各种升级或进阶升级需要的材料,推荐参考:https://psteamcommunity.yuanyoumao.com/sharedfiles/filedetails/?id=3322422247&searchtext=cost
  • 使用
    if unlock(Unlocks.解锁项目): quick_print('解锁项目 ok')
    来确认解锁是否成功;
  • 优先升级农场大小和无人机速度,同时也要兼顾解锁各类植物的产量升级;
  • *尤其需要注意的是,解锁了肥料之后对初级胡萝卜施肥无法得到奇怪物质!因为奇怪物质产量是胡萝卜的二分之一,但初级胡萝卜只有一点产量,所以解锁后至少需要对胡萝卜升级一次;

  • 恐龙依然用哈密顿回路解即可;
  • 迷宫尽可能使用BFS跑300层,也可以边走跑单层(比较慢)or攒一部分钱解锁多无人机暴力破解;




  • 如果实在跑不通,这里是一座能跑通的屎山:真的要看吗?真的真的吗?
    好吧!但是看吐了是你自己的问题哦!谁让你要看的!
    https://github.com/kaikisen/the-art-of-shift-mountain

⊡Outro
写完了!完全胜利!!!

如果有朋友有更好更neat的实现方法/代码也欢迎在评论区分享哦!
12 条留言
柒音繞弦 10 月 24 日 上午 9:00 
我在discord上看到了一种无人机内数据共享的方法。

def commonRet():
shared_variable = []
return shared_variable
shared_drone = spawn_drone(commonRet)

shared_variable = wait_for(shared_drone)
kaikisen  [作者] 10 月 19 日 下午 11:27 
@Holoooooooooooooooo! 那很坏了!
我去dc上看了一下目前这样几个说法:
1.全逆序排列后需要收割一下来trigger成就解锁;
2.早期版本作者说确实没考虑到相同生长值绿仙人掌的情况(但现在大概率修复了?);
3.最近的消息3x3和32x32都有人成功解锁的;
4.另一个应该是bug的触发方法是在(0,0)种一颗仙人掌然后反复播种收割可以直接解锁(?)
Holoooooooooooooooo! 10 月 19 日 下午 9:05 
@kaikisen 不是的,实测3x3每一个的measure都不同且全是棕色的,一样触发不了成就
kaikisen  [作者] 10 月 19 日 上午 2:40 
@Holoooooooooooooooo! 我猜测可能是有绿色仙人掌就不行?所以即使全地块反向排布了但局部出现了生长值相等的情况也会判定“排序成功”了;而缩小地块更不容易刷出相同生长值的仙人掌应该就容易完成全逆排布(全褐色仙人掌)一些。
Holoooooooooooooooo! 10 月 19 日 上午 2:26 
@kaikisen 诶?我这边能看到自己的评论,是内容被隐藏了吗?
主要就是吐槽了一下那个仙人掌反向的成就,看起来对地块大小也有一定要求,不是很理解具体判定标准
TBGN 10 月 19 日 上午 2:09 
好像不但库用不了,很多标准的语法糖也没有
想初始化一个list结果
a = [0] * get_world_size()

a = [ 0 for _ in range(get_world_size())]
都不行......
kaikisen  [作者] 10 月 19 日 上午 1:16 
@Holoooooooooooooooo! 评论被隐藏了——
kaikisen  [作者] 10 月 19 日 上午 1:04 
@TBGN 不太行哦,除非import的库里用的语法全在__builtins__.py定义之内:ccskull:
TBGN 10 月 19 日 上午 12:41 
这游戏能用外部的库吗?比如感觉太阳花就很适合用个heap来存储,想import collections
Holoooooooooooooooo! 10 月 18 日 下午 9:56 
此留言正在等待我们的自动内容检查系统分析。在我们证实其内容无害之前(例如试图窃取信息的钓鱼站点链接),留言将暂时隐藏。