@extends('admin.layouts.app') @section('title', '游戏管理') @section('content')
{{-- 页头 --}}

🎮 游戏管理

统一管理聊天室所有娱乐游戏的开关状态与核心参数,所有游戏默认关闭。

{{-- 实时统计摘要区(AJAX 异步加载,默认隐藏) --}} {{-- 游戏卡片列表 --}}
@foreach ($games as $game)
{{-- 卡片头部:游戏名 + 开关 --}}
{{ $game->icon }}
{{ $game->name }} {{ $game->enabled ? '运行中' : '已关闭' }}
{{ $game->description }}
{{-- 操作按钮组 --}}
{{-- 历史记录链接 --}} @php $historyRoute = match ($game->game_key) { 'baccarat' => 'admin.game-history.baccarat', 'slot_machine' => 'admin.game-history.slot', 'mystery_box' => 'admin.game-history.mystery-box', 'horse_racing' => 'admin.game-history.horse', 'fortune_telling' => 'admin.game-history.fortune', 'lottery' => 'admin.game-history.lottery', 'gomoku' => 'admin.game-history.gomoku', default => null, }; @endphp @if ($historyRoute) 📋 历史记录 @endif {{-- 大开关按钮 --}}
{{-- 参数配置区域 --}}
@csrf @php $params = $game->params ?? []; $labels = gameParamLabels($game->game_key); $hiddenLegacyKeys = $game->game_key === 'mystery_box' ? ['min_reward', 'max_reward', 'rare_min_reward', 'rare_max_reward'] : []; $paramKeys = array_values(array_unique(array_merge(array_keys($labels), array_keys($params)))); $paramKeys = array_values(array_filter($paramKeys, fn ($key) => ! in_array($key, $hiddenLegacyKeys, true))); @endphp
@foreach ($paramKeys as $paramKey) @php $paramValue = $params[$paramKey] ?? ($labels[$paramKey]['default'] ?? ''); if ($game->game_key === 'mystery_box') { $legacyFallbackMap = [ 'normal_reward_min' => 'min_reward', 'normal_reward_max' => 'max_reward', 'rare_reward_min' => 'rare_min_reward', 'rare_reward_max' => 'rare_max_reward', ]; if (($paramValue === '' || $paramValue === null) && isset($legacyFallbackMap[$paramKey])) { $paramValue = $params[$legacyFallbackMap[$paramKey]] ?? $paramValue; } } @endphp @php $meta = $labels[$paramKey] ?? ['label' => $paramKey, 'type' => 'number', 'unit' => ''] @endphp
@if ($meta['type'] === 'boolean') @elseif ($meta['type'] === 'array') @else @endif
@endforeach
修改后立即生效(缓存60秒刷新)
{{-- 神秘箱子:手动投放区域 --}} @if ($game->game_key === 'mystery_box')
🎯 手动投放箱子
直接向 #1 房间投放,立即广播暗号
@endif {{-- 双色球彩票:手动操作区域 --}} @if ($game->game_key === 'lottery')
🎟️ 手动操作
{{-- 当前期次状态展示 --}}
⏳ 点击下方「加载期次状态」查看当前状态
开新期仅在无进行中期次时生效;强制开奖将提前结束当期
@endif
@endforeach @if ($games->isEmpty())
暂无游戏配置,请先运行 php artisan db:seed --class=GameConfigSeeder
@endif
@endsection @php /** * 返回各游戏参数的中文标签说明。 * * @param string $gameKey * @return array */ function gameParamLabels(string $gameKey): array { return match ($gameKey) { 'baccarat' => [ 'interval_minutes' => ['label' => '开局间隔', 'type' => 'number', 'unit' => '分钟', 'min' => 1], 'bet_window_seconds' => ['label' => '押注窗口', 'type' => 'number', 'unit' => '秒', 'min' => 10], 'min_bet' => ['label' => '最低押注', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'max_bet' => ['label' => '最高押注', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'payout_big' => ['label' => '大赔率(1:N)', 'type' => 'number', 'unit' => '', 'min' => 1], 'payout_small' => ['label' => '小赔率(1:N)', 'type' => 'number', 'unit' => '', 'min' => 1], 'payout_triple' => ['label' => '豹子赔率(1:N)', 'type' => 'number', 'unit' => '', 'min' => 1], 'kill_points' => ['label' => '庄家收割点数', 'type' => 'array', 'unit' => '逗号分隔'], ], 'slot_machine' => [ 'cost_per_spin' => ['label' => '每次旋转消耗', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'house_edge_percent' => [ 'label' => '庄家边际', 'type' => 'number', 'unit' => '%', 'min' => 0, 'step' => 0.1, ], 'daily_limit' => ['label' => '每日转动上限', 'type' => 'number', 'unit' => '次(0=不限)', 'min' => 0], 'jackpot_payout' => ['label' => '三个7赔率(1:N)', 'type' => 'number', 'unit' => '', 'min' => 1], 'triple_payout' => ['label' => '三💎赔率(1:N)', 'type' => 'number', 'unit' => '', 'min' => 1], 'same_payout' => ['label' => '其他三同(1:N)', 'type' => 'number', 'unit' => '', 'min' => 1], 'pair_payout' => ['label' => '两同赔率(1:N)', 'type' => 'number', 'unit' => '', 'min' => 1], 'curse_enabled' => ['label' => '开启诅咒(三💀)', 'type' => 'boolean', 'unit' => ''], ], 'mystery_box' => [ 'auto_drop_enabled' => ['label' => '自动定时投放', 'type' => 'boolean', 'unit' => ''], 'auto_interval_hours' => ['label' => '自动投放间隔', 'type' => 'number', 'unit' => '小时', 'min' => 1], 'claim_window_seconds' => ['label' => '领取窗口', 'type' => 'number', 'unit' => '秒', 'min' => 10], // 新键名 'normal_reward_min' => ['label' => '普通箱最低奖励', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'normal_reward_max' => ['label' => '普通箱最高奖励', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'rare_reward_min' => ['label' => '稀有箱最低奖励', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'rare_reward_max' => ['label' => '稀有箱最高奖励', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'trap_penalty_min' => ['label' => '黑化箱最低惩罚', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'trap_penalty_max' => ['label' => '黑化箱最高惩罚', 'type' => 'number', 'unit' => '金币', 'min' => 1], // 旧键名兼容(数据库中已存在的旧配置) 'min_reward' => ['label' => '普通箱最低奖励', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'max_reward' => ['label' => '普通箱最高奖励', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'rare_min_reward' => ['label' => '稀有箱最低奖励', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'rare_max_reward' => ['label' => '稀有箱最高奖励', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'trap_chance_percent' => [ 'label' => '黑化箱概率', 'type' => 'number', 'unit' => '%', 'min' => 0, 'max' => 100, ], ], 'horse_racing' => [ 'interval_minutes' => ['label' => '比赛间隔', 'type' => 'number', 'unit' => '分钟', 'min' => 5], 'bet_window_seconds' => ['label' => '押注窗口', 'type' => 'number', 'unit' => '秒', 'min' => 10], 'race_duration' => ['label' => '跑马动画时长', 'type' => 'number', 'unit' => '秒', 'min' => 10], 'horse_count' => ['label' => '参赛马匹数', 'type' => 'number', 'unit' => '匹', 'min' => 2, 'max' => 8], 'min_bet' => ['label' => '最低押注', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'max_bet' => ['label' => '最高押注', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'seed_pool' => ['label' => '系统初始化资金池', 'type' => 'number', 'unit' => '金币', 'min' => 0], 'house_take_percent' => [ 'label' => '庄家抽水', 'type' => 'number', 'unit' => '%', 'min' => 0, 'max' => 20, ], ], 'fortune_telling' => [ 'free_count_per_day' => ['label' => '每日免费次数', 'type' => 'number', 'unit' => '次', 'min' => 0], 'extra_cost' => ['label' => '额外次数消耗', 'type' => 'number', 'unit' => '金币', 'min' => 0], 'buff_duration_hours' => ['label' => '加成持续时间', 'type' => 'number', 'unit' => '小时', 'min' => 1], 'jackpot_chance' => [ 'label' => '上上签概率', 'type' => 'number', 'unit' => '%', 'min' => 0, 'max' => 100, ], 'good_chance' => ['label' => '上签概率', 'type' => 'number', 'unit' => '%', 'min' => 0, 'max' => 100], 'bad_chance' => ['label' => '下签概率', 'type' => 'number', 'unit' => '%', 'min' => 0, 'max' => 100], 'curse_chance' => [ 'label' => '大凶签概率', 'type' => 'number', 'unit' => '%', 'min' => 0, 'max' => 100, ], ], 'fishing' => [ 'fishing_cost' => ['label' => '每次抛竿消耗', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'fishing_wait_min' => ['label' => '浮漂等待最短', 'type' => 'number', 'unit' => '秒', 'min' => 1], 'fishing_wait_max' => ['label' => '浮漂等待最长', 'type' => 'number', 'unit' => '秒', 'min' => 1], 'fishing_cooldown' => ['label' => '收竿后冷却时间', 'type' => 'number', 'unit' => '秒', 'min' => 10], ], 'lottery' => [ // ── 开奖时间 ── 'draw_hour' => [ 'label' => '开奖时(24h制)', 'type' => 'number', 'unit' => '时', 'min' => 0, 'max' => 23, ], 'draw_minute' => ['label' => '开奖分', 'type' => 'number', 'unit' => '分', 'min' => 0, 'max' => 59], 'stop_sell_minutes' => ['label' => '停售提前', 'type' => 'number', 'unit' => '分钟', 'min' => 1], // ── 购票限制 ── 'ticket_price' => ['label' => '每注金额', 'type' => 'number', 'unit' => '金币', 'min' => 1], 'max_tickets_per_user' => ['label' => '单人每期上限', 'type' => 'number', 'unit' => '注', 'min' => 1], 'max_tickets_per_buy' => ['label' => '单次购买上限', 'type' => 'number', 'unit' => '注', 'min' => 1], // ── 奖池分配 ── 'pool_ratio' => [ 'label' => '购票进奖池比例', 'type' => 'number', 'unit' => '%', 'min' => 1, 'max' => 100, ], 'prize_1st_ratio' => [ 'label' => '一等奖占奖池', 'type' => 'number', 'unit' => '%', 'min' => 1, 'max' => 100, ], 'prize_2nd_ratio' => [ 'label' => '二等奖占奖池', 'type' => 'number', 'unit' => '%', 'min' => 1, 'max' => 100, ], 'prize_3rd_ratio' => [ 'label' => '三等奖占奖池', 'type' => 'number', 'unit' => '%', 'min' => 1, 'max' => 100, ], 'carry_ratio' => ['label' => '强制滚存', 'type' => 'number', 'unit' => '%', 'min' => 0, 'max' => 50], // ── 固定小奖 ── 'prize_4th_fixed' => ['label' => '四等奖固定金额/注', 'type' => 'number', 'unit' => '金币', 'min' => 0], 'prize_5th_fixed' => ['label' => '五等奖固定金额/注', 'type' => 'number', 'unit' => '金币', 'min' => 0], // ── 超级期 ── 'super_issue_threshold' => [ 'label' => '超级期触发连续无一等奖', 'type' => 'number', 'unit' => '期', 'min' => 1, ], 'super_issue_inject' => [ 'label' => '超级期系统注入上限', 'type' => 'number', 'unit' => '金币', 'min' => 0, ], ], 'gomoku' => [ // ── PvP 对战 ── 'pvp_reward' => ['label' => 'PvP 胜利奖励', 'type' => 'number', 'unit' => '金币', 'min' => 0], 'pvp_invite_timeout' => ['label' => 'PvP 邀请超时', 'type' => 'number', 'unit' => '秒', 'min' => 10], 'pvp_move_timeout' => ['label' => '每步落子超时', 'type' => 'number', 'unit' => '秒', 'min' => 10], 'pvp_ready_timeout' => ['label' => '对局准备超时', 'type' => 'number', 'unit' => '秒', 'min' => 10], // ── 人机对战:简单 (Level 1) ── 'pve_fee_level_1' => ['label' => 'AI简单 入场费', 'type' => 'number', 'unit' => '金币', 'min' => 0], 'pve_reward_level_1' => ['label' => 'AI简单 胜利奖励', 'type' => 'number', 'unit' => '金币', 'min' => 0], // ── 人机对战:普通 (Level 2) ── 'pve_fee_level_2' => ['label' => 'AI普通 入场费', 'type' => 'number', 'unit' => '金币', 'min' => 0], 'pve_reward_level_2' => ['label' => 'AI普通 胜利奖励', 'type' => 'number', 'unit' => '金币', 'min' => 0], // ── 人机对战:困难 (Level 3) ── 'pve_fee_level_3' => ['label' => 'AI困难 入场费', 'type' => 'number', 'unit' => '金币', 'min' => 0], 'pve_reward_level_3' => ['label' => 'AI困难 胜利奖励', 'type' => 'number', 'unit' => '金币', 'min' => 0], // ── 人机对战:专家 (Level 4) ── 'pve_fee_level_4' => ['label' => 'AI专家 入场费', 'type' => 'number', 'unit' => '金币', 'min' => 0], 'pve_reward_level_4' => ['label' => 'AI专家 胜利奖励', 'type' => 'number', 'unit' => '金币', 'min' => 0], ], default => [], }; } @endphp