feat: 赛马游戏调整 - 允许自马下注 & 取消非冠军参赛奖励

- 移除下注时不能给自己马匹下注的限制
- 非冠军马主不再获得参赛奖励积分(PARTICIPANT_REWARD=0)
- 同步更新帮助文本、README文档和config默认值
This commit is contained in:
2026-04-05 21:25:10 +08:00
parent ff8cf611af
commit e773a7a1ef
3 changed files with 8 additions and 22 deletions

View File

@@ -7,7 +7,7 @@
这是一个完整的群组赛马游戏系统,支持以下核心功能:
- **马匹报名**:用户可以报名参加赛马比赛
- **下注系统**:支持用户对参赛马匹进行下注
- **下注系统**:支持用户对任意参赛马匹进行下注(含自己的马)
- **自动比赛**:基于随机算法的赛马进程模拟
- **积分集成**:与 danding_points 积分系统无缝集成
- **自动撤回**:支持配置消息自动撤回时间
@@ -47,7 +47,7 @@ GROUP_HORSE_RACING_ALLOWED_GROUPS=[]
| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| `PARTICIPANT_REWARD` | 50 | 参赛者奖励积分 |
| `PARTICIPANT_REWARD` | 0 | 参赛者奖励积分(已禁用) |
| `CHAMPION_REWARD` | 200 | 冠军奖励积分 |
| `MIN_BET` | 10 | 最小下注积分 |
| `MIN_ODDS` | 1.2 | 最小赔率 |
@@ -143,12 +143,13 @@ RACE_DB_FILE = "data/group_horse_racing/race.db"
1. **报名阶段**
- 用户执行 `/赛马报名` 命令
- 系统检查权限和房间容量最多8匹马
- 成功报名后获得参赛奖励
- 成功报名
2. **下注阶段**
- 用户可对参赛马匹进行下注
- 下注金额需满足最小下注要求
- 下注积分从用户账户扣除
- 可以给自己的马下注
3. **比赛阶段**
- 房主执行 `/赛马开赛` 命令
@@ -158,7 +159,7 @@ RACE_DB_FILE = "data/group_horse_racing/race.db"
4. **结算阶段**
- 冠军获得冠军奖励
- 下注冠军的用户获得中奖积分
- 中奖用户获得下注奖金(下注金额 × 赔率)
- 比赛结果保存到数据库
## 权限控制

View File

@@ -153,10 +153,6 @@ def _build_point_changes(room: Room, odds: dict[str, float]) -> tuple[dict[str,
if champion:
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:
if bet.horse_name == room.champion_name:
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
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
odds = calculate_odds(room)
for bet in room.bets:
@@ -453,10 +444,6 @@ async def handle_bet(bot: Bot, event: Event):
await bet_cmd.finish(f"马匹序号/名称 \"{horse_selector}\" 不存在")
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)}")
if not success:
await bet_cmd.finish(f"积分不足(当前余额:{balance}")
@@ -550,7 +537,7 @@ async def handle_help(bot: Bot, event: Event):
/赛马报名 <马匹名> - 报名参赛最多8匹马
/赛马报名 - 复用上一次绑定的马名报名
/赛马取消报名 - 取消报名并退还下注
/赛马下注 <序号|马匹名> <金额> - 下注(不能给自己的马下注)
/赛马下注 <序号|马匹名> <金额> - 下注
/赛马赔率 - 查看当前赔率和下注池
/赛马开赛 - 开始比赛至少2匹马
/赛马帮助 - 显示此帮助
@@ -559,11 +546,9 @@ async def handle_help(bot: Bot, event: Event):
• 最低下注金额:{config.MIN_BET} 积分
• 参赛马匹上限8匹
• 开赛要求至少2匹马报名
• 不能给自己的马下注
💰 奖励机制:
• 冠军马主:获得 {config.CHAMPION_REWARD} 积分
• 参赛马主:获得 {config.PARTICIPANT_REWARD} 积分
• 下注中奖:下注金额 × 赔率
📊 赔率说明:
@@ -573,7 +558,7 @@ async def handle_help(bot: Bot, event: Event):
🎮 游戏流程:
1⃣ 玩家报名并绑定马匹名
2⃣ 玩家可以给其他玩家的马下注
2⃣ 玩家可以给任意马匹下注
3⃣ 满足开赛条件后,任意玩家可开赛
4⃣ 比赛实时进行,定期播报进度
5⃣ 比赛结束后结算积分和奖金"""

View File

@@ -16,7 +16,7 @@ class Config(BaseSettings):
ALLOWED_GROUPS: set[int] = Field(default_factory=set)
# 奖励配置
PARTICIPANT_REWARD: int = 50
PARTICIPANT_REWARD: int = 0
CHAMPION_REWARD: int = 200
MIN_BET: int = 10
MIN_ODDS: float = 1.2