- 新增比赛报名逻辑,支持单双打和团队赛 - 实现自动分组算法,根据比赛规则生成对阵表 - 添加下一轮对阵安排功能,支持淘汰赛制 - 优化比赛结果处理,自动计算排名和得分 - 新增参赛人员列表接口,支持多种查询条件
116 lines
4.1 KiB
PHP
116 lines
4.1 KiB
PHP
<?php
|
||
|
||
namespace format;
|
||
|
||
use app\admin\model\zy\game\Game;
|
||
|
||
class Game17 implements GameInterface
|
||
{
|
||
// 赛制说明
|
||
public function describe(): string
|
||
{
|
||
return '双打+八人转 比赛说明:
|
||
每个人与其他人各搭档1次,决出个人排名
|
||
数 4 ≦ n ≦ 16 (Default:8)
|
||
轮数 3 ≦ m<n (Default:7)
|
||
报名费 0 ≦ m ≦ 10 元 (Default: 5)
|
||
由前几名按比例瓜分 (可调 Default:40%/30%/20%/10%)';
|
||
}
|
||
|
||
// 首轮对阵安排
|
||
public function match(Game $game, array $users): array
|
||
{
|
||
$math = $team = [];
|
||
$utotal = count($users);
|
||
//队伍分配
|
||
for ($i = 0; $i < $utotal; $i++) {
|
||
for ($j = $i + 1; $j < $utotal; $j++) {
|
||
$teamName = 'team' . $i . $j;
|
||
$team[] = ([
|
||
'name' => $teamName,
|
||
'user' => [
|
||
[
|
||
'user_id' => $users[$i]['user_id'],
|
||
'gender' => $users[$i]['gender'],
|
||
'avatar' => $users[$i]['avatar'],
|
||
'name' => $users[$i]['name'],
|
||
],
|
||
[
|
||
'user_id' => $users[$j]['user_id'],
|
||
'gender' => $users[$j]['gender'],
|
||
'avatar' => $users[$j]['avatar'],
|
||
'name' => $users[$j]['name'],
|
||
]
|
||
]
|
||
]);
|
||
$users[$i]['team'] = $users[$j]['team'] = $teamName;
|
||
}
|
||
}
|
||
// 对阵分配
|
||
$ttotal = count($team);
|
||
// df("共 $utotal 人:");
|
||
$n = 1;
|
||
for ($i = 0; $i < $ttotal; $i++) {
|
||
for ($j = $i + 1; $j < $ttotal; $j++) {
|
||
if (array_intersect(array_column($team[$i]['user'], 'user_id'), array_column($team[$j]['user'], 'user_id'))) {
|
||
continue; //一个人不能同时在两边队伍
|
||
}
|
||
$math[] = [
|
||
'gym_id' => $game['gym_id'],
|
||
'club_id' => $game['club_id'],
|
||
'act_id' => $game['act_id'],
|
||
'game_id' => $game['id'],
|
||
'level' => 1, //轮次
|
||
'turn' => $n, //场次
|
||
'teamA' => json_encode($team[$i]), //队伍A
|
||
'teamB' => json_encode($team[$j]), //队伍B
|
||
];
|
||
// $ta =array_column($team[$i]['user'],'user_id');
|
||
// $tb =array_column($team[$j]['user'],'user_id');
|
||
// df("第 $n 场:".$ta[0].'/'.$ta[1].' VS '.$tb[0].'/'.$tb[1]);
|
||
$n++;
|
||
}
|
||
}
|
||
return $math;
|
||
}
|
||
|
||
// 下一轮对阵安排
|
||
public function nextLevel(Game $game, array $maths, $level): array
|
||
{
|
||
if ($game['rule_type'] < 15) { //15战队淘汰赛,16单项淘汰赛,17分区循环淘汰赛
|
||
return []; //只有淘汰赛才有下一轮对阵安排,其他类型比赛只有一轮
|
||
}
|
||
$winner = $next = [];
|
||
foreach ($maths as $m) {
|
||
$winner[] = json_decode($m['winner'], true);
|
||
}
|
||
$total = count($winner);
|
||
$n = 1;
|
||
for ($i = 0; $i < $total; $i++) {
|
||
for ($j = $i + 1; $j < $total; $j++) {
|
||
if (array_intersect(array_column($winner[$i]['user'], 'user_id'), array_column($winner[$j]['user'], 'user_id'))) {
|
||
continue;
|
||
}
|
||
$next[] = [
|
||
'gym_id' => $game['gym_id'],
|
||
'club_id' => $game['club_id'],
|
||
'act_id' => $game['act_id'],
|
||
'game_id' => $game['id'],
|
||
'level' => $level, //轮次
|
||
'turn' => $n, //场次
|
||
'teamA' => json_encode($winner[$i]), //队伍A
|
||
'teamB' => json_encode($winner[$j]), //队伍B
|
||
];
|
||
$n++;
|
||
}
|
||
}
|
||
return $next;
|
||
}
|
||
|
||
// 奖金分配
|
||
public function prize(array $rank): array
|
||
{
|
||
return $rank;
|
||
}
|
||
}
|