朋友的Game Boy Color被偷了。挺气人的。他转头去找替代品,结果发现成色过得去的二手机要么难找,要么贵得离谱,要么标着"全新成色"——那种"全新"你懂的,全新地骗你。

于是他动手做了一台偷不走的:跑在浏览器里的Game Boy Color。青绿色外壳,方向键按下去有清脆的咔哒声,能玩真正的Game Boy游戏。

打开网易新闻 查看精彩图片

最妙的地方在于,他不用在ROM列表里翻来翻去。他只需要说出自己想玩什么。

一句话,游戏自己跳出来

比如输入"我想玩一个跟宝可梦有关的游戏"。一个小型AI读懂这句话,从游戏库里挑出一款,然后直接启动。他可以打字,也可以点麦克风直接说出口。有点像游戏店里那个懂行的店员,只不过这位店员住在掌机里面。

整个项目的技术栈并不复杂。模拟器部分用的是编译成WebAssembly的mGBA核心,搭在Vite加TypeScript的项目里,ROM直接从public/gameroms目录读取,连打包在ZIP文件里的也能识别。

操作方式给了好几套:键盘上的Z、X、回车和Shift,屏幕上虚拟按键的触控,以及手柄支持。想怎么玩都行。

AI选游戏这件事,被拆得很小

负责挑游戏的是Gemma 3(4B),通过Ollama在本地运行。当玩家提出请求时,应用会把这句话连同可用游戏列表一起发过去,Gemma挑出最匹配的那款,模拟器随即加载。

语音部分用的是浏览器自带的语音识别,不是AI模型,但效果上让整套体验显得很神奇——说完话自动提交,不用再按什么按钮。

当然也留了后路。如果他已经想好要玩哪款,"Choose a game instead"会打开一个普通列表,老老实实按名字选。

提示词本身很简单:告诉它玩家想要什么,给出游戏列表,让它挑一个。游戏列表就是一个文件(src/games.ts),所以加一款游戏意味着往文件夹里丢一个ROM,再把名字加进去。

为什么不用云端大模型

这个项目需要的AI只干一件小事:把一种感觉匹配到一个文件名。云端大模型属于杀鸡用牛刀,而调用云端API反而会在几个方面让事情变糟。

  • 不花钱。没有API密钥,没有按次计费,也不会在有人正想玩宝可梦的时候弹出"你已达到使用上限"。作为送给朋友的礼物,这一点很重要。
  • 本地运行。他的请求不会离开这台机器。没人需要知道他凌晨两点在玩什么。
  • 可以替换。Gemma 3 4B足够小、足够快。如果换个模型挑得更准,改一行就行。
  • 不会突然失效。没有弃用通知邮件,没有定价变动,没有意外宕机。模型就在硬盘上,一直在那儿。

结果证明,一个4B的开源模型跑在普通机器上,做这件事绰绰有余。它完成了任务,不需要任何人的许可,也不需要一张信用卡。

这个项目参加了Hacktoberfest的周末挑战,主题是"为朋友而做"。它同时也报名了"最佳Gemma应用"类别——毕竟那个用自然语言挑游戏的功能,靠的就是本地Ollama跑起来的Gemma 3(4B)。