Initial commit: 投注游戏平台初始化
This commit is contained in:
Executable
+360
@@ -0,0 +1,360 @@
|
||||
# Xóc Đĩa 游戏集成指南
|
||||
|
||||
## 📋 概述
|
||||
|
||||
本文档描述如何在 TM68 平台上使用新集成的 Xóc Đĩa(色碟)游戏功能。
|
||||
|
||||
## 🎯 游戏规则
|
||||
|
||||
### 基本机制
|
||||
- 使用 4 枚双色硬币(红色/白色)
|
||||
- 荷官摇动后开盖展示结果
|
||||
- 玩家根据硬币颜色组合进行投注
|
||||
|
||||
### 投注类型
|
||||
|
||||
| 投注类型 | 说明 | 中奖条件 | 默认赔率 |
|
||||
|---------|------|---------|---------|
|
||||
| **CHẴN (双/偶)** | 双数组合 | 4红 或 4白 或 2红2白 | 1:0.96 |
|
||||
| **LẺ (单/奇)** | 单数组合 | 3红1白 或 3白1红 | 1:0.96 |
|
||||
| **4 ĐỎ** | 4个红色 | 全部红色 | 1:10 |
|
||||
| **4 TRẮNG** | 4个白色 | 全部白色 | 1:10 |
|
||||
| **3 ĐỎ 1 TRẮNG** | 3红1白 | 3个红色1个白色 | 1:3.5 |
|
||||
| **3 TRẮNG 1 ĐỎ** | 3白1红 | 3个白色1个红色 | 1:3.5 |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 部署步骤
|
||||
|
||||
### 1. 初始化数据库
|
||||
|
||||
执行 SQL 脚本初始化游戏和赔率配置:
|
||||
|
||||
```bash
|
||||
# 方式1:通过 phpMyAdmin 导入
|
||||
# 导入文件:Db/xocdia_setup.sql
|
||||
|
||||
# 方式2:通过命令行执行
|
||||
mysql -u用户名 -p数据库名 < Db/xocdia_setup.sql
|
||||
```
|
||||
|
||||
**脚本内容**:
|
||||
- 在 `games` 表添加 Xóc Đĩa 游戏记录(code='xocdia', type='xocdia')
|
||||
- 在 `game_odds` 表配置6种投注类型的赔率
|
||||
|
||||
### 2. 配置游戏信息
|
||||
|
||||
登录后台管理 → **游戏管理** → 编辑 Xóc Đĩa 游戏:
|
||||
|
||||
1. **基本信息**
|
||||
- 游戏名称:Xóc Đĩa
|
||||
- 游戏标识:xocdia(自动生成)
|
||||
- 游戏类型:xocdia(重要!)
|
||||
- 状态:启用
|
||||
|
||||
2. **直播配置**
|
||||
- 直播流地址:填写 HLS/FLV 流地址
|
||||
- 示例:`https://your-cdn.com/live/xocdia.m3u8`
|
||||
|
||||
3. **展示设置**
|
||||
- 游戏图片:上传缩略图(推荐尺寸 400x300)
|
||||
- 在游戏大厅显示:是
|
||||
- 排序权重:100(数字越大越靠前)
|
||||
|
||||
### 3. 配置赔率(可选)
|
||||
|
||||
如需调整赔率,登录后台管理 → **游戏管理** → **赔率配置**:
|
||||
|
||||
| 类型 (type) | 目标 (target) | 赔率 (odds) | 说明 |
|
||||
|------------|--------------|------------|------|
|
||||
| chan | all | 0.96 | 双(偶)的赔率 |
|
||||
| le | all | 0.96 | 单(奇)的赔率 |
|
||||
| exact | 4red | 10.0 | 4红的赔率 |
|
||||
| exact | 4white | 10.0 | 4白的赔率 |
|
||||
| exact | 3red1white | 3.5 | 3红1白的赔率 |
|
||||
| exact | 3white1red | 3.5 | 3白1红的赔率 |
|
||||
|
||||
---
|
||||
|
||||
## 🎮 游戏流程
|
||||
|
||||
### 前台用户流程
|
||||
|
||||
1. **进入游戏**
|
||||
- 访问首页 → 点击 Xóc Đĩa 游戏卡片
|
||||
- 或直接访问:`http://yourdomain.com/live?game_id=X`(X为游戏ID)
|
||||
|
||||
2. **观看直播**
|
||||
- 页面左侧自动播放直播视频
|
||||
- 显示当前期号和倒计时
|
||||
|
||||
3. **下注**
|
||||
- 选择筹码金额(100K ~ 5M)
|
||||
- 点击投注区域(双/单 或 精确组合)
|
||||
- 可多次点击累加投注额
|
||||
- 点击"ĐẶT CƯỢC"确认,或"HỦY"取消
|
||||
|
||||
4. **等待开奖**
|
||||
- 倒计时结束后封盘
|
||||
- 荷官开奖
|
||||
- 自动结算并更新余额
|
||||
|
||||
### 后台管理流程
|
||||
|
||||
#### 开始新一轮
|
||||
|
||||
1. 登录后台管理 → **期号管理**
|
||||
2. 点击"开始下注"按钮
|
||||
3. 系统自动创建新期号(格式:`G{GameID}{YYYYMMDD}{NNNN}`)
|
||||
4. 前台用户可以开始投注(60秒倒计时)
|
||||
|
||||
#### 开奖
|
||||
|
||||
1. 倒计时结束或手动封盘
|
||||
2. 点击"开奖"按钮
|
||||
3. 选择开奖方式:
|
||||
- **手动输入**:逐个选择4个硬币的颜色(red/white)
|
||||
- **自动随机**:系统随机生成结果
|
||||
4. 确认开奖
|
||||
|
||||
**开奖结果存储格式**(JSON):
|
||||
```json
|
||||
["red", "white", "red", "red"] // 3红1白
|
||||
```
|
||||
|
||||
#### 结算
|
||||
|
||||
1. 点击"结算"按钮
|
||||
2. 系统自动:
|
||||
- 遍历所有待结算投注
|
||||
- 根据开奖结果判断输赢
|
||||
- 中奖用户:返还本金 + 盈利
|
||||
- 未中奖:不退还本金
|
||||
- 记录资金流水
|
||||
3. 期号状态变更为"已结算"
|
||||
4. 点击"开始下注"启动下一轮
|
||||
|
||||
---
|
||||
|
||||
## 🔧 技术实现细节
|
||||
|
||||
### 数据库字段复用
|
||||
|
||||
为避免修改数据库结构,Xóc Đĩa 游戏复用了 `periods` 表的骰子游戏字段:
|
||||
|
||||
| 字段名 | 骰子游戏 | Xóc Đĩa 游戏 |
|
||||
|-------|---------|------------|
|
||||
| `result` | "Xỉu/Tài" | JSON数组:`["red","white",...]` |
|
||||
| `dice1` | 骰子1点数 | 红色硬币数量 |
|
||||
| `dice2` | 骰子2点数 | 白色硬币数量 |
|
||||
| `dice3` | 骰子3点数 | `null` |
|
||||
| `total` | 三骰总和 | `null` |
|
||||
|
||||
### 投注数据结构
|
||||
|
||||
```json
|
||||
{
|
||||
"bets": [
|
||||
{
|
||||
"type": "chan", // 投注类型
|
||||
"value": "all", // 投注目标
|
||||
"amount": 100000, // 投注金额
|
||||
"odds": 0.96 // 赔率(从服务器获取)
|
||||
},
|
||||
{
|
||||
"type": "exact",
|
||||
"value": "4red",
|
||||
"amount": 500000,
|
||||
"odds": 10.0
|
||||
}
|
||||
],
|
||||
"period_number": "G2202601080001",
|
||||
"game_id": 2
|
||||
}
|
||||
```
|
||||
|
||||
### 开奖API调用示例
|
||||
|
||||
```javascript
|
||||
// 手动开奖
|
||||
fetch('/admin/periods/draw', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
id: 123, // 期号ID
|
||||
auto: false, // 手动模式
|
||||
coins: ['red', 'red', 'white', 'red'] // 4个硬币颜色
|
||||
})
|
||||
});
|
||||
|
||||
// 自动开奖
|
||||
fetch('/admin/periods/draw', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
id: 123,
|
||||
auto: true // 自动随机
|
||||
})
|
||||
});
|
||||
```
|
||||
|
||||
### 结算逻辑
|
||||
|
||||
```php
|
||||
// 中奖判断示例(checkWin 方法)
|
||||
$coins = json_decode($period['result'], true); // ["red", "red", "white", "red"]
|
||||
$redCount = count(array_filter($coins, fn($c) => $c === 'red')); // 3
|
||||
|
||||
// 判断 chan(双)
|
||||
if (in_array($redCount, [0, 2, 4])) {
|
||||
// 中奖:0红4白, 2红2白, 4红0白
|
||||
$winAmount = $betAmount * $odds;
|
||||
}
|
||||
|
||||
// 判断 exact(精确组合)
|
||||
if ($betValue === '3red1white' && $redCount === 3) {
|
||||
// 中奖:3红1白
|
||||
$winAmount = $betAmount * $odds;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 故障排查
|
||||
|
||||
### 问题1:前台看不到 Xóc Đĩa 游戏
|
||||
|
||||
**原因**:
|
||||
- 游戏未启用(status=0)
|
||||
- featured=0(不在大厅显示)
|
||||
|
||||
**解决**:
|
||||
```sql
|
||||
UPDATE games SET status=1, featured=1 WHERE code='xocdia';
|
||||
```
|
||||
|
||||
### 问题2:投注时提示"赔率无效"
|
||||
|
||||
**原因**:
|
||||
- `game_odds` 表缺少赔率配置
|
||||
|
||||
**解决**:
|
||||
```bash
|
||||
# 重新执行初始化脚本
|
||||
mysql -u用户名 -p数据库名 < Db/xocdia_setup.sql
|
||||
```
|
||||
|
||||
### 问题3:开奖后前台显示错误
|
||||
|
||||
**原因**:
|
||||
- `result` 字段不是有效的 JSON 数组
|
||||
|
||||
**解决**:
|
||||
```sql
|
||||
-- 检查 result 字段格式
|
||||
SELECT id, result FROM periods WHERE game_id=2 LIMIT 5;
|
||||
|
||||
-- 应该是:["red","white","red","red"] 格式
|
||||
-- 如果不是,手动修正
|
||||
UPDATE periods SET result='["red","red","white","white"]' WHERE id=XXX;
|
||||
```
|
||||
|
||||
### 问题4:结算失败
|
||||
|
||||
**原因**:
|
||||
- 期号状态不是 'drawn'
|
||||
- 事务回滚
|
||||
|
||||
**解决**:
|
||||
1. 检查日志:`Storage/log/error.log`
|
||||
2. 检查期号状态:
|
||||
```sql
|
||||
SELECT id, period_number, status FROM periods WHERE id=XXX;
|
||||
```
|
||||
3. 手动修复状态:
|
||||
```sql
|
||||
UPDATE periods SET status='drawn' WHERE id=XXX;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 性能优化建议
|
||||
|
||||
### 1. 赔率缓存
|
||||
|
||||
当前实现已使用静态缓存,避免重复查询:
|
||||
```php
|
||||
static $oddsCache = [];
|
||||
```
|
||||
|
||||
### 2. 期号索引
|
||||
|
||||
确保数据库有以下索引:
|
||||
```sql
|
||||
CREATE INDEX idx_period_status ON periods(status);
|
||||
CREATE INDEX idx_period_game ON periods(game_id, status);
|
||||
CREATE INDEX idx_bet_period ON bets(period_id, status);
|
||||
```
|
||||
|
||||
### 3. 定时清理
|
||||
|
||||
建议每月清理已结算的旧期号和投注记录:
|
||||
```sql
|
||||
-- 保留最近30天的记录
|
||||
DELETE FROM periods WHERE status='settled' AND created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
|
||||
DELETE FROM bets WHERE status IN ('win','lose') AND created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 未来扩展
|
||||
|
||||
### 可能的功能增强
|
||||
|
||||
1. **统计数据**
|
||||
- 历史开奖记录(路单)
|
||||
- 热门投注统计
|
||||
- 玩家胜率分析
|
||||
|
||||
2. **游戏变体**
|
||||
- 支持自定义硬币图案
|
||||
- 支持更多投注类型(如:颜色顺序)
|
||||
|
||||
3. **自动化**
|
||||
- 自动开奖(对接硬件或视频识别)
|
||||
- 自动封盘(基于倒计时)
|
||||
|
||||
---
|
||||
|
||||
## ✅ 集成检查清单
|
||||
|
||||
部署前请确认:
|
||||
|
||||
- [ ] SQL 脚本已执行,游戏和赔率已创建
|
||||
- [ ] 后台游戏管理中 Xóc Đĩa 状态为"启用"
|
||||
- [ ] 已配置直播流地址(或留空测试)
|
||||
- [ ] 前台可以正常访问游戏页面
|
||||
- [ ] 测试完整流程:创建期号 → 投注 → 开奖 → 结算
|
||||
- [ ] 数据库备份已创建
|
||||
|
||||
---
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如遇到问题,请检查:
|
||||
1. `Storage/log/error.log` - PHP 错误日志
|
||||
2. 浏览器开发者工具 Console - 前端错误
|
||||
3. 数据库查询日志 - SQL 错误
|
||||
|
||||
**相关文件**:
|
||||
- 数据库脚本:`Db/xocdia_setup.sql`
|
||||
- 前端组件:`App/Views/Web/components/xocdia-bet-panel.php`
|
||||
- 后端控制器:
|
||||
- `App/Controllers/Web/HomeController.php` (live方法)
|
||||
- `App/Controllers/Web/BetController.php` (placeBet方法)
|
||||
- `App/Controllers/Admin/PeriodController.php` (draw/settle方法)
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2026-01-08
|
||||
**版本**: 1.0.0
|
||||
Reference in New Issue
Block a user