Skip to content

Repository files navigation

双数对决(Dual Digits)

一个可部署的联机网页版数字战术游戏,支持双人对战和四人 2V2。规则来自仓库中的 双数对决(Dual Digits).md,四人模式扩展为两队对抗:1、3 号位为曜石队,2、4 号位为流光队。

本地运行

需要 Node.js 20 或更高版本。

npm install
npm start

打开:

http://localhost:3000

游戏方式

  1. 使用 Phantom(Solana)钱包登录。只适配 Phantom,未安装钱包时会提示安装。
  2. 一名玩家先选择双人对战或四人 2V2,然后创建房间。
  3. 复制房间码给其他玩家。
  4. 对应人数的玩家分别入座后点击开始。
  5. 回合按座位号轮流行动;阵亡玩家会被跳过。
  6. 双人模式中,一名玩家的两个数字全部阵亡则对方获胜。
  7. 四人模式中,一队所有存活数字全部阵亡时,另一队获胜。

规则扩展

  • 每位玩家仍然拥有两个数字,初始均为 1。
  • 求和时,只能改变自己的数字。
  • 求和的加数可以来自任意其他玩家的存活数字,不能选择自己的数字。
  • 确认求和前可以反复改选目标和加数;确认后立刻进入技能阶段。
  • 求和后如果没有任何可发动技能,系统会自动跳过技能阶段。
  • 普通攻击和同归于尽只能使用本回合刚刚求和得到的那个数字。
  • 技能目标可以是任意其他玩家的存活数字;四人模式下也可以攻击队友。
  • 四人 2V2 中,每位玩家前两次行动不能发动任何技能;第三次行动只能发动普通攻击;第四次行动起技能全部开放。
  • 四人 2V2 中,如果自己和队友都只剩一个数字,可以把队友的唯一存活数字视作自己的另一个数字来满足必杀组合。
  • 普通攻击、必杀、同归于尽的数值条件保持原规则。
  • 必杀必须由本回合求和后立刻形成 (5,6)(5,7)(5,8)(2,9) 才可发动。

部署

直接部署到一台服务器

git clone <你的仓库地址>
cd Dual\ Digits
npm start

默认端口是 3000。可以用环境变量修改:

PORT=8080 npm start

Windows PowerShell:

$env:PORT=8080
npm start

使用 PM2 常驻运行

npm install -g pm2
pm2 start server.js --name dual-digits
pm2 save

如果要指定端口:

PORT=8080 pm2 start server.js --name dual-digits

Nginx 反向代理示例

WebSocket 需要保留 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 一起复制)。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages