10 KiB
Executable File
10 KiB
Executable File
Xóc Đĩa 游戏集成指南
概述
Xóc Đĩa 游戏已成功集成到现有的游戏管理系统中,复用了骰子游戏的核心架构(games, periods, bets, game_odds, transactions 表),无需创建独立的数据库表和后台管理界面。
数据库变更
1. 扩展 periods 表(方案 A)
在原有骰子字段(dice1, dice2, dice3)的基础上,新增了硬币字段:
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 游戏
INSERT INTO `games` (
`name`, `code`, `type`, `tags`, `sort_order`, `status`, `featured`
) VALUES (
'Xóc Đĩa',
'xocdia',
'xocdia',
'越南传统,硬币游戏',
10,
1,
1
);
3. 配置赔率(game_odds 表)
-- 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()
开奖逻辑:
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';
}
中奖判断:
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
保留前台路由:
// 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
- 点击"添加游戏"
- 填写信息:
- 游戏名称:
Xóc Đĩa - 游戏标识:
xocdia(自动生成) - 游戏类型:
xocdia - 直播流地址:(可选)
- 游戏名称:
- 点击"保存"
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
启动新期号
- 选择游戏:
Xóc Đĩa - 点击"开始下注"
- 系统自动生成期号(格式:
G{GameID}{YYYYMMDD}{NNNN})
开奖
- 在期号列表中找到"待开奖"的期号
- 点击"开奖"
- 选择 4 个硬币的结果:
- 手动选择:每个硬币选择"红"或"白"
- 自动开奖:系统随机生成 4 个硬币结果
- 系统自动计算红色硬币数量和单双结果
结算
- 确认开奖结果无误
- 点击"结算"
- 系统自动:
- 查询该期所有投注
- 判断输赢
- 更新用户余额(赢的情况)
- 记录交易流水
- 更新投注状态(win/lose)
前台访问
用户访问流程
-
游戏大厅:访问
/xocdia- 显示所有可用的 Xóc Đĩa 游戏
- 显示当前期号、赔率、限红
-
进入房间:点击"进入房间"
- URL:
/xocdia/room?room_id={game_id} - 实时显示:当前期号、倒计时、开奖结果
- 投注区域:6 种投注类型
- URL:
-
下注:
- 选择投注类型(双/单/4红/4白/3红1白/1红3白)
- 输入金额(10 - 10000)
- 点击"投注"
-
查看结果:
- 开奖历史:最近 5 期结果
- 我的投注:当前期号的投注记录
数据库安装
执行 SQL 脚本
mysql -u 用户名 -p 数据库名 < Db/xocdia_integration.sql
脚本内容:
- 扩展
periods表(添加硬币字段) - 插入 Xóc Đĩa 游戏记录
- 配置赔率
验证安装:
-- 检查 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: 如何修改赔率?
答:
- 访问
/admin/games - 找到 Xóc Đĩa 游戏,点击"配置赔率"
- 修改对应投注类型的赔率值
- 点击"保存"
注意:修改赔率只影响新的投注,已下注的订单使用下注时的赔率。
Q4: 如何添加新的 Xóc Đĩa 游戏(不同房间)?
答:
- 在
/admin/games创建新游戏 - 游戏类型选择
xocdia - 配置该游戏的赔率(可以与现有游戏不同)
- 前台
/xocdia会自动显示所有 Xóc Đĩa 游戏
技术细节
数据流
用户下注
↓
验证(余额、期号状态、赔率)
↓
开启事务
↓
扣除余额(users.balance)
↓
记录投注(bets 表)
↓
记录流水(transactions 表)
↓
提交事务
管理员开奖
↓
根据 game.type 判断游戏类型
↓
生成结果(4 个硬币或 3 个骰子)
↓
更新 periods 表(coin1-4 或 dice1-3)
↓
管理员结算
↓
查询该期所有投注
↓
遍历判断输赢(checkWinXocdia 或 checkWinDice)
↓
更新用户余额(赢的情况)
↓
记录交易流水
↓
更新投注状态
安全措施
- 并发控制:使用数据库事务防止并发扣款
- 权限检查:所有后台操作需要管理员权限
- 参数化查询:使用 Medoo ORM 防止 SQL 注入
- 余额验证:下注前检查用户余额
- 期号状态验证:只能在"待开奖"期号下注
后续优化建议
- 配置限红:当前限红(10 - 10000)硬编码在代码中,建议存储到
games表或单独的配置表 - 抽水功能:当前未实现抽水逻辑,建议添加抽水率配置
- 倒计时功能:前台倒计时当前通过轮询实现,建议使用 WebSocket 推送
- 实时监控:建议添加实时投注统计和风控监控页面
- 历史查询:添加更丰富的历史查询筛选条件(日期、投注类型等)
相关文件清单
数据库
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 表字段) 状态: 已完成集成,待测试