# Xóc Đĩa 游戏集成指南 ## 概述 Xóc Đĩa 游戏已成功集成到现有的游戏管理系统中,复用了骰子游戏的核心架构(`games`, `periods`, `bets`, `game_odds`, `transactions` 表),无需创建独立的数据库表和后台管理界面。 --- ## 数据库变更 ### 1. 扩展 `periods` 表(方案 A) 在原有骰子字段(dice1, dice2, dice3)的基础上,新增了硬币字段: ```sql ALTER TABLE `periods` ADD COLUMN `coin1` TINYINT DEFAULT NULL COMMENT '硬币1(1=红,0=白)', ADD COLUMN `coin2` TINYINT DEFAULT NULL COMMENT '硬币2(1=红,0=白)', ADD COLUMN `coin3` TINYINT DEFAULT NULL COMMENT '硬币3(1=红,0=白)', ADD COLUMN `coin4` TINYINT DEFAULT NULL COMMENT '硬币4(1=红,0=白)', ADD COLUMN `red_count` TINYINT DEFAULT NULL COMMENT '红色硬币数量(0-4)'; ``` **设计说明**: - 骰子游戏使用:`dice1`, `dice2`, `dice3`, `total`, `result` - Xóc Đĩa 使用:`coin1`, `coin2`, `coin3`, `coin4`, `red_count`, `result` - 两种游戏可共存,不会相互干扰 ### 2. 在 `games` 表中添加 Xóc Đĩa 游戏 ```sql INSERT INTO `games` ( `name`, `code`, `type`, `tags`, `sort_order`, `status`, `featured` ) VALUES ( 'Xóc Đĩa', 'xocdia', 'xocdia', '越南传统,硬币游戏', 10, 1, 1 ); ``` ### 3. 配置赔率(`game_odds` 表) ```sql -- Xóc Đĩa 投注类型及赔率: INSERT INTO `game_odds` (`game_id`, `type`, `target`, `odds`) VALUES (@xocdia_game_id, 'even', 'all', 0.97), -- 双(偶数个红色) (@xocdia_game_id, 'odd', 'all', 0.97), -- 单(奇数个红色) (@xocdia_game_id, 'four_red', 'all', 8.00), -- 4 红 (@xocdia_game_id, 'four_white', 'all', 8.00),-- 4 白 (@xocdia_game_id, 'three_red', 'all', 1.90), -- 3 红 1 白 (@xocdia_game_id, 'three_white', 'all', 1.90);-- 1 红 3 白 ``` --- ## 代码变更 ### 1. `PeriodController` 扩展 **文件**: `App/Controllers/Admin/PeriodController.php` **新增方法**: - `drawXocdia($db, $id, $data)` - 处理 Xóc Đĩa 开奖(4 个硬币) - `checkWinXocdia($bet, $period, $oddsConfig)` - 判断 Xóc Đĩa 中奖 **修改方法**: - `draw()` - 根据游戏类型(`games.type`)分发到 `drawDice()` 或 `drawXocdia()` - `checkWin()` - 根据游戏类型分发到 `checkWinDice()` 或 `checkWinXocdia()` **开奖逻辑**: ```php if ($gameType === 'xocdia') { // 生成 4 个硬币结果(0=白,1=红) $coin1 = rand(0, 1); $coin2 = rand(0, 1); $coin3 = rand(0, 1); $coin4 = rand(0, 1); $redCount = $coin1 + $coin2 + $coin3 + $coin4; $result = ($redCount % 2 == 0) ? 'even' : 'odd'; } ``` **中奖判断**: ```php switch ($betType) { case 'even': // 双 if ($redCount % 2 == 0) $isWin = true; break; case 'four_red': // 4 红 if ($redCount == 4) $isWin = true; break; case 'three_red': // 3 红 1 白 if ($redCount == 3) $isWin = true; break; // ... } ``` ### 2. 前台控制器 **文件**: `App/Controllers/Web/XocdiaController.php` **功能**: - `index()` - 显示所有 Xóc Đĩa 类型的游戏列表 - `room()` - 游戏房间界面 - `placeBet()` - 下注(使用 `bets` 表) - `getCurrentPeriod()` - 获取当前期号 - `getHistory()` - 获取开奖历史 - `getMyBets()` - 获取用户投注记录 **数据访问**: - 从 `games` 表读取游戏配置(`type='xocdia'`) - 从 `game_odds` 表读取赔率 - 从 `periods` 表读取期号 - 从 `bets` 表记录投注 ### 3. 路由配置 **文件**: `routes.php` **保留前台路由**: ```php // Xóc Đĩa 前台路由 ['GET', '/xocdia', '\App\Controllers\Web\XocdiaController@index'], ['GET', '/xocdia/room', '\App\Controllers\Web\XocdiaController@room'], ['GET', '/api/xocdia/periods/current', '\App\Controllers\Web\XocdiaController@getCurrentPeriod'], ['POST', '/api/xocdia/bet', '\App\Controllers\Web\XocdiaController@placeBet'], ['GET', '/api/xocdia/periods/history', '\App\Controllers\Web\XocdiaController@getHistory'], ['GET', '/api/xocdia/my-bets', '\App\Controllers\Web\XocdiaController@getMyBets'], ``` **删除后台路由**: - 不再需要独立的 `/admin/xocdia/*` 路由 - 使用现有的 `/admin/games`, `/admin/periods` 管理 --- ## 管理流程 ### 1. 创建 Xóc Đĩa 游戏 **后台路径**: `/admin/games` 1. 点击"添加游戏" 2. 填写信息: - 游戏名称:`Xóc Đĩa` - 游戏标识:`xocdia`(自动生成) - 游戏类型:`xocdia` - 直播流地址:(可选) 3. 点击"保存" ### 2. 配置赔率 **后台路径**: `/admin/games` → 点击游戏 → "配置赔率" 配置以下投注类型: - `even`: 双(0.97) - `odd`: 单(0.97) - `four_red`: 4 红(8.00) - `four_white`: 4 白(8.00) - `three_red`: 3 红 1 白(1.90) - `three_white`: 1 红 3 白(1.90) ### 3. 期号管理 **后台路径**: `/admin/periods` #### 启动新期号 1. 选择游戏:`Xóc Đĩa` 2. 点击"开始下注" 3. 系统自动生成期号(格式:`G{GameID}{YYYYMMDD}{NNNN}`) #### 开奖 1. 在期号列表中找到"待开奖"的期号 2. 点击"开奖" 3. 选择 4 个硬币的结果: - 手动选择:每个硬币选择"红"或"白" - 自动开奖:系统随机生成 4 个硬币结果 4. 系统自动计算红色硬币数量和单双结果 #### 结算 1. 确认开奖结果无误 2. 点击"结算" 3. 系统自动: - 查询该期所有投注 - 判断输赢 - 更新用户余额(赢的情况) - 记录交易流水 - 更新投注状态(win/lose) --- ## 前台访问 ### 用户访问流程 1. **游戏大厅**:访问 `/xocdia` - 显示所有可用的 Xóc Đĩa 游戏 - 显示当前期号、赔率、限红 2. **进入房间**:点击"进入房间" - URL:`/xocdia/room?room_id={game_id}` - 实时显示:当前期号、倒计时、开奖结果 - 投注区域:6 种投注类型 3. **下注**: - 选择投注类型(双/单/4红/4白/3红1白/1红3白) - 输入金额(10 - 10000) - 点击"投注" 4. **查看结果**: - 开奖历史:最近 5 期结果 - 我的投注:当前期号的投注记录 --- ## 数据库安装 ### 执行 SQL 脚本 ```bash mysql -u 用户名 -p 数据库名 < Db/xocdia_integration.sql ``` **脚本内容**: 1. 扩展 `periods` 表(添加硬币字段) 2. 插入 Xóc Đĩa 游戏记录 3. 配置赔率 **验证安装**: ```sql -- 检查 periods 表字段 SHOW COLUMNS FROM periods LIKE 'coin%'; -- 检查游戏是否创建 SELECT * FROM games WHERE type = 'xocdia'; -- 检查赔率配置 SELECT g.name, go.type, go.odds FROM game_odds go JOIN games g ON go.game_id = g.id WHERE g.code = 'xocdia'; ``` --- ## 投注类型说明 | 投注类型 | bet_type | 条件 | 赔率 | |---------|---------|------|------| | 双(Chẵn) | even | 红色硬币数量为 0, 2, 4 | 1:0.97 | | 单(Lẻ) | odd | 红色硬币数量为 1, 3 | 1:0.97 | | 4 红 | four_red | 4 个红色硬币 | 1:8.00 | | 4 白 | four_white | 0 个红色硬币(即 4 白) | 1:8.00 | | 3 红 1 白 | three_red | 3 个红色硬币 | 1:1.90 | | 1 红 3 白 | three_white | 1 个红色硬币 | 1:1.90 | --- ## 常见问题 ### Q1: 骰子游戏和 Xóc Đĩa 会冲突吗? **答**:不会。两种游戏使用不同的字段: - 骰子:`dice1`, `dice2`, `dice3`, `total` - Xóc Đĩa:`coin1`, `coin2`, `coin3`, `coin4`, `red_count` 系统根据 `games.type` 字段区分游戏类型。 ### Q2: 如何在后台区分两种游戏的期号? **答**:在期号列表中,通过"游戏名称"列区分: - 骰子游戏:`games.type = 'dice'` - Xóc Đĩa:`games.type = 'xocdia'` 开奖时,系统自动根据游戏类型调用不同的逻辑。 ### Q3: 如何修改赔率? **答**: 1. 访问 `/admin/games` 2. 找到 Xóc Đĩa 游戏,点击"配置赔率" 3. 修改对应投注类型的赔率值 4. 点击"保存" **注意**:修改赔率只影响新的投注,已下注的订单使用下注时的赔率。 ### Q4: 如何添加新的 Xóc Đĩa 游戏(不同房间)? **答**: 1. 在 `/admin/games` 创建新游戏 2. 游戏类型选择 `xocdia` 3. 配置该游戏的赔率(可以与现有游戏不同) 4. 前台 `/xocdia` 会自动显示所有 Xóc Đĩa 游戏 --- ## 技术细节 ### 数据流 ``` 用户下注 ↓ 验证(余额、期号状态、赔率) ↓ 开启事务 ↓ 扣除余额(users.balance) ↓ 记录投注(bets 表) ↓ 记录流水(transactions 表) ↓ 提交事务 ``` ``` 管理员开奖 ↓ 根据 game.type 判断游戏类型 ↓ 生成结果(4 个硬币或 3 个骰子) ↓ 更新 periods 表(coin1-4 或 dice1-3) ↓ 管理员结算 ↓ 查询该期所有投注 ↓ 遍历判断输赢(checkWinXocdia 或 checkWinDice) ↓ 更新用户余额(赢的情况) ↓ 记录交易流水 ↓ 更新投注状态 ``` ### 安全措施 1. **并发控制**:使用数据库事务防止并发扣款 2. **权限检查**:所有后台操作需要管理员权限 3. **参数化查询**:使用 Medoo ORM 防止 SQL 注入 4. **余额验证**:下注前检查用户余额 5. **期号状态验证**:只能在"待开奖"期号下注 --- ## 后续优化建议 1. **配置限红**:当前限红(10 - 10000)硬编码在代码中,建议存储到 `games` 表或单独的配置表 2. **抽水功能**:当前未实现抽水逻辑,建议添加抽水率配置 3. **倒计时功能**:前台倒计时当前通过轮询实现,建议使用 WebSocket 推送 4. **实时监控**:建议添加实时投注统计和风控监控页面 5. **历史查询**:添加更丰富的历史查询筛选条件(日期、投注类型等) --- ## 相关文件清单 ### 数据库 - `Db/xocdia_integration.sql` - 数据库集成脚本 ### 控制器 - `App/Controllers/Admin/PeriodController.php` - 期号管理(已扩展支持 Xóc Đĩa) - `App/Controllers/Admin/GameController.php` - 游戏管理(复用) - `App/Controllers/Web/XocdiaController.php` - 前台控制器 ### 视图 - `App/Views/Web/xocdia_rooms.php` - 游戏大厅 - `App/Views/Web/xocdia_room.php` - 游戏房间 - `App/Views/Admin/games.php` - 游戏管理(复用) - `App/Views/Admin/periods.php` - 期号管理(复用) ### 路由 - `routes.php` - 路由配置(包含 Xóc Đĩa 前台路由) --- **最后更新**: 2026-01-08 **集成方式**: 方案 A(扩展 periods 表字段) **状态**: 已完成集成,待测试