无名杀完全上手指南:在浏览器里跑一套可自由改造的三国杀引擎
【免费下载链接】noname项目地址: https://gitcode.com/GitHub_Trending/no/noname
我把仓库克隆下来挂到本地服务器上,用 Chrome 内核浏览器打开页面,就能选武将、发牌、开局一局三国杀;更吸引我的是,这里每一个武将、每张卡牌、每种模式背后都是一个能直接阅读的 JS 文件。这就是 noname(无名杀)——一个以纯前端为主的开源三国杀引擎,支持浏览器单机、局域网联机,以及从零 DIY 新武将与玩法。
三条部署路径任选,先让游戏跑起来
官方在 README 里建议网页端使用 Chrome 系内核浏览器,且内核版本不低于 85。启动方式按需求从轻到重分三档:
纯静态托管。整个游戏本体是静态文件,index.html 负责加载 game/ 下的核心脚本,最省事的做法:
# 在项目根目录启动临时静态服务器 python -m http.server 8000 # 8000: 可改为任意空闲端口浏览器访问http://localhost:8000即可单机游玩。
Node 服务端。联机大厅依赖一个 WebSocket 服务(game/server.js 中监听 8080 端口),而 noname-server.js 提供游戏网页与文件读写接口(默认 8089 端口)。项目用 deno.json 封装了启动任务,两条命令都要跑:
# 启动网页服务(--server 表示开启服务端模式) node --experimental-default-type=module noname-server.js --server & # 启动联机大厅 cd game && node --experimental-default-type=commonjs server.jsDocker 容器化。docker/docker.md 给出了完整流程,Dockerfile 基于node:20,安装好ws、express等依赖后由 docker/start.sh 拉起上面两个进程:
git clone -b master --depth=1 https://gitcode.com/GitHub_Trending/no/noname cd noname docker build -t noname . # 构建镜像 docker run -dit --name noname -p 8734:8089 -p 8324:8080 noname # -p 8734:8089 游戏网页 -p 8324:8080 联机大厅容器方案下访问8734是游戏界面,8324是联机大厅,端口都可以自行调整。
部署跑通之后,我顺手翻了翻目录,想搞清楚"改一个武将"到底要动几个文件。
目录地图:武将、卡牌与模式各归其位
仓库的结构和内容量本身就说明了很多问题:
- character/ 武将定义,按扩展包分目录,
standard(标准包)、shenhua(神武将)、sp、yingbian(影之边缘)、jsrg等二十余个包,每个包下有character.js、skill.js、translate.js、voices.js等分工明确的小文件 - card/ 卡牌定义,除
standard.js、extra.js外还有guozhan.js(国战)等变体 - mode/ 游戏模式:
identity.js(身份局)、guozhan.js(国战)、versus.js(1v1)、doudizhu.js(斗地主)等 12 种 - image/ 图像资源:
character/下 2300 多张武将立绘,card/下近 500 张卡面 - audio/ 音频:
skill/下 5600 余个技能音效,die/下近 1300 条阵亡语音,background/是背景音乐 - noname/ 框架内核:
game/主循环、library/工具库、ui/渲染层 - docs/ 开发文档,目前有 async-guide.md(异步技能写法)与 audio-guide.md(音频配置)
这种"一个扩展包一个目录"的组织方式,意味着加武将不会碰到别的包,下面用标准包当样本拆一遍。
最小示例:一个新武将由哪几行代码构成
翻开 character/standard/character.js,武将定义比我预想的更紧凑——每个武将就是一个五元组数组:
// character/standard/character.js(节选) caocao: ["male", "wei", 4, ["jianxiong", "hujia"], ["zhu"]], zhangfei: ["male", "shu", 4, ["paoxiao"]],五个位置依次是:性别、势力(wei/shu/wu/qun对应魏蜀吴群)、体力上限、技能列表、附加标记(zhu表示主公位可选,name:诸葛|亮这类条目则用于控制姓名切分显示)。
技能本体在 character/standard/skill.js 里,以标准包潘凤的stdkuangfu为例:
// character/standard/skill.js(节选) stdkuangfu: { trigger: { source: "damageSource" }, // 作为伤害来源时触发 forced: true, // 强制触发 filter(event, player) { return player.isPhaseUsing() && event.card && event.card.name == "sha"; }, async content(event, trigger, player) { if (trigger.player.hp < player.hp) player.draw(2); else player.loseHp(); }, ai: { halfneg: true }, // 供 AI 评估的权重提示 },技能采用trigger(何时触发)→filter(条件过滤)→content(执行逻辑)的三段式结构,事件名如damageSource、recoverEnd由引擎统一派发。这套写法有个实际好处:AI 读的是ai字段和牌值评分,而不是单独维护一套机器人逻辑,docs/async-guide.md 对异步content的等待/回调用法有专门说明。
语音则几乎零配置:按 docs/audio-guide.md 的约定,技能wusheng默认就去audio/skill/wusheng.mp3找文件,找不到才需要写audio字段指路,audioname还能给不同武将指定专属发音版本。
卡牌不只是牌面:AI 评分驱动出牌
武将会玩,牌也要会选。card/standard.js 有 4200 多行,但卡牌定义本身很薄,大部分篇幅是ai评分:
// card/standard.js(节选) damage: { ai: { result: { target: -1.5 }, // 对目标打出此牌的收益分 tag: { damage: 1 }, }, },引擎把"该不该对这个人出这张牌"量化成分数,选牌阶段按分排序即可,所以新卡牌只要给出合理的result值,单机 AI 就能直接用。卡牌美术同样走目录约定,扩展包卡面放在 image/card/ 下按包名区分。
不改一行代码换玩法:开关式扩展包与模式文件
想换一套武将池,我不必写任何代码。game/config.js 里有两张清单:
sgscharacters: ["standard", "shenhua", "refresh", "yijiang", ...], // 武将包 sgscards: ["standard", "extra", "sp", "guozhan", "zhulu", ...], // 卡牌包删掉数组里的名字,对应扩展包就不会加载;游戏内选将界面也有勾选入口,勾选结果写回配置。模式侧更直接:mode/ 下 12 个文件各代表一种玩法,身份局、国战、1v1、斗地主甚至五子棋(connect.js)都是同一个start()步进式流程——用"step 0"、"step 1"字符串把流程切成可挂起的步骤,这正是引擎能同时支撑单机与联机回放的关键机制。
局域网联机:一个 WebSocket 大厅撑起多人局
单机靠本地状态,联机则依赖前面提到的 8080 端口。game/server.js 用ws库起了一个极简房间服务:客户端发送create建房、enter按房号加入,服务端维护rooms房间表并把消息在房间内转发。没有账号体系,也没有持久化数据库——房间随服务存活,关闭即散,对朋友聚会场景足够。
与此同时,noname-server.js 暴露了/readFile、/writeFile、/getFileList等文件接口(index.html 里能看到前端对应的fetch封装)。这让"扩展"在联网环境下也能落地:扩展包本质就是磁盘上的目录,服务端能读到,浏览器才能加载。
想提交代码:PR 分支约定与文档索引
README 里写得很明确:提交 Pull Request 时要推送到PR-Branch分支,而不是主开发分支。项目采用 GPL-3.0 协议,README 同时用专门章节说明了社区对 Fork 与开源规范的立场。
作为新人,我建议的切入顺序是:先通读 docs/async-guide.md 理解异步技能写法,再照着 character/standard/ 复制一个最简武将跑起来,最后按 docs/audio-guide.md 补上语音台词。所有资源命名约定(技能音效、阵亡语音、立绘路径)都是目录加拼音/英文 ID,照葫芦画瓢即可,出错时控制台也会把文件名与行号直接弹出来(index.html 里内置了window.onerror提示)。
从克隆仓库到开一局身份局不超过五分钟,而把一个新武将推进正式包,需要的也只是几个遵循约定的 JS 文件。对想深度玩三国杀规则、又不想碰服务端复杂环境的人来说,这套"静态优先、按需加服务"的架构把改造门槛压得很低。
【免费下载链接】noname项目地址: https://gitcode.com/GitHub_Trending/no/noname
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考