前几天在论坛翻到一个帖子,有人一口气贴了十来个 GPT-6 Astra 生成的游戏和网页链接:无限庭院、超级马里奥、Web 三国、植物大战僵尸、小丑牌、CS 沙漠二地图、RB19 交互仿真……我挨个点开,说实话有点被惊到,很多是整页可玩的单文件,画面和交互都在线。
然后我干了件蠢事:想把其中几个存下来自己也玩玩,还想改改分享给朋友。结果一看地址栏就乐了——有的挂在 chatgpt.site 的子域,有的在 workers.dev,有的是 github.io,还有 page.gd、netlify.app,一个游戏一个门牌号,全散着。
我本以为这波 AI 生成游戏的难点是「能不能写出好玩的东西」,折腾一圈才发现,真正卡住普通人的根本不是好不好玩,而是三件特别不起眼的事:跑起来看一眼、有个能长期存活的地址、以及想加个分数榜时突然就不会了。
AI 现在真能一口气吐出能玩的单文件
先说个反常识的判断:写游戏这件事,门槛已经塌了一大半。
那个帖子里的链接不是 demo 截图,是打开就能玩的成品页面。这意味着一个不懂前端的人,靠一句话描述也能让模型生成一个 index.html,里面 HTML、CSS、JS 全塞在一个文件里,双击就跑。
这类「单文件应用」特别适合小游戏、小工具、可视化实验。
当然模型也不是万能的。同一批帖子里就有人吐槽 Astra 处理 CSS 反而不如上一代顺手,比如 iframe 自适应高度那种老大难,模型转了半天一直很自信地改 CSS,最后还是人自己查资料解决的。
所以我的态度是:生成初稿交给 AI,但你得有个能立刻验证的地方,不然它说「改好了」你也不知道到底好没好。
这就引出第一个卡点。
卡点一:本地双击能跑,但你没法「随手」验证
单文件最舒服的地方是不用装环境,最难受的地方也在这。
模型给你一坨代码,你要么新建个 .html 双击打开,要么在编辑器里配个 live server。真到手机上看、发给别人看,就得先想办法把文件传出去。
改一版看一眼、再改一版再看一眼这种高频循环,摩擦特别大。
我后来的做法是把这一步彻底简化:把模型输出的整段单文件直接丢进HTML在线运行里点一下,画面就出来了,改完刷新就能对比。它解决的不是「能不能跑」,而是「验证够不够快」——AI 写代码本来就是试错游戏,验证越快,你敢让它折腾的次数就越多。
卡点二:临时地址随时会没,分享等于埋雷
这才是我真正想吐槽的。
你把一个 chatgpt.site 或 workers.dev 的链接发群里,当下能开,不代表下周还能开。这些地址很多是生成时顺手带出来的临时门牌,会话没了、额度变了、平台策略调整了,链接就可能失效。
你发出去的东西,别人第二天点开是一片空白,挺尴尬的。
更别提这些地址还散在一堆不同域名下,你自己都记不住哪个游戏在哪儿。
我的解法很直接:验证 OK 的单文件,用Web应用托管换一个固定、可长期访问的地址,几个游戏收拢在一处,分享的时候心里有底。地址稳定这件事看着小,但它是「一次生成」和「能拿出去给人看」之间的那道坎。
纯静态的单文件页面到这一步就基本齐活了,不需要任何后端。
卡点三:想加个分数榜,这里才是真正的分水岭
前面两步都是纯前端能搞定的。真正让人卡住、也最容易踩坑的,是「我想给这个游戏加个分数记录」。
这里必须把话说清楚,因为很多人是在这一步稀里糊涂上了不该上的复杂度。分数记录分两种,成本天差地别:
第一种是「只记我自己的最高分」。这个根本不用后端,浏览器的 localStorage 就够了,模型加十几行 JS 就能把最高分存在本地,刷新不丢。
纯静态托管完全 hold 得住,别给自己加戏。
第二种是「所有玩家共用一个排行榜」。这就不是前端能自己解决的了——你需要一个地方接收分数、存下来、再读出来给所有人看。
纯静态页面没有服务端,做不到多人共享。这一步是静态和「需要后端」的真正边界。
为什么这道边界值得单独拎出来讲?因为「服务端数据」和「客户端数据」不一致,是会真出问题的。
我在另一个帖子里看到一个特别典型的案例:有人给自己的 Web 游戏做性能优化,最后定位到的根因是服务端缓存的游戏数据和客户端首次生成的数据对不上,导致页面上一百七十个格子被整个重新渲染,Lighthouse 分数一度只有 79(这些数字来自作者自述,具体环境待核实)。这个坑说明什么?
一旦你引入服务端状态,前后端数据谁说了算、什么时候同步,就变成一个必须认真设计的问题,不再是「加个功能」那么轻巧。
那个共享排行榜,具体怎么补上去
如果确认要做多人排行榜,我会这么拆,尽量少动原来的游戏代码:
游戏本体基本不改,还是那个单文件。只在游戏结束时多做一件事:把玩家名和分数用一个 HTTP 请求提交出去;打开排行榜时再拉一次列表。
前端改动很小,核心工作量转移到「有个能收请求、能存数据的后端」。
后端这块,我的做法是用 API Endpoint Hosting 起一个提交分数和读取排行榜的接口,数据落在 SQLite 里——一张表,字段无非是玩家、分数、时间。调试的时候直接用SQLite编辑器打开分数表看一眼,谁提交了、数值对不对,一目了然,比盲猜接口返回舒服太多。
这里要提醒一句安全的事:只要接口能接收分数,就一定有人会伪造请求刷榜。纯前端提交的分数天然不可信,最起码得在服务端做基本校验,别把「客户端说多少就是多少」直接写库。
这一层不做,排行榜迟早变成一堆离谱高分。
一个可以今天就试的小动作
如果你手上正好有个 AI 生成的单文件游戏,别急着做排行榜,先按这个顺序走一遍:把代码丢进在线运行里确认能玩 → 托管成一个固定地址发给一个朋友,看他第二天还能不能打开 → 真有多人玩起来了,再决定要不要上后端和数据库。
绝大多数「一句话生成」的小游戏,卡在的不是第三步,而是压根没走完第二步就散在各处失效了。先把「能长期分享」这件最便宜的事做扎实,比一上来就纠结分数榜实在得多。