用代码造一座会呼吸的小镇:像素小游戏实战

未来城市游戏场景

为什么是“会呼吸的小镇”

多数代码小游戏教程停留在贪吃蛇、扫雷、2048,练完手感却没有留下可延展的骨架。这次我们换一个题目:一座会自动生成、居民自行走动、昼夜交替的小镇。它没有输赢,却能让你同时练到程序化生成、有限状态机和渲染循环三件事。

第一层:小镇的地图从哪来

用噪声代替手绘

地图不必一张张画。给每个格子取一个伪随机值,再做简单的平滑处理,就能得到连片的草地、水域与道路。核心只有两步:为坐标生成稳定随机数,再对邻域求平均。这样同一组参数每次运行都得到同一座小镇,方便调试。

道路连接的取舍

最省事的做法是让居民沿格子四方向移动,水域不可通行。若想更自然,可先随机撒若干“建筑点”,再用最短路把它们串起来,道路便有了目的性。这一步会显著增加代码量,建议第一版先跳过。

第二层:居民为什么会“活着”

一个极简状态机

每个居民只需四个状态:闲逛、前往目标、停留、返回。每帧检查当前状态并决定下一步,切换条件写成表格式的 if 分支即可。状态少的好处是行为可预测,出问题时容易定位。

让随机看起来有意图

纯随机行走会显得呆滞。给居民加一个“记忆”:记录上次去过的建筑,短时间内不重复前往。再让停留时长服从一个偏态分布,多数时间短、少数时间长,观感立刻自然许多。

第三层:昼夜循环与呼吸感

用全局计时器推进一天,按时间段调整整体色调与居民速度。夜晚居民减少外出、路灯格子提亮,小镇就有了节奏。所谓“呼吸”,本质是让画面参数随时间轻微起伏,而不是静态贴图。

  • 调色:白天偏暖、黄昏偏橙、深夜偏蓝
  • 节奏:夜晚居民移动速度减半,停留概率提高
  • 点缀:随机闪烁的窗户灯光,成本极低但效果明显

常见坑与取舍

一是别一上来就做寻路,先让居民随机走通再优化;二是渲染与逻辑分离,逻辑固定步长更新,渲染按帧率绘制,避免高刷屏下行为变快;三是把参数集中成一个配置对象,调手感时不必翻遍代码。

FAQ

需要什么技术栈?

任意能画格子并跑循环的语言均可,浏览器里用 Canvas 最直接,无需框架。

大约多少代码量?

最小可运行版本约一百五十到两百行,加入道路连接后会翻倍。

还能往哪扩展?

居民之间的简单交互、建筑建造、存档读档,都是在这套骨架上自然长出来的方向。

相关文章