一个可部署的联机网页版数字战术游戏,支持双人对战和四人 2V2。规则来自仓库中的 双数对决(Dual Digits).md,四人模式扩展为两队对抗:1、3 号位为曜石队,2、4 号位为流光队。
需要 Node.js 20 或更高版本。
npm install
npm start打开:
http://localhost:3000
- 使用 Phantom(Solana)钱包登录。只适配 Phantom,未安装钱包时会提示安装。
- 一名玩家先选择双人对战或四人 2V2,然后创建房间。
- 复制房间码给其他玩家。
- 对应人数的玩家分别入座后点击开始。
- 回合按座位号轮流行动;阵亡玩家会被跳过。
- 双人模式中,一名玩家的两个数字全部阵亡则对方获胜。
- 四人模式中,一队所有存活数字全部阵亡时,另一队获胜。
- 每位玩家仍然拥有两个数字,初始均为 1。
- 求和时,只能改变自己的数字。
- 求和的加数可以来自任意其他玩家的存活数字,不能选择自己的数字。
- 确认求和前可以反复改选目标和加数;确认后立刻进入技能阶段。
- 求和后如果没有任何可发动技能,系统会自动跳过技能阶段。
- 普通攻击和同归于尽只能使用本回合刚刚求和得到的那个数字。
- 技能目标可以是任意其他玩家的存活数字;四人模式下也可以攻击队友。
- 四人 2V2 中,每位玩家前两次行动不能发动任何技能;第三次行动只能发动普通攻击;第四次行动起技能全部开放。
- 四人 2V2 中,如果自己和队友都只剩一个数字,可以把队友的唯一存活数字视作自己的另一个数字来满足必杀组合。
- 普通攻击、必杀、同归于尽的数值条件保持原规则。
- 必杀必须由本回合求和后立刻形成
(5,6)、(5,7)、(5,8)、(2,9)才可发动。
git clone <你的仓库地址>
cd Dual\ Digits
npm start默认端口是 3000。可以用环境变量修改:
PORT=8080 npm startWindows PowerShell:
$env:PORT=8080
npm startnpm install -g pm2
pm2 start server.js --name dual-digits
pm2 save如果要指定端口:
PORT=8080 pm2 start server.js --name dual-digitsWebSocket 需要保留 Upgrade 头。
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}配置 HTTPS 后,浏览器会自动使用 wss:// 连接联机服务。
server.js Node 原生 HTTP + WebSocket 服务端,包含 Phantom/Solana 登录接口
public/index.html 网页入口
public/styles.css 视觉样式
public/app.js 客户端交互逻辑、Phantom 登录
package.json 启动脚本与依赖
项目引入了两个小型运行时依赖:bs58 用于 Base58 编解码,tweetnacl 用于 Ed25519 签名验证。其余部分仍保持原生 Node.js,适合直接部署到 VPS、云服务器、Render、Railway、Fly.io 等支持 Node 服务的环境。
- 仅适配 Phantom 的 SVM(Solana)钱包。登录入口在页面右上角“连接钱包”。
- 优先使用 Phantom 的
signIn(Solana Sign-In)接口;若不可用则回退到signMessage。 - 服务端使用一次性
nonce挑战校验签名,验证通过后返回会话 token,后续 WebSocket 通信通过 token 识别用户。 - 钱包地址默认显示为 shortened 形式(前 4 位 + … + 后 4 位),可在房间内修改昵称。
- 会话 token 保存在
sessionStorage(按标签页隔离),刷新页面不会断线,但关闭标签页后需要重新连接钱包。 - 之所以不用
localStorage:它在同一浏览器的所有标签页之间共享,会让两个标签页变成同一个玩家,无法在同一浏览器里开两个页面自己和自己对战。 - 座位归属于钱包地址。用同一个钱包重新登录(即使是关闭标签页后的新会话)会自动回到原房间并接管原座位,从而继续对局。
- 同一钱包在两个标签页分别登录会得到两个独立会话,可以坐在不同座位实现自我对战;想这样玩时请用“新开标签页”而不是“复制标签页”(复制会连
sessionStorage一起复制)。