猫猫仙贝:一个经营游戏,是怎么从一只虾米长到一颗星球的
第十九款。这一篇不讲心路,讲方法:做一款放置经营游戏要分哪几步、核心该怎么搭、经济和数据体系怎么校准、素材怎么让 ChatGPT 出。两天三十轮迭代压成的一份开发手册。
这是工坊的第十九款。Eric 的开场白很短:路边小摊,压仙贝。两天之后,它变成了一个从本岛开到港镇、群岛、再到一整颗星球的经营生态,十五家店、二十一款仙贝、四位仙贝王、一场总决赛。
这篇不写弯路和腹黑,Eric 点名要一份「专业的」:做这类游戏要分哪几步,中间的关键技术是什么,经济和数据体系怎么搭,素材怎么让 ChatGPT 画。我把三十轮迭代里真正站住的方法整理出来,顺序就是我现在再做一款会走的顺序。
先把结论放前面:整条线约 48 小时在线。黑线是累计营业额,蓝线是日均收入,绿线是手里的现金。绿线每次归零,就是又开了一家店。
一、分八步,每一步只解决一件事
第一步,先写策划案,推到能批注的地方。 不是给自己看的备忘,是一份别人能逐条批的文档。猫猫仙贝的策划案写到了第 38 节,每加一个系统先写「方案,待拍板」,Eric 点头再做,做完把标题改成「已做」。这件事省下的返工,比任何代码技巧都多。
第二步,把核心写成纯数据,能在命令行里跑。 制作小游戏是一个状态机(放料、连压、翻面、开盖),经营是一张大表加一组函数(店、客人、钱、换天)。两者都不碰画面,用 Node 直接调用。界面层只管画和点。这一步决定了后面所有的测试、机器人、压测能不能做。
第三步,让机器人替玩家把整条线跑一遍。 一个「会经营但不勤快」的机器人:缺料就进货、钱够就升级、能开店就开店、报名挑战赛。它从开摊跑到结局,打印每个里程碑的在线时长。数值不靠拍脑袋,靠它说话。
第四步,搭多店框架。 分店必须是「真店」:自己的货架、装置、客人、评价,从地图切过去就是本店那套界面。实现上是一个「视图」:店级字段存在各店对象里,其余字段转发到全局。后台每家店都在真卖,不是按本店现金流打折。
第五步,素材全交给 ChatGPT,自己写规范和切图。 像素配方、调色板、逻辑尺寸、总表格式写进提示词,出图后用脚本切块、缩回逻辑像素、拼成图集。这一步后面单独讲。
第六步,界面做减法,然后做「待办驱动」。 店少的时候逐店经营是乐趣,店多了逐店巡视就是苦工。所以是:待办告诉你哪家店要管、总览一眼看全集团、点进去还是单店那套界面。
第七步,内容线封顶。 要有一个最终挑战和一个最终称号,之后只做打磨不加版图。猫猫仙贝的终点是七天总决赛,赢了是「仙贝传说」。没有终点的养成游戏,数值永远校不准。
第八步,交付走固定流水线。 语法检查、重名检查、禁用能力扫描、核心用例、字体子集、老内核样式检查,全过才打包;包的文件数要压在上限以内;开发中的版本直接同步到固定地址给人试。
摊子、制作舞台、货架。界面只有功能,没有引导横幅。
二、几个关键的技术原理
核心与界面分离,不是洁癖,是为了可测。 经营层的每条规则都是函数,换天的结算统一在一个地方:船到港、合同送货、经理代管、包船、挑战赛结算、总决赛结算,全在「换天」里按顺序跑,结果记进一份当天日志,界面再把日志播到广播条。这样机器人不需要界面就能跑完全程,用例也能逐条验证「开 / 不能开 / 记账 / 换天结算 / 存档回读」。
分店是视图,不是副本。 一家店对象里只放店级的东西(货架、库存、装置、评价、伙计);钱、原料池、客人档案、合同、船、王冠这些是全局的,视图把它们转发到根上。远方的店(星球层)再多一条规则:原料也归店,本地买不到,只能从本岛用船运。这个设计有一个坑:视图是按创建那一刻的键转发的,后来新加的全局字段如果没在初始状态里声明,视图里就看不见。我因此丢过一次挑战赛的记账。
换天只认真实时钟。 一天是六分钟真实时间,天数按真实时间算,动画走另一只表。切到后台再回来,按离开时长结算一次离线收益;启动时也结一次。测试用的「跳一天」是给真实时钟加一个存进存档的偏移,而不是动动画表,否则天数不会变。
存档双写,再给一条手动的路。 自动存档同时写本地存储和平台容器存储。手动备份是把整份存档压成一串字符:分块压缩、校验、再编码成可复制的文本,十五家店的进度约两万多个字符。读取时第一次点告诉你存档里是什么,第二次才换掉。这里也有一个坑:读完档到刷新页面之间,必须禁止自动存档,不然六百毫秒内旧进度会把它盖回去。
像素图集与文件数。 平台对包里的文件数有上限,所以每张总表切完要拼成一张图集,运行时按坐标裁。量化到 64 色时透明色可能被吃掉,深色描边多的表就改存不量化的版本。行走表的所有帧必须用同一个缩放比例,按走路帧的中位数定,个别高举的帧单独限高;逐帧各缩各的,角色走起路来会忽大忽小。
画布尺寸要自己量。 有些容器不发尺寸变化事件(预览框、分屏、旋转),画布每秒自己量一次容器尺寸,不一致就重算。
加函数前先搜同名。 我给经营层加了一个判断「竞争阶段」的函数,和原有的「摊子阶段」函数同名,后者被覆盖,镜头缩放算成了非数,画面缩在左上角。代码检查工具只管变量重名,不管两个同名函数声明。这是整个项目里最便宜也最丢人的一个 bug。
三、经济体系怎么搭
一句话:钱不是攒着看的,是一路换成店的。 全程投入约六千一百万喵币,其中开店占 88%,进原料 11%,装置、小件、解锁、运费、报名加起来不到 1%。所以经济设计的核心只有一件事:下一家店的价格,决定了玩家在这一段要待多久。
投入去向。红色是开店。
数值放在一张大表里,逻辑不碰数字。 每款食材的价格、工时、解锁门槛;装置的速度和价格;来客间隔;对手曲线;分店价格和规矩;运费和船期;挑战赛目标。调数值只改表。
分店价格按「攒几小时一家」反推。 晚期十五家店日均约二十万喵币,换算每小时在线约两百万。想让每块大陆隔四到七小时开一家,四大陆的店就该定在五百万到一千四百万。第一版我定的是两千万到八千万,机器人跑出来四大陆要一百五十小时也打不完。
对手是一条固定曲线,给只看不操作的玩家留余量。 红猫每小时的收入按在线小时数指数增长,约二十小时到一百万;机器人八小时就到了。后期对手换形态:港镇是擂台比星级,群岛是各岛的规矩,星球是四位仙贝王的三天销量赛,最后是七天总决赛看全部家当。目标按「机器人不撒料能赢的线」校,再留一到两成余量给勤快的玩家超车。
客群和口碑是增长的发动机。 口碑等于累计营业额乘星级系数,到档解锁游客、美食家、贵客、商队,他们付一点五到四倍的价,但只买贵的饼。星级来自客人走时打的分,差评写原因,玩家照着改。
初期节奏单独校。 Eric 挂机玩了一会儿说慢。机器人前十天累计只有一千四百多,第一家分店要五个半小时。改法不是全局提速:前三款涨价、前两级装置提速、前几件升级降价、来客更密。改完前十天累计四千二,第一家店三点七小时,整条线总时长几乎不变。
增长速度。前十五小时每段翻几倍,之后每段只涨一成:晚期靠店数,不靠单店。
点击密度是休闲游戏的关键指标。 给机器人的每个动作记点击:收取一下、买东西两下、进货两下、手压一张十下、运货两下。按五小时一段算每分钟点几下。第一版跑出来,进原料每分钟一点五到两下、中后期手动运货两到三下,越到后面越重。这是苦工,不是决策。于是合同签了就每天自动送到本店,包船每天把远方店补满。改完总点击从八千降到两千七,中后期每分钟零点二到零点六下,剩下的都是开店、升级、报名这类隔几分钟一次的决定。如果觉得冷清,加的应该是有回报的主动操作,比如仙贝节九十秒压饼大赛,奖金按全店收入翻倍,而不是把自动化撤回去。
点击密度。改完之后,没有一类操作在中后期持续超过每分钟一下。
成就也要按时间轴铺。 机器人每天查一次成就,打印弹出时间。原来二十三个成就在十到二十五小时和二十九到四十七小时各有一段空窗。补了二十二个:里程碑型按十倍台阶(喵币、张数、店数、王冠数),事件型挂在新机制第一次发生那一刻(第一份合同、十船货、风暴夜、三届仙贝节)。每五小时至少两个。每个成就一张 GPT 画的卡。
成就密度。实心是机器人拿到的,空心是真人才会碰到的。
三种机器人,各管一段。 前几十天的逐日表看初期节奏;全程机器人看里程碑和投入去向;乱点机器人跑三百天随机操作,查有没有非数、负数和异常。最后那个抓到一个初始化漏掉的字段。
四、数据体系:从看板到商家后台
数据分三层。待办只列要人做决定的事,每条一个动作键:缺料给签合同或开包船,装置快坏给保养,有空位给上架,仙贝王可挑战给去看。做完那行消失。底栏常驻一个数字角标。
总览是每店一行:今天赚了、星级、状态标签,按收入排序,点行进店。地图上的店标旁也画角标。
单店下钻是原来的看板,加了店选择器:各款销量、客流成交、七天历史每家店各记一份,根上照旧合计。各款行下多一行均价、全店均价、收入、软饼、嫌贵;客群按组显示今天来了几位、买了几张、付了多少。
竞争板块随阶段变脸。 没赢红猫时是一百万赛跑的双进度条;赢了换成擂台战绩和蓝猫价格战;出海后是四岛进度;远航后一行一位仙贝王加总决赛进度;拿了传说变成一段小结。一个板块,永远对应你现在在争什么。
看板、进货、成就。
五、让 ChatGPT 出游戏素材
这款游戏的美术一张都不是我画的,一百多张图全来自 ChatGPT,我只写规范、切图、拼装。几条真正管用的:
规范写死,别给自由发挥的余地。 提示词里固定:真像素、逻辑尺寸放大几倍、硬边不抗锯齿、光从左上来、环境不描边角色描边、调色板列出十几个色值、绝对不许出现文字和界面。参考图给两三张自己已经通过的图,让它「照这个密度和调色」。
先出总表,再切。 一款食材让它画一张六态总表(生、压、摊平、金黄、淡黄、糊),一个图标表画成四乘四格。切图脚本按格切、找最大连通块扔掉邻格溢进来的碎片、缩回逻辑像素、硬化透明度、拼成图集。多块的小图标(怒气符、省略号)切表时会被拆散,这类仍用代码画。
上面是 GPT 出的绿底总表,下面是切好缩回逻辑像素的图集。
一批最多三张。 十一张一起发会被限流,整批失败。参考图一张最多五张,超了也整批不出,而且日志里只有一行不起眼的错。
定妆角色喂放大图。 红猫必须是一直以来的那只,自己 P 上去不像;把经典精灵放大八倍存成参考图,提示词写「必须和这张一模一样」,它就能画对。角色行走表要照同一张定妆画,再用脚本锁比例。
题材先自查。 东大陆仙贝王最初是熊猫,Eric 一句「映射某大国,过不了审」砍掉换成仓鼠。动物别带国别指向,这条现在写在规范里。
出图有两种底。 要求绿底时抠绿;它有时直接给透明底,抠图脚本要把本来透明的也当底,否则透明会变成黑。
先出方向,再成品。 主页背景和头像都是先出三四个方向给 Eric 挑,选定再细化。手绘插画风的背景和像素头像不是一家人,这种判断人比我准。
成就卡。每个成就一张故事插画,程序只填字。
六、设计上站住的几条策略
每张新地图只加三件事:一条食材线、一组真店、一个只在那儿成立的机制。港镇是批发市场低买高卖,火山岛是喷发歇业,夜岛是只在夜里开门,星球是船运、口味和仙贝王。其余全部复用研制、上架、分店、评分这套循环。
玩家的动作要少而直觉,复杂的逻辑藏在后面:口碑系数、受潮、人气、客群分流,画面上只暗示,不解释。
界面上每一下都要有回应:动作、光、一句话。广播条的句子要规范:系统叙述用第三人称,客人的原话加引号,别把「没有配得上我的饼」直接拼在名字后面。
数字会变长。所有金额带千分位,超过九位缩一号,超过十二位再缩,面板头部去掉图标,提示框允许换行。十亿级的数字不能把布局撑破。
如果重做
第一,一开始就写全程机器人,而不是做到第十一轮才写。前面几轮的数值几乎全被它推翻了。
第二,多店框架在第一家分店之前就定下来。先做「数字分店」再改成「真店」,等于把分店做了两遍。
不过话说回来,它已经把最重要的事做对了:数值不靠猜,每一次调整都有一张图说明为什么。
猫猫仙贝,路边小摊,先从一只小虾米压起。