网易首页 > 网易号 > 正文 申请入驻

35kB塞进8款经典游戏,一个浏览器街机厅的实现记录

0
分享至

打开一个网页,不用安装,不用注册,八款经典游戏就在那里等着你。贪吃蛇、俄罗斯方块、打砖块、Flappy、2048、扫雷、数独、五子棋,它们共用同一套街机柜界面,键盘和触屏都能玩。

整个项目用纯 TypeScript 和 Canvas 2D 写成,零运行时依赖,构建产物压缩后大约 35 kB(不含字体)。配套 269 个单元测试28 个 Playwright 端到端测试,全部跑在 CI 里,MIT 协议开源。


作者把实现里值得写下来的部分整理了出来。

一个机柜,八款游戏

八款游戏共享同一个外壳:顶栏、屏幕区、结果浮层、按键提示条。每款游戏只实现一个接口,然后拿到一个 GameContext,里面是它被允许使用的一切——音效、存储、输入服务、结果浮层、屏幕上方和侧边的 DOM 插槽、触控板插槽、提示设置。

要弹出一张结果卡片,游戏只需要调用一次,外壳负责绘制。这样做的好处很直接:结果卡片、暂停、静音、返回大厅,在八款游戏里长得一样、行为也一样,而每款游戏的代码只管自己的规则。加第九款游戏,不用动外壳。

规则和渲染从不混在一起

每款游戏围绕 logic.ts 和 index.ts 构建,五子棋还多一个 AI 模块和一个 Worker。logic.ts 只管状态和规则:没有 DOM,没有 Canvas,随机源也作为参数传进来。index.ts 负责把状态画出来,把输入转成规则调用。

以 2048 为例,合并一行就是一个普通函数:把非零方块滤出来,相邻相同就翻倍并计分,跳过后一个方块,最后补零到长度 4。它的测试只断言输入和输出,在 Node 里就能跑,不需要浏览器。

这种拆分在项目进行到一半时证明了自己的价值。当时做了一次完整的视觉重设计,从暗色霓虹换成现在的暖纸质感。改动落在渲染代码、共享外壳和样式表上,八个 logic.ts 文件和它们的测试一行都没动。一条命令就能确认:对 logic.ts 和对应测试文件做 diff,结果必须是空的。

棋盘画在 Canvas,控件用真按钮

网格、方块和精灵是画出来的,棋盘本身在 Canvas 上接收点击。但辅助控件——数字键盘、难度菜单、撤销键——都是真正的 button 元素。

理由很实际:真按钮自带焦点环、键盘访问和容易调整大小的触控目标。画在 Canvas 上的按钮,这些都得手写,而且怎么写都不如原生。外壳提供三个 DOM 插槽,屏幕上方、屏幕侧边、屏幕下方的触控板,游戏声明自己需要哪些,外壳就把容器交过去。

五子棋 AI 跑在 Web Worker 里

五子棋 AI 用的是带 alpha-beta 剪枝的极小化极大算法,三个难度对应搜索深度 1、2、4。深度 4 放在主线程会冻住界面,所以搜索放进 Worker 执行。

把搜索挪到线程外,还剩一个问题:玩家可能在 AI 思考时重开一局,旧任务的答案不能落到新棋盘上。每次重开都会让 token 自增,Worker 的回复带着发送时的 token,主线程拿它和当前对局比对,一致才采用这步棋。这是丢弃过期结果,不是取消旧搜索。保留 Worker、忽略过期回复,省掉了取消再重建的逻辑,代价是旧搜索仍在消耗 CPU,可能拖慢下一次请求。

体积和首屏是两件事

不用 UI 框架、不用游戏引擎,意味着要发的运行时代码很少:整个构建压缩后约 35 kB,不含字体。首屏加载是另一回事:八款游戏通过动态 import() 按需加载。大厅只加载外壳和路由,打开某款游戏时才去取它的模块。

代码分割主要减少的是首屏加载,它本身并不会让总构建体积变小。唯一的第三方请求是 Google Fonts。没有后端,分数存在 localStorage 里。

和 AI 一起写代码

架构和大部分代码是和 Claude Code 一起写的。每一轮工作都从一份简短的设计说明开始,记录范围、取舍,以及结果和设计稿不一致的地方,这些说明放在仓库的 docs/design/ 目录里。踩过的坑收集在 CLAUDE.md 里,比如"CSS 的 inset 阴影盖不住 canvas"、"绝不要自动聚焦结果浮层的按钮"。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
西贝被曝将彻底倒闭:贾国龙将揽下绝大部分债务,放弃股份

西贝被曝将彻底倒闭:贾国龙将揽下绝大部分债务,放弃股份

DoNews
2026-09-19 15:08:08
普京亲自出席签约,俄航订购90架,国产客机真争气了

普京亲自出席签约,俄航订购90架,国产客机真争气了

止戈军是我
2026-09-19 13:31:29
因为调休,这个中秋假期,等于没放假

因为调休,这个中秋假期,等于没放假

News脑洞
2026-09-19 18:05:23
32岁女子“肉偿”300万债务,2022年33个男子接受服务后,多名男子举报她

32岁女子“肉偿”300万债务,2022年33个男子接受服务后,多名男子举报她

汉史趣闻
2026-09-19 10:57:18
匪夷所思啊!上海龙华寺捐200元,账单标注“消费”而非捐赠,账单收单机构竟是深圳建行,一张账单引发全网热议

匪夷所思啊!上海龙华寺捐200元,账单标注“消费”而非捐赠,账单收单机构竟是深圳建行,一张账单引发全网热议

火山詩话
2026-09-19 11:46:25
华为撒手,问界崩了?60,万落地,23,万没人收,二手车商都慌了

华为撒手,问界崩了?60,万落地,23,万没人收,二手车商都慌了

王投吃吃喝喝
2026-09-18 19:17:08
住建部:支持个体工商户、非全日制从业人员以及其他灵活就业人员自愿缴存住房公积金

住建部:支持个体工商户、非全日制从业人员以及其他灵活就业人员自愿缴存住房公积金

每日经济新闻
2026-09-18 13:46:03
2-3!热刺5轮不胜仅2分 夏窗花3.5亿镑签10人 仍创近18年最差开局

2-3!热刺5轮不胜仅2分 夏窗花3.5亿镑签10人 仍创近18年最差开局

我爱英超
2026-09-19 21:41:24
2岁男童坠亡后续,爷爷送别表情反常,3大疑点曝光,邻居曝更多

2岁男童坠亡后续,爷爷送别表情反常,3大疑点曝光,邻居曝更多

社会日日鲜
2026-09-19 11:06:12
1-2,亚冠精英赛冠军不敌非洲劲旅,止步洲际杯附加赛

1-2,亚冠精英赛冠军不敌非洲劲旅,止步洲际杯附加赛

侧身凌空斩
2026-09-19 23:03:49
会谈形成12项共识,统一台湾方案有了重大进展,岛内无人受邀参会

会谈形成12项共识,统一台湾方案有了重大进展,岛内无人受邀参会

兵卒史
2026-09-19 03:02:31
住集装箱、男女混住、机场干等6小时?别再骂亚运会日本主办方了,真没故意坑外国选手

住集装箱、男女混住、机场干等6小时?别再骂亚运会日本主办方了,真没故意坑外国选手

可达鸭面面观
2026-09-18 13:22:17
凌晨一点的北京家属院里,72岁的濮存昕用一根绳子,将自己与94岁患阿尔茨海默症的母亲紧紧系在一起

凌晨一点的北京家属院里,72岁的濮存昕用一根绳子,将自己与94岁患阿尔茨海默症的母亲紧紧系在一起

笨鸟摘文
2026-09-19 21:35:47
亚运会尴尬频出!中国射击队因酒店太远放弃开幕式...泰国运动员吐槽吃不饱;韩国运动员发文“救救我们”

亚运会尴尬频出!中国射击队因酒店太远放弃开幕式...泰国运动员吐槽吃不饱;韩国运动员发文“救救我们”

新民周刊
2026-09-19 18:28:23
美国社保耗尽倒计时!养老金缩水22%!

美国社保耗尽倒计时!养老金缩水22%!

保瓶儿
2026-09-17 23:17:10
美国、丹麦和格陵兰岛达成安全协议

美国、丹麦和格陵兰岛达成安全协议

新华社
2026-09-19 13:32:07
985大学退学率出炉!复旦大学总人数最多,国防科大退学率最高

985大学退学率出炉!复旦大学总人数最多,国防科大退学率最高

史海流年号
2026-09-18 22:47:35
国乒冰火两重天:周启豪3-2掀翻世界冠军,孙颖莎师妹1-3输日乒削球!王艺迪混双冲冠

国乒冰火两重天:周启豪3-2掀翻世界冠军,孙颖莎师妹1-3输日乒削球!王艺迪混双冲冠

好乒乓
2026-09-19 22:20:57
这么离谱?美媒:F-35零部件被转运至香港后丢失,中国可能获取关键技术

这么离谱?美媒:F-35零部件被转运至香港后丢失,中国可能获取关键技术

爱迷彩的老虎
2026-09-19 10:22:22
震惊!协和诊室泼粪事件,聊天记录流出,更多细节披露,涉事患者被曝出也是医生

震惊!协和诊室泼粪事件,聊天记录流出,更多细节披露,涉事患者被曝出也是医生

火山詩话
2026-09-19 05:46:22
2026-09-20 04:07:00
闪存猎手
闪存猎手
全网蹲好价的野生捕手,算力与羊毛都不可辜负。
196文章数 73关注度
往期回顾 全部

科技要闻

要走650亿,智谱的理想越来越贵

头条要闻

厨师被指在餐馆扎血测艾滋病 老板:有关部门已介入

头条要闻

厨师被指在餐馆扎血测艾滋病 老板:有关部门已介入

体育要闻

2026亚运会开幕式 胡明轩吴愉担任旗手

娱乐要闻

甜度爆表!许嵩冯禧晒婚纱照官宣结婚

财经要闻

江西首富破产:一张927万商票压垮千亿帝国

汽车要闻

大块头的从容 红旗G919如何兼顾豪华与越野能力

态度原创

亲子
家居
数码
公开课
军事航空

亲子要闻

从“世界高品质”到“透明真安心”,好奇诠释48年品质坚守

家居要闻

2026建博会(广州) 公装联探展交流活动

数码要闻

三星又罢工了!这次堵到李在镕家门口:内存芯片又要涨价了

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

特朗普再称对伊朗战争将很快结束

无障碍浏览 进入关怀版