From 9e16774d2fd7d415a3d07a41c144ec89a48fad65 Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Fri, 31 Oct 2025 15:39:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D21=E7=82=B9=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E7=BB=93=E7=AE=97=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .tasks/2025-10-30_1_add_casino_games.md | 29 ++++++++++++++++++++++++- core/database.py | 19 ++++++++++++---- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/.tasks/2025-10-30_1_add_casino_games.md b/.tasks/2025-10-30_1_add_casino_games.md index d43f555..ff00976 100644 --- a/.tasks/2025-10-30_1_add_casino_games.md +++ b/.tasks/2025-10-30_1_add_casino_games.md @@ -471,7 +471,34 @@ if game_type == 'casino': - 修改create_casino_session():支持单场限制检查(get_any_active_casino_session)和新字段 - 扩展create_casino_bet():支持轮盘和21点专用字段参数 - 添加21点手牌管理方法:create_blackjack_hand、get_blackjack_hand、update_blackjack_hand、get_all_blackjack_hands -- 原因:为轮盘和21点游戏提供数据库支持,确保字段分离和向后兼容 + - 原因:为轮盘和21点游戏提供数据库支持,确保字段分离和向后兼容 + - 阻碍因素:无 + - 状态:成功 + +[2025-10-31_15:15:08] +- 已修改:core/database.py +- 更改:修复大小游戏结算时的UNIQUE约束冲突问题 + - 移除casino_sessions表的UNIQUE(chat_id, game_type, status)约束 + - 原因:status='closed'时需要允许多条历史记录,UNIQUE约束阻止了结算时更新status + - 添加兼容性迁移逻辑:检测旧版本表结构,自动重建表以移除UNIQUE约束 + - 迁移时复制所有历史数据,处理外键关系(临时禁用/启用外键检查) + - 单场限制通过应用层逻辑(get_any_active_casino_session)保证 +- 原因:用户测试大小游戏结算时遇到"UNIQUE constraint failed"错误 +- 阻碍因素:无 +- 状态:成功 + +[2025-10-31_15:15:08] +- 已修改:core/database.py +- 更改:修复21点游戏结算逻辑问题 + - 修正losers统计逻辑:将条件从`not player_is_busted and player_points != banker_points`改为`player_points != banker_points` + - 原因:原条件排除了爆牌玩家,导致爆牌玩家未被统计到losers列表 + - 修正数据库更新逻辑:明确区分三种情况 + - 赢家:发放奖励并更新数据库 + - 平局(player_points == banker_points):已返还下注,更新数据库 + - 输家(else分支,包括爆牌和点数小于庄家):更新数据库 + - 改进结果字符串显示:包含玩家和庄家的状态信息(爆牌、黑杰克等) + - 例如:"庄家19点 vs 玩家爆牌" 或 "庄家19点 vs 玩家20点(黑杰克)" +- 原因:用户测试21点游戏时发现3人游戏中只有1个赢家被结算,1个爆牌玩家和1个平局玩家未被结算 - 阻碍因素:无 - 状态:成功 diff --git a/core/database.py b/core/database.py index 39beae5..0485c14 100644 --- a/core/database.py +++ b/core/database.py @@ -1283,7 +1283,8 @@ class Database: 'bet_id': bet['id'] }) total_win += actual_win - elif not player_is_busted and player_points != banker_points: + elif player_points != banker_points: + # 输家:包括爆牌或点数小于庄家 losers.append({ 'user_id': user_id, 'amount': bet['amount'], @@ -1322,7 +1323,16 @@ class Database: self.add_points(user_id, bet['amount'], 'casino_blackjack_push', "21点游戏平局,返还下注") - result_str = f"庄家{banker_points}点 vs 玩家{player_points}点" + # 生成结果字符串,包含玩家状态信息 + if player_is_busted: + player_desc = "爆牌" + elif player_is_blackjack: + player_desc = f"{player_points}点(黑杰克)" + else: + player_desc = f"{player_points}点" + + banker_desc = "爆牌" if banker_is_busted else (f"{banker_points}点(黑杰克)" if banker_is_blackjack else f"{banker_points}点") + result_str = f"庄家{banker_desc} vs 玩家{player_desc}" if is_win: win_amount = int(bet['amount'] * multiplier) @@ -1334,14 +1344,15 @@ class Database: SET status = 'settled', result = ?, win_amount = ?, settled_at = ? WHERE id = ? """, (result_str, actual_win, current_time, bet['id'])) - elif not player_is_busted and player_points != banker_points: + elif player_points == banker_points: + # 平局,已返还下注(在上面的逻辑中已处理) cursor.execute(""" UPDATE casino_bets SET status = 'settled', result = ?, settled_at = ? WHERE id = ? """, (result_str, current_time, bet['id'])) else: - # 平局,已返还下注 + # 输家:包括爆牌或点数小于庄家 cursor.execute(""" UPDATE casino_bets SET status = 'settled', result = ?, settled_at = ?