Files
2026-07-23 08:58:13 +08:00

8 lines
6.5 KiB
PHP

<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>玩法与RTP - 管理后台</title><link rel="stylesheet" href="/assets/app.css?v=20260721"><link rel="stylesheet" href="/assets/admin.css?v=20260721"><link rel="stylesheet" href="/assets/game-admin.css?v=20260722-weights"></head><body><div class="admin-layout"><aside class="admin-side"><a class="admin-brand" href="/admin/index.php"><span></span><?=e(setting('site_name'))?></a><nav><?php foreach(['dashboard'=>'数据概览','users'=>'用户管理','recharges'=>'充值审核','withdrawals'=>'提现审核','cards'=>'充值卡','referrals'=>'邀请记录','game'=>'玩法与RTP','settings'=>'系统设置'] as $key=>$name):?><a class="<?=$key==='game'?'active':''?>" href="/admin/index.php?view=<?=$key?>"><?=e($name)?></a><?php endforeach;?></nav><footer><span>当前管理员:<?=e($admin['username'])?></span><a href="/index.php" target="_blank">查看用户端 ↗</a><form method="post" action="/admin/action.php"><input type="hidden" name="csrf" value="<?=e(csrf_token())?>"><input type="hidden" name="action" value="logout"><button class="mini-btn">退出登录</button></form></footer></aside><div class="admin-main"><header class="admin-top"><h1>玩法与 RTP</h1><span><?=date('Y-m-d H:i')?></span></header><main class="admin-body"><?php if($flash):?><div class="alert <?=e($flash['type'])?>"><?=e($flash['message'])?></div><?php endif;?>
<section class="rtp-metrics"><article><span>实际 RTP</span><strong><?=$gameStats['rtp']===null?'--':number_format($gameStats['rtp']*100,2).'%'?></strong><small><?=$gameStats['rounds']?> 局</small></article><article><span>目标 RTP</span><strong><?=number_format((float)($gameSettings['target_rtp']??92),2)?>%</strong><small>窗口 <?=number_format((int)($gameSettings['rtp_window']??1000))?> 局</small></article><article><span>窗口投入</span><strong>¥<?=number_format($gameStats['bets'],2)?></strong><small>派彩 ¥<?=number_format($gameStats['wins'],2)?></small></article><article><span>特殊理论 RTP</span><strong><?=number_format(game_theoretical_special_rtp($gameSettings),2)?>%</strong><small>触发率 <?=number_format(array_sum(array_column($specialDefinitions,'rate')),2)?>%</small></article></section>
<form method="post" action="/admin/action.php" class="game-config"><input type="hidden" name="csrf" value="<?=e(csrf_token())?>"><input type="hidden" name="action" value="game_settings"><input type="hidden" name="return" value="/admin/index.php?view=game">
<section class="panel"><div class="panel-head"><div><h2>RTP 控制</h2><p>普通开奖根据窗口实际 RTP 动态校准</p></div></div><div class="config-row"><label><span>目标 RTP (%)</span><input type="number" name="target_rtp" min="1" max="200" step="0.01" value="<?=e($gameSettings['target_rtp']??92)?>" required></label><label><span>统计窗口 (局)</span><input type="number" name="rtp_window" min="100" max="100000" step="1" value="<?=e($gameSettings['rtp_window']??1000)?>" required></label><label><span>LUCKY 通吃率 (%)</span><input type="number" name="lucky_eat_rate" min="0" max="100" step="0.0001" value="<?=e($gameSettings['lucky_eat_rate']??2)?>" required></label><label><span>比大小胜率 (%)</span><input type="number" name="size_win_rate" min="0" max="100" step="0.01" value="<?=e($gameSettings['size_win_rate']??46)?>" required></label></div></section>
<section class="panel"><div class="panel-head"><div><h2>普通图案赔率</h2><p>大图案与小图案格</p></div></div><div class="table-wrap"><table class="odds-table"><thead><tr><th>图案</th><th>小图案倍数</th><th>大图案倍数</th></tr></thead><tbody><?php foreach(['bar'=>'BAR','77'=>'77','xx'=>'双星','xg'=>'西瓜','ld'=>'铃铛','nm'=>'柠檬','jz'=>'橘子','pg'=>'苹果'] as $key=>$label):?><tr><td><b><?=$label?></b></td><td><input type="number" name="odds_<?=$key?>_low" min="0" max="1000" step="0.01" value="<?=e($gameSettings['odds_'.$key.'_low']??0)?>" required></td><td><input type="number" name="odds_<?=$key?>_high" min="0" max="1000" step="0.01" value="<?=e($gameSettings['odds_'.$key.'_high']??0)?>" required></td></tr><?php endforeach;?></tbody></table></div></section>
<section class="panel"><div class="panel-head"><div><h2>普通格子出现权重</h2><p>开奖结果与本局押注无关;抽中 LUCKY 时进入通吃或特殊派彩</p></div><span class="probability-summary">当前校准 RTP <?=number_format($gameProbabilityModel['target_rtp']*100,2)?>% · LUCKY通吃 <?=number_format($gameProbabilityModel['lucky_probability']*100,2)?>% · LUCKY派彩 <?=number_format($gameProbabilityModel['special_rate']*100,2)?>%</span></div><div class="table-wrap"><table class="odds-table position-table"><thead><tr><th>位置</th><th>图案</th><th>赔率</th><th>相对权重</th><th>当前单局概率</th><th>平均出现</th></tr></thead><tbody><?php foreach($gameBoard as $position=>$cell): $probability=(float)$gameProbabilityModel['positions'][$position]['probability']; ?><tr><td class="mono">#<?=$position?></td><td><b><?=e($cell['name'])?></b></td><td><?=$cell['multiplier']>0?number_format((float)$cell['multiplier'],2).'x':'-'?></td><td><input type="number" name="normal_weight_<?=$position?>" min="0.01" max="1000" step="0.01" value="<?=e($gameSettings['normal_weight_'.$position]??'1')?>" required></td><td><?=number_format($probability*100,4)?>%</td><td><?=$probability>0?'约 '.number_format(1/$probability,1).' 局':'-'?></td></tr><?php endforeach;?></tbody></table></div></section>
<section class="panel"><div class="panel-head"><div><h2>特殊玩法</h2><p>触发率为每局独立概率,倍数按本局总投入计算</p></div></div><div class="table-wrap"><table class="odds-table"><thead><tr><th>玩法</th><th>触发率 (%)</th><th>奖励倍数</th><th>理论 RTP 贡献</th></tr></thead><tbody><?php foreach($specialDefinitions as $special):?><tr><td><b><?=e($special['name'])?></b></td><td><input type="number" name="special_<?=e($special['key'])?>_rate" min="0" max="100" step="0.0001" value="<?=e($special['rate'])?>" required></td><td><input type="number" name="special_<?=e($special['key'])?>_odds" min="0" max="1000" step="0.01" value="<?=e($special['odds'])?>" required></td><td><?=number_format($special['rate']*$special['odds'],2)?>%</td></tr><?php endforeach;?></tbody></table></div><div class="config-submit"><button class="btn primary" type="submit">保存并立即生效</button></div></section></form></main></div></div><script src="/assets/app.js?v=20260722-cards2"></script></body></html>