修复21点中的结算错误
This commit is contained in:
@@ -471,7 +471,34 @@ if game_type == 'casino':
|
|||||||
- 修改create_casino_session():支持单场限制检查(get_any_active_casino_session)和新字段
|
- 修改create_casino_session():支持单场限制检查(get_any_active_casino_session)和新字段
|
||||||
- 扩展create_casino_bet():支持轮盘和21点专用字段参数
|
- 扩展create_casino_bet():支持轮盘和21点专用字段参数
|
||||||
- 添加21点手牌管理方法:create_blackjack_hand、get_blackjack_hand、update_blackjack_hand、get_all_blackjack_hands
|
- 添加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个平局玩家未被结算
|
||||||
- 阻碍因素:无
|
- 阻碍因素:无
|
||||||
- 状态:成功
|
- 状态:成功
|
||||||
|
|
||||||
|
|||||||
@@ -1283,7 +1283,8 @@ class Database:
|
|||||||
'bet_id': bet['id']
|
'bet_id': bet['id']
|
||||||
})
|
})
|
||||||
total_win += actual_win
|
total_win += actual_win
|
||||||
elif not player_is_busted and player_points != banker_points:
|
elif player_points != banker_points:
|
||||||
|
# 输家:包括爆牌或点数小于庄家
|
||||||
losers.append({
|
losers.append({
|
||||||
'user_id': user_id,
|
'user_id': user_id,
|
||||||
'amount': bet['amount'],
|
'amount': bet['amount'],
|
||||||
@@ -1322,7 +1323,16 @@ class Database:
|
|||||||
self.add_points(user_id, bet['amount'], 'casino_blackjack_push',
|
self.add_points(user_id, bet['amount'], 'casino_blackjack_push',
|
||||||
"21点游戏平局,返还下注")
|
"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:
|
if is_win:
|
||||||
win_amount = int(bet['amount'] * multiplier)
|
win_amount = int(bet['amount'] * multiplier)
|
||||||
@@ -1334,14 +1344,15 @@ class Database:
|
|||||||
SET status = 'settled', result = ?, win_amount = ?, settled_at = ?
|
SET status = 'settled', result = ?, win_amount = ?, settled_at = ?
|
||||||
WHERE id = ?
|
WHERE id = ?
|
||||||
""", (result_str, actual_win, current_time, bet['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("""
|
cursor.execute("""
|
||||||
UPDATE casino_bets
|
UPDATE casino_bets
|
||||||
SET status = 'settled', result = ?, settled_at = ?
|
SET status = 'settled', result = ?, settled_at = ?
|
||||||
WHERE id = ?
|
WHERE id = ?
|
||||||
""", (result_str, current_time, bet['id']))
|
""", (result_str, current_time, bet['id']))
|
||||||
else:
|
else:
|
||||||
# 平局,已返还下注
|
# 输家:包括爆牌或点数小于庄家
|
||||||
cursor.execute("""
|
cursor.execute("""
|
||||||
UPDATE casino_bets
|
UPDATE casino_bets
|
||||||
SET status = 'settled', result = ?, settled_at = ?
|
SET status = 'settled', result = ?, settled_at = ?
|
||||||
|
|||||||
Reference in New Issue
Block a user