This commit is contained in:
2025-10-31 11:58:35 +08:00
parent 7962852685
commit cef684f64b
3 changed files with 573 additions and 8 deletions

View File

@@ -44,10 +44,14 @@ class CasinoGame(BaseGame):
# 根据游戏类型分发
if game_type == '大小':
return await self._handle_bigsmall(sub_args, chat_id, user_id)
elif game_type == '轮盘':
return await self._handle_roulette(sub_args, chat_id, user_id)
elif game_type in ['21点', 'blackjack', '21']:
return await self._handle_blackjack(sub_args, chat_id, user_id)
elif game_type in ['help', '帮助']:
return self.get_help()
else:
return f"❌ 暂不支持的游戏类型: {game_type}\n\n支持的类型:大小"
return f"❌ 暂不支持的游戏类型: {game_type}\n\n支持的类型:大小、轮盘、21点"
except Exception as e:
logger.error(f"处理赌场指令错误: {e}", exc_info=True)
@@ -124,10 +128,10 @@ class CasinoGame(BaseGame):
if max_bet > 10000:
return "❌ 最大下注不能超过10000分"
# 检查是否已有活跃游戏
existing = self.db.get_active_casino_session(chat_id, '大小')
# 检查是否已有活跃游戏(单场限制)
existing = self.db.get_any_active_casino_session(chat_id)
if existing:
return "⚠️ 当前已有进行中的大小游戏,请先结算后再开启新游戏。"
return f"⚠️ 当前已有进行中的游戏{existing['game_type']},请先结算后再开启新游戏。"
# 创建游戏会话
session_id = self.db.create_casino_session(
@@ -405,5 +409,199 @@ class CasinoGame(BaseGame):
def get_help(self) -> str:
"""获取帮助信息"""
return self._get_bigsmall_help()
text = "# 🎰 赌场游戏帮助\n\n"
text += self._get_bigsmall_help() + "\n\n"
text += self._get_roulette_help() + "\n\n"
text += self._get_blackjack_help()
return text
# ===== 轮盘游戏 =====
async def _handle_roulette(self, args: str, chat_id: int, user_id: int) -> str:
"""处理轮盘游戏
Args:
args: 子命令和参数
chat_id: 会话ID
user_id: 用户ID
Returns:
回复消息
"""
if not args:
return self._get_roulette_help()
parts = args.split(maxsplit=1)
action = parts[0].lower()
sub_args = parts[1] if len(parts) > 1 else ""
if action in ['open', '开启', '开始']:
return await self._open_roulette(sub_args, chat_id, user_id)
elif action in ['bet', '下注', '']:
return await self._bet_roulette(sub_args, chat_id, user_id)
elif action in ['status', '状态', '查看']:
return await self._status_roulette(chat_id)
elif action in ['settle', '结算', '开奖']:
return await self._settle_roulette(chat_id, user_id)
elif action in ['cancel', '放弃', '关闭']:
return await self._cancel_roulette(chat_id, user_id)
elif action in ['help', '帮助']:
return self._get_roulette_help()
else:
return f"❌ 未知命令: {action}\n\n{self._get_roulette_help()}"
async def _open_roulette(self, args: str, chat_id: int, user_id: int) -> str:
"""庄家开启轮盘游戏"""
try:
parts = args.split()
if len(parts) != 2:
return "❌ 参数格式错误!\n\n正确格式:`.赌场 轮盘 open <最小下注> <最大下注>`\n\n示例:`.赌场 轮盘 open 10 100`"
try:
min_bet = int(parts[0])
max_bet = int(parts[1])
except ValueError:
return "❌ 参数必须是数字!"
if min_bet <= 0 or max_bet <= 0:
return "❌ 下注金额必须大于0"
if min_bet > max_bet:
return "❌ 最小下注不能大于最大下注!"
if max_bet > 10000:
return "❌ 最大下注不能超过10000分"
existing = self.db.get_any_active_casino_session(chat_id)
if existing:
return f"⚠️ 当前已有进行中的游戏({existing['game_type']}),请先结算后再开启新游戏。"
session_id = self.db.create_casino_session(
chat_id=chat_id,
game_type='轮盘',
banker_id=user_id,
min_bet=min_bet,
max_bet=max_bet,
multiplier=1.0, # 轮盘赔率根据下注类型自动计算
house_fee=0.05
)
banker_display_name = self.db.get_user_display_name(user_id)
text = f"## 🎰 轮盘游戏已开启\n\n"
text += f"**庄家**{banker_display_name}\n\n"
text += f"**最小下注**{min_bet}\n\n"
text += f"**最大下注**{max_bet}\n\n"
text += f"**抽水率**5%\n\n"
text += "**赔率**\n"
text += "- 数字35倍\n"
text += "- 颜色/奇偶/大小2倍\n"
text += "- 区间3倍\n\n"
text += "---\n\n"
text += "💡 提示:玩家可以使用 `.赌场 轮盘 bet <类型> <选项> <金额>` 进行下注"
return text
except Exception as e:
logger.error(f"开启轮盘游戏失败: {e}", exc_info=True)
return f"❌ 开启游戏失败: {str(e)}"
async def _bet_roulette(self, args: str, chat_id: int, user_id: int) -> str:
"""玩家下注轮盘"""
try:
parts = args.split()
if len(parts) < 2:
return "❌ 参数格式错误!\n\n正确格式:`.赌场 轮盘 bet <类型> <选项> <金额>`\n\n示例:`.赌场 轮盘 bet 数字 17 100`"
bet_category = parts[0]
if len(parts) == 2:
# 颜色/奇偶/大小/区间下注bet <类型> <金额>
bet_value = bet_category
bet_category_map = {
'红色': '颜色', '黑色': '颜色', '绿色': '颜色',
'奇数': '奇偶', '偶数': '奇偶',
'': '大小', '': '大小',
'1-12': '区间', '13-24': '区间', '25-36': '区间'
}
bet_category = bet_category_map.get(bet_value)
if not bet_category:
return f"❌ 未知的下注类型: {bet_value}"
try:
amount = int(parts[1])
except ValueError:
return "❌ 下注金额必须是数字!"
bet_number = None
elif len(parts) == 3:
# 数字下注bet 数字 <数字> <金额>
if bet_category != '数字':
return "❌ 数字下注格式:`.赌场 轮盘 bet 数字 <0-36> <金额>`"
try:
bet_number = int(parts[1])
amount = int(parts[2])
except ValueError:
return "❌ 数字和金额必须是数字!"
if bet_number < 0 or bet_number > 36:
return "❌ 数字必须在0-36之间"
bet_value = None
else:
return "❌ 参数格式错误!"
session = self.db.get_active_casino_session(chat_id, '轮盘')
if not session:
return "❌ 当前没有进行中的游戏,请等待庄家开启游戏。"
if amount < session['min_bet']:
return f"❌ 下注金额太小!最小下注:{session['min_bet']}"
if amount > session['max_bet']:
return f"❌ 下注金额太大!最大下注:{session['max_bet']}"
user_points = self.db.get_user_points(user_id)
if user_points['points'] < amount:
return f"❌ 积分不足!需要 {amount} 分,当前可用 {user_points['points']}"
# 根据下注类型计算赔率
if bet_category == '数字':
multiplier = 36.0 # 35:1赔率返回36倍包含本金
elif bet_category in ['颜色', '奇偶', '大小']:
multiplier = 2.0
elif bet_category == '区间':
multiplier = 3.0
else:
return f"❌ 未知的下注类别: {bet_category}"
if not self.db.consume_points(user_id, amount, 'casino_bet', f"轮盘游戏下注{bet_category}"):
return "❌ 扣除积分失败!"
bet_id = self.db.create_casino_bet(
chat_id=chat_id,
game_type='轮盘',
user_id=user_id,
bet_type='轮盘',
amount=amount,
multiplier=multiplier,
bet_category=bet_category,
bet_number=bet_number,
bet_value=bet_value
)
updated_points = self.db.get_user_points(user_id)
text = f"## 🎲 下注成功\n\n"
text += f"**下注类型**{bet_category}"
if bet_number is not None:
text += f" - {bet_number}"
elif bet_value:
text += f" - {bet_value}"
text += f"\n\n**下注金额**{amount}\n\n"
text += f"**赔率**{multiplier}\n\n"
text += f"**剩余积分**{updated_points['points']}\n\n"
text += "---\n\n"
text += "💡 等待庄家结算结果..."
return text
except Exception as e:
logger.error(f"轮盘下注失败: {e}", exc_info=True)
return f"❌ 下注失败: {str(e)}"