「中国式求职」开发日志 #4:地图系统的7次重构
凌晨三点半,桌上摆着吃了一半的辛拉面,耳机里单曲循环着「Old Memory」,屏幕上是我第七次重构的地图系统——跑出来的结果还是一坨。
我盯着那张地图看了大概十秒钟,然后把脸埋进手掌里。
蜘蛛丝
事情要从第一版说起。
那时候什么都不懂,想着”随机地图嘛,随机生成不就行了”。写了个很朴素的逻辑,每层随机几个节点,然后把上下层连起来。点了运行,满怀期待。
出来的东西——怎么说呢。连线像蜘蛛丝。
从最左边的节点拉一根线到最右边,两条线在半路交叉,三条线拧成麻花。整张地图看起来就像有只蜘蛛喝醉了在上面织网。
杀戮尖塔的地图多干净啊,线条从上往下,大致平行,偶尔分叉。我这个倒好,给你玩连连看。

越修越烂
当时的想法很天真:连线乱?加个规则。节点挤?再加一个。
跑出来全是战斗节点紧挨着,打完一场直接打下一场——好,加一条,连续战斗不能超过两次。结果有时候一层四个节点,下一层突然缩成两个,地图像被掐了腰——再加一条。然后又发现整个第一章一个商店都没刷出来——再加。
规则叠了十几条,代码已经变成了一坨if-else套if-else。我自己写的,一周后回头看都不认识了。
而且最要命的是——规则越多,生成越慢。有些随机种子直接卡在校验循环里出不来,像是地图生成器在跟我赌气。
第五版
具体到第几版的时候想通的我记不太清了,反正大概是第五版前后。
就是突然意识到——我一直在往随机生成上面打补丁,但地基本身就是歪的。你不能先随机再修补,得反过来。先把骨架定死,开局就是战斗,Boss前一定有休息站,这些位置不动。中间那几层才让它随机去。
这样不管种子怎么变,至少节奏感是稳的。
想通这个大概是第三天半夜。对着屏幕愣了一会儿,觉得之前全在瞎折腾。

蜘蛛丝终于散了
后面几版就是在新的思路上一条一条加规则,不过这次心里有底多了。
蜘蛛丝那个问题,解法意外地简单——每个节点只连向下一层距离最近的两个节点,入度不超过三。等于告诉每根线”你只能连隔壁的”,不许跨大半个屏幕去拉。
跑了一次,蜘蛛丝就没了。线条乖乖地从上往下走,偶尔分叉,不再打结。我当时都愣了一下,就这?
然后五连战斗的问题——加了个衰减,前一层出了战斗,下一层战斗的权重就降低,连续两层相同类型直接禁止。
战斗和非战斗的比例调了挺久的,最后稳定在战斗类55-65%、非战斗类35-45%,生成过程中实时追踪动态调整。同一层如果有三个以上节点,战斗和非战斗各至少一个。
还有一条是路线完整性——每条从头到尾的路径,必须至少有一个战斗、一个非战斗、一个商店、一个休息站。不管玩家走哪条路,不会出现”全程没商店”这种事。
最后数了数,六条规则。再多就慢了,再少体验还是差。这个数量没什么道理,就是试出来的。

几百个种子
规则定下来之后做了个很笨的事——拿不同的种子跑了几百张地图,一张一张肉眼看。
主要就盯连线交叉、节点分布、路线完整性这些,看有没有翻车的。
枯燥。但地图是玩家每局都要走的东西,要是这玩意儿有问题,后面做得再好都白搭。
跑到第两百多张的时候,我发现自己已经不会盯着某张地图皱眉了。连线很顺,节点分布舒服,偶尔有意外的路线组合——是那种好的意外。
那天应该是凌晨两点多。我截了张图发给自己,盯着看了一会儿。
就觉得——终于不丑了。
七个版本,前四个是弯路。不过没有前面那些翻车,第五版大概也想不出”先定骨架再随机”这个思路。
地图系统到这里算是能用了。不完美,以后肯定还会改。但至少蜘蛛丝没了。

你可能还想看