80后老借助 Codex + Claude 搓了个复古游戏联机模拟器:投币就能乱入
-
-
-

作为一个 80 后老登,外加 AI 爱好者,赶上 AI 这么热闹的年代,不亲手用 AI 捣鼓点小软件,总觉得有点不好意思。
所以不才,借助 AI(Codex + Claude)和开源项目 EmulatorJS,做了一款能联机的复古游戏模拟器。
为什么不用市面上现成的?因为试了一圈发现,现有的复古游戏模拟器在联机这件事上都差点意思:要么得折腾端口、核心版本、ROM 版本,叫朋友一起玩,光教他装好就劝退了一半。
所以这个项目就是冲着联机去的。我想要的感觉很简单:就像当年在街机厅,走到机台前投个币就能加入;又像小时候去玩伴家里,拿起第二个手柄就能一起玩。
服务器也可以自己部署,一条命令装好,让更多朋友一起回到 80、90 后独有的童年回忆里。
我本身不是程序员,代码基本是 AI 写的,我负责提需求、测试、挑毛病、做决定。现在做到了 1.3.0 版,发出来给大家看看,欢迎拍砖。
一句话介绍: 基于开源的 EmulatorJS,下载、双击就能玩 20 多个平台的老游戏,同一个 Wi-Fi 或者隔着互联网都能和朋友联机(最多 4 人,可以语音、观战、中途乱入)。Windows、Mac、安卓(手机、电视、Quest 3)都有。
- 下载(GitHub):https://github.com/supwang/emulatorjs-releases/releases/latest
- 国内下载(百度网盘,含Rom包):https://pan.baidu.com/s/13atBCqmTib1rGp_30279mQ?pwd=6akk 提取码
6akk - 服务器地址: https://couchvs.site:8765;房间密码:
iw4iwq5p(注册后即可广域网联机,不注册可以局域网联机)
注意:如果开着 VPN(Clash 等),请把联机服务器的域名和 IP 都加到直连(绕过代理)的规则里,只加一个可能会出现「能看到房间,但乱入后连不上 / 很卡」。开了 TUN(虚拟网卡)模式的,最好让 UDP 走直连,或者联机时先关掉 VPN。
以 Clash / Mihomo 为例(规则要放在靠前的位置):
- DOMAIN-SUFFIX,服务器域名,DIRECT - IP-CIDR,服务器IP/32,DIRECT,no-resolve- 完全免费,GPL-3.0 开源,源码就在上面的仓库里。不带任何游戏 ROM 和 BIOS,请用自己的备份。
一、长什么样
封面墙: 指定 ROM 文件夹(或者直接用 RetroArch 的文件夹),自动按平台分类。封面、标题画面、截图可以从 libretro 的封面库自动下载,鼠标停在封面上会轮播。

大屏模式(1.2.0 新增): 给电视和 Quest 准备的。手柄或遥控器左右选游戏,LB / RB 换机种,背景是选中游戏的模糊画面,下面显示 Logo、中文名、几人游戏、有没有人在玩。灵感来自卡普空的《清版动作合集》的选游戏界面。



自动边框(1.2.0 新增): 竖版街机游戏或者 4:3 的游戏在宽屏上,两边不再是黑边。左边放封面,右边放 Logo 和标题画面。也支持 The Bezel Project 那种中间透明的边框图,程序会自己找出透明区域,对准游戏画面。

二、联机:这是我最想要的部分
目标很简单:像在游戏厅一样,走过去投个币就加入。
- 大厅里能看到谁在玩什么,点「乱入」直接成为 2P / 3P / 4P,开局的人不用停、不用发邀请。街机游戏可以中途投币按开始。
- 同一个 Wi-Fi 下自动发现,什么都不用设置。
- 隔着互联网:通过一个联机服务器。服务器没有中心化的,谁都可以自己搭一个,一条命令装好,只有知道房间密码的人才能看到和加入。
- 语音聊天、观战、每个人的延迟显示、踢人、只允许注册玩家、锁房间不让人进。
- 可选账号系统:好友、战绩、排行榜,还有一个「擂台」模式,把你这局顶到大厅最前面,欢迎所有人来挑战。
继续上次的游戏(1.3.0 新增): 退出游戏时自动存一份进度(带一张画面截图),下次再点这个游戏,可以选「继续」或「新游戏」。
多人游戏的继续是我觉得最有意思的部分。即时存档里存的是整台游戏机的状态,2P 的角色也在里面,但没人操作它就只会站着不动。所以这里的做法是让上次一起玩的人能回来接手:
- 选「等朋友一起继续」:游戏停在存档那一帧,大厅里显示「在等谁回来」,朋友打开程序会收到邀请,点「乱入」就回到他原来的 1P / 2P,人齐了自动开始
- 也可以「一个人继续」:别人的角色先站着,之后谁乱入谁接手,原来的人优先回到自己的位置
- 联机时每台设备都各存一份,下次谁来开局都行



换位置(1.3.0 新增): FC、超任很多游戏只有 1P 能暂停、进菜单,2P 一个人继续时就卡住了。所以加了一个「
我是 P2 ⇄」,可以换成控制别的空位置;原来的 1P 回来时,自动换回去,不会两个人角色对调。




三、手机、电视、Quest
虚拟手柄: 每个机种做了自己的手柄造型,FC、超任、MD、PS1、N64、GBA、GB、街机摇杆台都有,按键颜色对应原机。竖屏时画面在上、手柄在下;横屏时手柄分到画面两边,不挡画面,大小还能按机种调。按下有动画,安卓上会轻微震动。接上实体手柄(Xbox 等)虚拟手柄自动隐藏。


手机给电视传游戏(1.2.0 新增): 电视上不好拷文件,所以程序启动后会显示一个内网地址和 4 位密码,用同一网络的手机或电脑浏览器打开,选文件就能把 ROM 和 BIOS 传进去,扩展名能认出来的自动放进对应机种的文件夹,传完列表自动刷新。思路学的是 RetroArch 的网页上传。

Quest 3: 装安卓 APK 就能跑,配个 Xbox 手柄,就能在巨幕上打街机。
四、技术上是怎么搭起来的(给感兴趣的朋友)
作为外行,我对技术细节的理解有限,以下是在和 AI 一起做的过程中弄明白的大致结构:
模拟核心: 用的是 EmulatorJS,它把 RetroArch 的 libretro 核心(FBNeo、FCEUmm、Snes9x、Genesis Plus GX、mGBA、PCSX ReARMed、Mupen64Plus 等)编译成 WebAssembly,在浏览器里跑。所以整个前端就是一个网页,各个平台共用同一套页面。
各平台的壳:
- Windows / Mac:Electron,自带一个本地小服务器读 ROM 文件夹
- 安卓:系统 WebView 显示页面,再用 nodejs-mobile 在手机里跑同一个 Node 服务器,电视读 U 盘也走这里
- 文件夹版:一个 Python 小服务器,双击
.bat/.command启动,用浏览器玩
联机:
- 走 WebRTC。主要用「按键同步」(lockstep):每台设备都跑同一个游戏,网上只传每一帧按了哪些键。主机当裁判,收齐所有人第 N 帧的按键再一起往下跑;每个人的按键延后几帧生效,给网络留时间。
- 每两秒左右核对一次游戏状态,万一对不上,主机把即时存档发过去重新对齐。
- 格斗游戏还有一个实验性的「回滚」模式,更跟手。
- 慢的设备(比如老手机)跟不上帧同步,可以切成「看画面玩」:不自己跑游戏,看主机串流过来的视频,只回传按键。手机开局、电脑乱入的时候,还能把游戏交给电脑跑,手机改成看画面。
- 继续多人游戏:退出时存一个即时存档,同时记下谁是几 P。等人回来时,主机先停在读档的那一帧,有人乱入照样把状态同步给他,大家停在同一帧,人齐了再一起往下跑;回来的人按账号、设备编号或名字认出来,分回原来的玩家号。
- 外网服务器是一个安装脚本:Python 写的大厅服务,加 coturn 做中继(严格 NAT 的家庭网络打不通时走中继),HTTPS 证书自动申请和续期。
发布: GitHub Actions 自动编译 Windows、Mac、安卓三个平台,安卓版会先在模拟器里跑一遍检查再发布。Windows 安装版支持自动更新。界面做了 10 种语言。
五、几点真实感受
- AI 写代码确实很强,但「测」和「判断」还得靠人。 很多问题只有真机才能发现:手机横屏时手柄挡画面、安卓系统手势条误触、遥控器在文件夹选择框里进不去子文件夹……都是我在设备上试出来,截图告诉 AI 去改。
- 需求要说具体,最好配图。 我做虚拟手柄时,是先拿截图圈出来哪里不对、要像哪种包边,AI 才能改到位。做大屏模式时,直接发了几张卡普空合集的截图当参考。
- 有些坑 AI 也只能告诉你「这条路走不通」。 比如我家的小米电视 6,系统 WebView 还是 2018 年的 66 版,而模拟核心需要 80 以上;这个 WebView 是小米系统签名的,不 root 没法升级。最后的结论是这台电视只能放弃,换别的盒子或者用 Quest。
- 有些问题要自己想到。 做「继续」功能时,AI 先做出来的是能存能读,测下来一切正常。是我想到:FC、超任很多游戏只有 1P 能进菜单,2P 一个人继续就卡住了。提出来以后,AI 才补了「换位置」。用的人是谁、怎么玩,这些得自己操心。
- 版权要注意。 程序不带任何 ROM 和 BIOS;虚拟手柄的图是原创的,没用任何游戏公司的美术素材;自动边框用的是 libretro 封面库里游戏本身的封面和标题画面。
六、怎么用(简版)
- 下载对应版本:Windows 推荐
EmulatorJS-Setup-1.2.0.exe(能自动更新);Mac 分 Apple 芯片和 Intel 两个 dmg;安卓装…-android.apk - 软件没买数字签名,第一次打开系统会拦:Windows 点「更多信息 → 仍要运行」,Mac 去「系统设置 → 隐私与安全性」点「仍要打开」
- 游戏放进「文档/EmulatorJS/roms」里,最好按平台分子文件夹(
nes、snes、gba、md、psx、fbneo等);街机 zip 不要解压、不要改名 - 需要 BIOS 的(PS1、Neo Geo、世嘉 CD)放进
system文件夹 - 点「↻ 重新读取」,左边选平台,点封面开玩

外网联机:在「
文件夹设置」里填联机服务器地址和房间密码。可以自己搭(租一台最便宜的 Ubuntu 云服务器,上传 ejs-cloud-setup.sh,运行sudo bash ejs-cloud-setup.sh,装完会显示地址和密码),填给一起玩的朋友就行。

另外还有 7 套配色主题,可以给每个机种换自己的背景图:

七、已知的限制
- N64、PSP、土星对设备性能要求比较高,老手机和电视盒子可能带不动
- 按键同步联机要求大家用同一个游戏文件
- 安卓电视的系统 WebView 要 80 版以上,太老的电视跑不了(程序会提示)
- 没有 iOS 版
欢迎大家试用、提意见:不同地区、不同网络下联机的延迟怎么样,手机上虚拟手柄的手感如何。有问题回帖或者到 GitHub 提 Issue 都可以。
在开发的闲暇之余,来上几把。
-
-
@YUN-WANG 想不到这里也有同好,第一时间下载!!
-
-
-
-
-
-
版主审定:本帖设为优秀,作者 +3 积分奖励,继续加油!