☰
5分钟在浏览器跑起三国杀:开源桌游引擎从入门到DIY指南
2026/10/22 2:06:39 网站建设 项目流程

5分钟在浏览器跑起三国杀:开源桌游引擎从入门到DIY指南

【免费下载链接】noname项目地址: https://gitcode.com/GitHub_Trending/no/noname

周末约朋友来家里,想搓一局三国杀,却懒得装客户端、注册账号、更新补丁——其实打开浏览器就行。无名杀(noname)是一个纯浏览器运行的三国杀实现兼开源桌游引擎:一个 Git 仓库就是全部服务端,无需数据库,克隆下来启动本地服务器,摸牌、出牌、喊台词的完整游戏体验开箱即用。

零门槛本地启动:一条命令跑起完整服务器

启动它不需要任何构建步骤,整个过程就三件事:

# 克隆项目(仓库约含数千个武将、卡牌、音频资源文件) git clone https://gitcode.com/GitHub_Trending/no/noname cd noname # 启动内置服务器(默认端口 8089) deno task start

deno task start等价于deno run --allow-read --allow-net --allow-env noname-server.js,本质上是一个 Express 静态服务器,把整个仓库目录作为网站根目录发布。启动后访问http://localhost:8089即可开玩。如果手头没有 Deno,也可以用 Node 直接运行:node noname-server.js,支持--port、--maxAge等参数。

几个实用参数值得记一下:

  • 浏览器要求:推荐 Chrome 系内核浏览器且内核版本 ≥ 85,低版本 Firefox 可能表现不佳(见 README.md)
  • 联机大厅:[game/server.js](https://link.gitcode.com/i/212a056570765dab840bf149e4b961f1)提供 WebSocket 联机能力,docker/start.sh里两条命令正好对应"静态游戏服务器 + 联机服务器"的完整组合
  • Docker 部署:[Dockerfile](https://link.gitcode.com/i/a0c29c38f7ee2aaa7bdff91686fd0747)基于node:20,在仓库根目录执行docker build -t noname .,再docker run -p 8734:8089 -p 8324:8080 noname,游戏界面走 8734,联机大厅走 8324(详见 docker/docker.md)

对只想玩游戏的人来说,到这里已经结束了。下面看看这个项目到底内置了多少能玩的内容。

功能全景拆解:12种模式、完整AI与语音系统

先回答一个问题:它能玩什么?mode/ 目录下每个 JS 文件对应一种游戏模式,一共 12 种:

模式文件玩法
mode/identity.js经典身份场(主公/忠臣/反贼/内奸)
mode/guozhan.js国战(双将、阴阳鱼)
mode/doudizhu.js斗地主
mode/chess.js棋类对战
mode/single.js单机闯关
mode/versus.js1v1 决斗
mode/boss.js、mode/brawl.js 等Boss 战、混战等其余模式

身份场之外能玩斗地主、下棋,这正是"桌游引擎"而不是"三国杀皮肤"的含义——模式是数据,不是写死在界面里的。

再说说让对局"像样"的两个系统:

  • 内置 AI 决策。翻牌时你可能注意到,每张牌的定义里都带着一段ai配置:damage: { ai: { result: { target: -1.5 }, tag: { damage: 1 } } }——意思是"杀对目标的权重是 -1.5(攻击性)",而桃是 +1。电脑玩家就是靠这套权重表决定出牌、出杀还是留桃的,所以单机模式随时可开。
  • 完整语音体系。audio/skill/ 里有 5600 多个技能语音文件,audio/die/ 是阵亡台词,audio/card/female/ 和 audio/card/male/ 按性别存放摸牌、出牌语音。配置一个技能时写audio: 2,就表示自动播放skill/技能名1.mp3和skill/技能名2.mp3,规则在 docs/audio-guide.md 里写得很细。

另外两件事:一局结束后的对局回放、个人配置偏好都存在浏览器 localStorage / IndexedDB 里,不注册账号也有"存档";而 game/config.js 的extension配置则定义了扩展包加载机制——社区扩展会以extension/扩展名/extension.js的形式被自动发现,资源引用时带ext:扩展名前缀。这为下一节的 DIY 打下了地基。

进阶定制实战:改一个文件,刷新即见新武将

加一个武将要动几个文件?答案是两个:character/下的配置和skill.js里的技能逻辑。

看 character/standard/character.js,每个武将就一行数组,五个位置依次是:性别、势力、体力值、技能名列表、立绘/语音来源:

const characters = { caocao: ["male", "wei", 4, ["jianxiong", "hujia"], ["zhu"]], guanyu: ["male", "shu", 4, ["wusheng"]], // 你新增的武将按同样格式追加到这里即可 };

技能定义在 character/standard/skill.js,每个技能是一个对象,核心是三个部分:trigger(什么事件触发)、cost(发动代价)、content(结算流程)。比如"小果"技能挂在phaseJueshuBegin全局事件上,cost里让你弃一张基本牌,content里让目标在弃装备和受伤害之间二选一。

把这条链路串起来,就是完整的定制流程:

  1. 加武将:在character/xxx/character.js追加一行,格式如上
  2. 写技能:在同目录的skill.js里加技能对象,audio字段配好语音名
  3. 放资源:立绘放进image/character/,技能语音放进audio/skill/
  4. 看效果:刷新浏览器即可

如果你不想动核心文件,更推荐扩展包方式:新建extension/你的扩展名/extension.js,游戏会自动加载它,资源路径统一用ext:你的扩展名/...前缀引用(机制见 noname/init/import.js)。核心仓库保持干净,你的创作独立存在,这是社区协作时最常用的姿势。

技术设计速览:事件驱动与双写法技能

理解了"改哪里",再用几句话理解"为什么能这么改":

  • 模块化注册。卡牌、武将、技能、模式各自成文件,启动时通过game.import("character", ...)之类的入口统一注册进全局。文件之间互不依赖,加内容就是加文件
  • 事件驱动技能。武将技能不是"写流程",而是"挂监听":trigger: { global: "phaseJueshuBegin" }相当于订阅游戏循环广播的事件,引擎播到哪个阶段、谁受到伤害,相关技能自动被唤起。技能之间因此可以任意组合,新技能不会破坏旧逻辑
  • Step 与 Async 双写法。旧技能用"step 0" / "step 1"的字符串分步推进,新技能直接写async content+await,读起来和普通 JS 一样。v1.10.6 引入的这套 Async Content 已成为新武将的官方写法
  • AI 权重表。前面提到的ai: { result, tag }是给每个卡牌效果标"态度分",电脑玩家据此做全局决策——AI 不需要单独写逻辑,它复用的就是卡牌和技能的元数据

参与贡献指南:四种参与渠道

无名杀是 GPL-3.0 协议的开源项目,贡献渠道比想象的多:

你想做怎么做放到哪里
提代码Fork 后建特性分支,Pull Request 需推送到PR-Branch分支docs/async-guide.md 等开发文档可先读
写扩展独立extension/目录,不改核心社区扩展仓库分发
贡献美术武将立绘、卡牌图、场景背景image/character/、image/card/、image/background/
贡献音效技能语音、BGM、阵亡台词audio/skill/、audio/background/、audio/die/
反馈问题Bug 报告、功能建议仓库 Issue 区

不需要会写代码也能参与——配一段阵亡语音、画一张卡牌图,都会进入几千玩家的游戏流程。

一个仓库里装着 12 种游戏模式、数千个可编辑的武将配置和一套完整的事件驱动引擎,这就是"开源桌游引擎"的完整含义。现在克隆下来,deno task start,五分钟之内你会摸到你的第一张牌。

【免费下载链接】noname项目地址: https://gitcode.com/GitHub_Trending/no/noname

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询