信任的游戏是一个基于经典囚徒困境理论的多人在线策略游戏。玩家通过编写JavaScript策略或使用可视化蓝图编辑器来设计自己的决策算法,在每秒一次的对局中与其他玩家竞争,累积分数,争夺排行榜第一名。
这个项目不仅是一个有趣的游戏,更是一个探索博弈论、策略设计和人工智能的实验平台。
- 🎯 多人实时对战 - 基于WebSocket的实时匹配系统,每秒自动匹配所有在线玩家
- 💻 双重编辑模式
- JavaScript代码编辑器(基于Monaco Editor)
- 可视化蓝图节点编辑器(无需编程基础)
- 📊 实时排行榜 - 多维度排名展示(总分、平均分、胜率)
- 📜 完整对局记录 - 查看历史对局的详细数据和策略表现
- ⚡ 实时数据更新 - WebSocket推送,即时显示最新战况
- 🎨 现代化UI - 基于Element Plus的精美界面设计
游戏采用经典的囚徒困境模型:
| 你的选择 \ 对手的选择 | 合作(投币) | 背叛(不投币) |
|---|---|---|
| 合作(投币) | 你得 3 分 对手得 3 分 |
你得 0 分 对手得 5 分 |
| 背叛(不投币) | 你得 5 分 对手得 0 分 |
你得 1 分 对手得 1 分 |
- ⏱️ 每秒一次tick - 游戏引擎每秒执行一轮匹配
- 🔄 自动配对 - 所有在线玩家随机两两配对
- 🎯 100轮博弈 - 每对玩家进行100轮囚徒困境游戏
- 📈 分数累积 - 所有对局的分数会累积到你的总分
玩家可以通过两种方式创建策略:
-
JavaScript代码编辑器
function strategy(history, round, totalRounds) { // history: 历史对局记录数组 [{me: 'cooperate'/'defect', opponent: 'cooperate'/'defect'}] // round: 当前轮数 (0-99) // totalRounds: 总轮数 (100) if (round === 0) { return 'cooperate'; // 第一轮合作 } // 以牙还牙策略:模仿对手上一轮的行为 return history[history.length - 1].opponent; }
-
可视化蓝图编辑器 - 通过拖拽节点创建决策流程,无需编程知识
- Go 1.21+
- Node.js 16+
- npm/yarn
git clone https://github.com/yourusername/trustgame.git
cd trustgamecd backend
go mod tidy
go run main.go后端服务将在 http://localhost:8080 启动
cd frontend
npm install
npm run dev前端服务将在 http://localhost:5173 启动
在浏览器中打开 http://localhost:5173,注册账号并开始编写你的策略!
- 语言: Go 1.21
- Web框架: Gin
- WebSocket: gorilla/websocket
- 数据库: SQLite + go-sqlite3
- JavaScript执行引擎: goja(在Go中运行JavaScript策略)
- 框架: Vue 3 (Composition API)
- 语言: TypeScript 5.2
- 构建工具: Vite 5
- UI组件库: Element Plus
- 状态管理: Pinia
- 代码编辑器: Monaco Editor
- 路由: Vue Router 4
- HTTP客户端: Axios
trustgame/
├── backend/ # Go后端服务
│ ├── main.go # 入口文件
│ ├── models/ # 数据模型定义
│ │ └── models.go
│ ├── engine/ # 游戏引擎核心逻辑
│ │ └── engine.go # 匹配系统、策略执行、分数计算
│ ├── api/ # API路由和处理器
│ │ └── api.go # RESTful API + WebSocket
│ ├── database/ # 数据库操作层
│ │ └── database.go # CRUD操作
│ ├── go.mod # Go依赖管理
│ └── trustgame.db # SQLite数据库文件
│
├── frontend/ # Vue前端应用
│ ├── src/
│ │ ├── views/ # 页面组件
│ │ │ ├── Home.vue # 首页
│ │ │ ├── Login.vue # 登录/注册
│ │ │ ├── Strategies.vue # 策略编辑器
│ │ │ ├── Leaderboard.vue # 排行榜
│ │ │ └── Matches.vue # 对局记录
│ │ ├── components/ # 可复用组件
│ │ │ ├── MonacoEditor.vue # 代码编辑器
│ │ │ └── BlueprintEditor.vue # 蓝图编辑器
│ │ ├── stores/ # Pinia状态管理
│ │ │ └── player.ts
│ │ ├── services/ # API服务
│ │ │ └── api.ts
│ │ ├── router/ # 路由配置
│ │ │ └── index.ts
│ │ ├── App.vue # 根组件
│ │ └── main.ts # 入口文件
│ ├── package.json # npm依赖管理
│ └── vite.config.ts # Vite配置
│
├── docs/ # 文档和截图
└── README.md # 项目说明文档
- 匹配系统: 每秒自动配对所有在线玩家
- 策略执行: 使用goja在Go环境中安全执行JavaScript策略
- 沙箱机制: 超时控制、内存限制,防止恶意代码
- 分数计算: 根据囚徒困境规则计算每轮得分
- 数据持久化: 保存对局记录供后续分析
- RESTful API: 用户认证、策略CRUD、排行榜查询
- WebSocket: 实时推送排行榜更新和对局结果
- CORS配置: 支持前后端分离开发
- 组件化设计: 模块化、可复用的Vue组件
- 响应式状态: 使用Pinia进行全局状态管理
- 类型安全: TypeScript提供完整的类型检查
- 实时通信: WebSocket自动重连机制
欢迎提交Issue和Pull Request!
- Fork本项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情
- 灵感来源于 Robert Axelrod 的《合作的进化》
- 感谢所有开源项目的贡献者
Made with ❤️ by [E9C50 & Cursor]



