feat: 赛马游戏调整 - 允许自马下注 & 取消非冠军参赛奖励
- 移除下注时不能给自己马匹下注的限制 - 非冠军马主不再获得参赛奖励积分(PARTICIPANT_REWARD=0) - 同步更新帮助文本、README文档和config默认值
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
这是一个完整的群组赛马游戏系统,支持以下核心功能:
|
这是一个完整的群组赛马游戏系统,支持以下核心功能:
|
||||||
|
|
||||||
- **马匹报名**:用户可以报名参加赛马比赛
|
- **马匹报名**:用户可以报名参加赛马比赛
|
||||||
- **下注系统**:支持用户对参赛马匹进行下注
|
- **下注系统**:支持用户对任意参赛马匹进行下注(含自己的马)
|
||||||
- **自动比赛**:基于随机算法的赛马进程模拟
|
- **自动比赛**:基于随机算法的赛马进程模拟
|
||||||
- **积分集成**:与 danding_points 积分系统无缝集成
|
- **积分集成**:与 danding_points 积分系统无缝集成
|
||||||
- **自动撤回**:支持配置消息自动撤回时间
|
- **自动撤回**:支持配置消息自动撤回时间
|
||||||
@@ -47,7 +47,7 @@ GROUP_HORSE_RACING_ALLOWED_GROUPS=[]
|
|||||||
|
|
||||||
| 配置项 | 默认值 | 说明 |
|
| 配置项 | 默认值 | 说明 |
|
||||||
|--------|--------|------|
|
|--------|--------|------|
|
||||||
| `PARTICIPANT_REWARD` | 50 | 参赛者奖励积分 |
|
| `PARTICIPANT_REWARD` | 0 | 参赛者奖励积分(已禁用) |
|
||||||
| `CHAMPION_REWARD` | 200 | 冠军奖励积分 |
|
| `CHAMPION_REWARD` | 200 | 冠军奖励积分 |
|
||||||
| `MIN_BET` | 10 | 最小下注积分 |
|
| `MIN_BET` | 10 | 最小下注积分 |
|
||||||
| `MIN_ODDS` | 1.2 | 最小赔率 |
|
| `MIN_ODDS` | 1.2 | 最小赔率 |
|
||||||
@@ -143,12 +143,13 @@ RACE_DB_FILE = "data/group_horse_racing/race.db"
|
|||||||
1. **报名阶段**
|
1. **报名阶段**
|
||||||
- 用户执行 `/赛马报名` 命令
|
- 用户执行 `/赛马报名` 命令
|
||||||
- 系统检查权限和房间容量(最多8匹马)
|
- 系统检查权限和房间容量(最多8匹马)
|
||||||
- 成功报名后获得参赛奖励
|
- 成功报名
|
||||||
|
|
||||||
2. **下注阶段**
|
2. **下注阶段**
|
||||||
- 用户可对参赛马匹进行下注
|
- 用户可对参赛马匹进行下注
|
||||||
- 下注金额需满足最小下注要求
|
- 下注金额需满足最小下注要求
|
||||||
- 下注积分从用户账户扣除
|
- 下注积分从用户账户扣除
|
||||||
|
- 可以给自己的马下注
|
||||||
|
|
||||||
3. **比赛阶段**
|
3. **比赛阶段**
|
||||||
- 房主执行 `/赛马开赛` 命令
|
- 房主执行 `/赛马开赛` 命令
|
||||||
@@ -158,7 +159,7 @@ RACE_DB_FILE = "data/group_horse_racing/race.db"
|
|||||||
|
|
||||||
4. **结算阶段**
|
4. **结算阶段**
|
||||||
- 冠军获得冠军奖励
|
- 冠军获得冠军奖励
|
||||||
- 下注冠军的用户获得中奖积分
|
- 中奖用户获得下注奖金(下注金额 × 赔率)
|
||||||
- 比赛结果保存到数据库
|
- 比赛结果保存到数据库
|
||||||
|
|
||||||
## 权限控制
|
## 权限控制
|
||||||
|
|||||||
@@ -153,10 +153,6 @@ def _build_point_changes(room: Room, odds: dict[str, float]) -> tuple[dict[str,
|
|||||||
if champion:
|
if champion:
|
||||||
point_changes[champion.owner_id] = point_changes.get(champion.owner_id, 0) + config.CHAMPION_REWARD
|
point_changes[champion.owner_id] = point_changes.get(champion.owner_id, 0) + config.CHAMPION_REWARD
|
||||||
|
|
||||||
for horse in room.horses.values():
|
|
||||||
if champion and horse.owner_id != champion.owner_id:
|
|
||||||
point_changes[horse.owner_id] = point_changes.get(horse.owner_id, 0) + config.PARTICIPANT_REWARD
|
|
||||||
|
|
||||||
for bet in room.bets:
|
for bet in room.bets:
|
||||||
if bet.horse_name == room.champion_name:
|
if bet.horse_name == room.champion_name:
|
||||||
payout = int(bet.amount * odds.get(bet.horse_name, config.MIN_ODDS))
|
payout = int(bet.amount * odds.get(bet.horse_name, config.MIN_ODDS))
|
||||||
@@ -209,11 +205,6 @@ async def settle_race(room: Room) -> RaceResult | None:
|
|||||||
# Reward champion owner
|
# Reward champion owner
|
||||||
await points_service.reward_champion(champion.owner_id)
|
await points_service.reward_champion(champion.owner_id)
|
||||||
|
|
||||||
# Reward all participants
|
|
||||||
for horse in room.horses.values():
|
|
||||||
if horse.owner_id != champion.owner_id:
|
|
||||||
await points_service.reward_participant(horse.owner_id)
|
|
||||||
|
|
||||||
# Settle bets
|
# Settle bets
|
||||||
odds = calculate_odds(room)
|
odds = calculate_odds(room)
|
||||||
for bet in room.bets:
|
for bet in room.bets:
|
||||||
@@ -453,10 +444,6 @@ async def handle_bet(bot: Bot, event: Event):
|
|||||||
await bet_cmd.finish(f"马匹序号/名称 \"{horse_selector}\" 不存在")
|
await bet_cmd.finish(f"马匹序号/名称 \"{horse_selector}\" 不存在")
|
||||||
return
|
return
|
||||||
|
|
||||||
if horse.owner_id == user_id:
|
|
||||||
await bet_cmd.finish("不能给自己的马下注")
|
|
||||||
return
|
|
||||||
|
|
||||||
success, balance = await points_service.spend_bet_points(user_id, amount, f"下注 {_format_horse_label(horse)}")
|
success, balance = await points_service.spend_bet_points(user_id, amount, f"下注 {_format_horse_label(horse)}")
|
||||||
if not success:
|
if not success:
|
||||||
await bet_cmd.finish(f"积分不足(当前余额:{balance})")
|
await bet_cmd.finish(f"积分不足(当前余额:{balance})")
|
||||||
@@ -550,7 +537,7 @@ async def handle_help(bot: Bot, event: Event):
|
|||||||
/赛马报名 <马匹名> - 报名参赛(最多8匹马)
|
/赛马报名 <马匹名> - 报名参赛(最多8匹马)
|
||||||
/赛马报名 - 复用上一次绑定的马名报名
|
/赛马报名 - 复用上一次绑定的马名报名
|
||||||
/赛马取消报名 - 取消报名并退还下注
|
/赛马取消报名 - 取消报名并退还下注
|
||||||
/赛马下注 <序号|马匹名> <金额> - 下注(不能给自己的马下注)
|
/赛马下注 <序号|马匹名> <金额> - 下注
|
||||||
/赛马赔率 - 查看当前赔率和下注池
|
/赛马赔率 - 查看当前赔率和下注池
|
||||||
/赛马开赛 - 开始比赛(至少2匹马)
|
/赛马开赛 - 开始比赛(至少2匹马)
|
||||||
/赛马帮助 - 显示此帮助
|
/赛马帮助 - 显示此帮助
|
||||||
@@ -559,11 +546,9 @@ async def handle_help(bot: Bot, event: Event):
|
|||||||
• 最低下注金额:{config.MIN_BET} 积分
|
• 最低下注金额:{config.MIN_BET} 积分
|
||||||
• 参赛马匹上限:8匹
|
• 参赛马匹上限:8匹
|
||||||
• 开赛要求:至少2匹马报名
|
• 开赛要求:至少2匹马报名
|
||||||
• 不能给自己的马下注
|
|
||||||
|
|
||||||
💰 奖励机制:
|
💰 奖励机制:
|
||||||
• 冠军马主:获得 {config.CHAMPION_REWARD} 积分
|
• 冠军马主:获得 {config.CHAMPION_REWARD} 积分
|
||||||
• 参赛马主:获得 {config.PARTICIPANT_REWARD} 积分
|
|
||||||
• 下注中奖:下注金额 × 赔率
|
• 下注中奖:下注金额 × 赔率
|
||||||
|
|
||||||
📊 赔率说明:
|
📊 赔率说明:
|
||||||
@@ -573,7 +558,7 @@ async def handle_help(bot: Bot, event: Event):
|
|||||||
|
|
||||||
🎮 游戏流程:
|
🎮 游戏流程:
|
||||||
1️⃣ 玩家报名并绑定马匹名
|
1️⃣ 玩家报名并绑定马匹名
|
||||||
2️⃣ 玩家可以给其他玩家的马下注
|
2️⃣ 玩家可以给任意马匹下注
|
||||||
3️⃣ 满足开赛条件后,任意玩家可开赛
|
3️⃣ 满足开赛条件后,任意玩家可开赛
|
||||||
4️⃣ 比赛实时进行,定期播报进度
|
4️⃣ 比赛实时进行,定期播报进度
|
||||||
5️⃣ 比赛结束后结算积分和奖金"""
|
5️⃣ 比赛结束后结算积分和奖金"""
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class Config(BaseSettings):
|
|||||||
ALLOWED_GROUPS: set[int] = Field(default_factory=set)
|
ALLOWED_GROUPS: set[int] = Field(default_factory=set)
|
||||||
|
|
||||||
# 奖励配置
|
# 奖励配置
|
||||||
PARTICIPANT_REWARD: int = 50
|
PARTICIPANT_REWARD: int = 0
|
||||||
CHAMPION_REWARD: int = 200
|
CHAMPION_REWARD: int = 200
|
||||||
MIN_BET: int = 10
|
MIN_BET: int = 10
|
||||||
MIN_ODDS: float = 1.2
|
MIN_ODDS: float = 1.2
|
||||||
|
|||||||
Reference in New Issue
Block a user