diff --git a/.tasks/2025-10-30_1_add_casino_games.md b/.tasks/2025-10-30_1_add_casino_games.md index e0d91c2..216f9e2 100644 --- a/.tasks/2025-10-30_1_add_casino_games.md +++ b/.tasks/2025-10-30_1_add_casino_games.md @@ -439,5 +439,27 @@ if game_type == 'casino': - 阻碍因素:无 - 状态:成功 +[2025-10-30_17:20:00](预估时间) +- 已修改:games/casino.py +- 更改:修改结算逻辑,从庄家指定结果改为系统随机生成 + - 移除庄家输入种子/结果的参数 + - 使用random.random()生成随机结果(50%大/50%小) + - 更新帮助信息,settle命令不再需要参数 +- 原因:用户反馈庄家不应该能够操控游戏结果,庄家也是玩家 +- 阻碍因素:无 +- 状态:成功 + +[2025-10-30_17:26:19] +- 已修改:games/casino.py, games/base.py +- 更改:添加庄家放弃游戏功能 + - 新增_cancel_bigsmall()方法处理放弃逻辑 + - 放弃时返还所有玩家下注 + - 关闭会话并标记下注为cancelled + - 添加cancel命令支持(cancel/放弃/关闭) + - 更新帮助信息和base.py中的帮助 +- 原因:用户要求庄家可以放弃本轮游戏 +- 阻碍因素:无 +- 状态:成功 + # 最终审查 待完成 diff --git a/games/base.py b/games/base.py index a75a4f6..9c213a5 100644 --- a/games/base.py +++ b/games/base.py @@ -117,7 +117,8 @@ def get_help_message() -> str: - `.赌场 大小 open <最小> <最大> <赔率>` - 庄家开启大小游戏 - `.赌场 大小 bet <大/小> <金额>` - 下注 - `.赌场 大小 status` - 查看状态 -- `.赌场 大小 settle <大/小>` - 庄家结算 +- `.赌场 大小 settle` - 庄家结算(系统随机) +- `.赌场 大小 cancel` - 庄家放弃游戏(返还下注) ### 其他 - `.help` - 显示帮助 diff --git a/games/casino.py b/games/casino.py index 919fb83..8bfa8dc 100644 --- a/games/casino.py +++ b/games/casino.py @@ -1,5 +1,6 @@ """赌场游戏模块""" import logging +import random from games.base import BaseGame from utils.parser import CommandParser from core.database import get_db @@ -79,6 +80,8 @@ class CasinoGame(BaseGame): return await self._status_bigsmall(chat_id) elif action in ['settle', '结算', '开奖']: return await self._settle_bigsmall(sub_args, chat_id, user_id) + elif action in ['cancel', '放弃', '关闭']: + return await self._cancel_bigsmall(chat_id, user_id) elif action in ['help', '帮助']: return self._get_bigsmall_help() else: @@ -258,15 +261,15 @@ class CasinoGame(BaseGame): text += f"- 压小:{bet_small} 分({len([b for b in bets if b['bet_type'] == '小'])}注)\n" text += f"- 总下注:{len(bets)} 注\n\n" text += "---\n\n" - text += "💡 庄家可以使用 `.赌场 大小 settle <大/小>` 结算" + text += "💡 庄家可以使用 `.赌场 大小 settle` 结算" return text async def _settle_bigsmall(self, args: str, chat_id: int, user_id: int) -> str: - """庄家结算游戏 + """庄家结算游戏(系统随机生成结果) Args: - args: 结果 "<大/小>" + args: 无参数 chat_id: 会话ID user_id: 用户ID @@ -274,19 +277,16 @@ class CasinoGame(BaseGame): 结算结果消息 """ try: - if not args: - return "❌ 请指定结算结果!\n\n正确格式:`.赌场 大小 settle <大/小>`" - - result = args.strip() - if result not in ['大', '小']: - return f"❌ 结果类型错误!只支持'大'或'小',您输入的是:{result}" + # 不需要参数,系统自动随机生成结果 + # 使用系统随机数决定大小(50%概率) + result = '大' if random.random() > 0.5 else '小' # 结算 settlement = self.db.settle_casino_bets(chat_id, '大小', result, user_id) # 构建结算报告 text = f"## 🎰 大小游戏结算\n\n" - text += f"**结算结果**:{result}\n\n" + text += f"**结算结果**:🎲 {result}\n\n" text += "---\n\n" text += f"**赢家**:{len(settlement['winners'])} 人\n" text += f"**输家**:{len(settlement['losers'])} 人\n\n" @@ -316,6 +316,62 @@ class CasinoGame(BaseGame): logger.error(f"结算失败: {e}", exc_info=True) return f"❌ 结算失败: {str(e)}" + async def _cancel_bigsmall(self, chat_id: int, user_id: int) -> str: + """庄家放弃本轮游戏 + + Args: + chat_id: 会话ID + user_id: 用户ID + + Returns: + 放弃结果消息 + """ + try: + # 检查是否有活跃的会话 + session = self.db.get_active_casino_session(chat_id, '大小') + if not session: + return "❌ 当前没有进行中的游戏" + + # 验证是否为庄家 + if session['banker_id'] != user_id: + return "❌ 只有庄家可以放弃游戏" + + # 获取所有待结算下注 + bets = self.db.get_pending_bets(chat_id, '大小') + + # 返还所有下注的积分 + return_amount = 0 + for bet in bets: + # 返还积分 + self.db.add_points(bet['user_id'], bet['amount'], 'casino_cancel', + "庄家放弃游戏,返还下注") + return_amount += bet['amount'] + + # 关闭会话(不结算,返还积分) + self.db.close_casino_session(chat_id, '大小') + + # 标记下注为已取消 + cursor = self.db.conn.cursor() + cursor.execute(""" + UPDATE casino_bets + SET status = 'cancelled' + WHERE chat_id = ? AND game_type = ? AND status = 'pending' + """, (chat_id, '大小')) + + # 构建报告 + text = f"## 🎰 游戏已放弃\n\n" + text += f"**庄家**:用户{user_id}\n\n" + text += f"**总返还积分**:{return_amount} 分\n\n" + text += f"**返还人数**:{len(bets)} 人\n\n" + text += "---\n\n" + text += "✅ 所有下注已返还,游戏已关闭" + + return text + + except Exception as e: + logger.error(f"放弃游戏失败: {e}", exc_info=True) + return f"❌ 放弃游戏失败: {str(e)}" + def _get_bigsmall_help(self) -> str: """获取大小游戏帮助信息""" return """## 🎰 大小游戏帮助 @@ -323,6 +379,8 @@ class CasinoGame(BaseGame): ### 庄家命令 - `.赌场 大小 open <最小> <最大> <赔率>` - 开启游戏 - 示例:`.赌场 大小 open 10 100 2.0` +- `.赌场 大小 settle` - 结算游戏(系统随机生成结果) +- `.赌场 大小 cancel` - 放弃游戏(返还所有下注) ### 玩家命令 - `.赌场 大小 bet <大/小> <金额>` - 下注 @@ -331,11 +389,11 @@ class CasinoGame(BaseGame): ### 通用命令 - `.赌场 大小 status` - 查看当前状态 -- `.赌场 大小 settle <大/小>` - 庄家结算(仅庄家) ### 游戏规则 - 玩家下注后积分立即扣除 - 结算后根据结果发放奖励 +- 庄家放弃游戏时,所有下注全额返还 - 系统抽水5% - 赔率由庄家设置 """