алгоритм — Круглый Робин и 3-й человек (2 игрока и один писатель / беженец)

У меня есть следующий код

poule = ['Jason', 'Raymond', 'Rupert', 'Mike', 'Simon', 'Jeremy'];

$games = [];
$cnt_players = count($poule);
$players = $poule;

if ($cnt_players % 2 != 0)
{
array_push($players, ['name' => 'bye', 'uid' => FALSE, 'alias' => NumToChar($cnt_players + 1), TRUE]);
$cnt_players++;
}

$away = array_splice($players, $cnt_players / 2);
$home = $players;

$write = [];

for ($i = 0; $i < count($home) + count($away) - 1; $i++)
{
for ($j = 0; $j < count($home); $j++)
{
//Get the writer
$writer = $this->GetWriter($home, $away, $j, $i);

//Remove the dummy games (where one player is bye)
if ($home[$j]['name'] !== 'bye' && $away[$j]['name'] !== 'bye')
{
$games[] = [['uid' => $home[$j]['uid'], 'name' => $home[$j]['name'], 'alias' => $home[$j]['alias']], ['uid' => $away[$j]['uid'], 'name' => $away[$j]['name'], 'alias' => $away[$j]['alias']], $writer];
}

//echo 'I:' . $i . ' - J: ' . $j . ' - ' . $home[$j]['alias'] . ' : ' . $home[$j]['name'] . '  -  ' . $away[$j]['alias'] . ' : ' . $away[$j]['name'] . '  ==>  ' . $writer['alias'] . ' : ' . $writer['name'] . "\n\r";

$write[$writer['name']][] = $writer['name'];
}

if (count($home) + count($away) - 1 > 2)
{
array_unshift($away, current(array_splice($home, 1, 1)));
array_push($home, array_pop($away));
}
}

//print_r($write);

return $games;


Функция GetWriter должна давать нам игрока, который будет отмечать результаты этой конкретной игры.

private function GetWriter($home, $away, $j, $i)
{
if ($j > 0)
{
if ($j == 1)
{
$writer = (isset($home[$j + 1]['alias']) ? $home[$j + 1] : $home[$j + 1]);
}
else
{
$writer = (isset($home[$j - 1]['alias']) ? $home[$j - 1] : $home[$j + 1]);
}

//Check if writer is a bye, this is not possible
if ($writer['name'] == 'bye')
{
$writer = (isset($away[$j - 2]['alias']) ? $away[$j - 2] : $home[$j - 1]);
}
}
else
{
$writer = (isset($home[$j + 1]['alias']) ? $home[$j + 1] : $away[$j]);

if ($writer['name'] == 'bye')
{
$writer = (isset($away[$j + 1]['alias']) ? $away[$j + 1] : $home[$j]);
}
}

return $writer;
}

Приведенный выше код дает мне все игры, в которых каждый игрок играет один раз с другим игроком (круговой прием). Однако мне нужно найти третьего игрока, который будет писателем / беженцем. Как и в дартсе, 1 игрок — это человек, который пишет результаты на табло. У меня есть писатель, но он не разделен на одного игрока.
Есть ли формула, чтобы получить правильного игрока, который является писателем / беженцем?

Некоторые примеры

Джейсон против Майка Рэймонда
Раймонд против Саймона Руперта
Руперт против Джереми Майка
так далее

Таким образом, Джейсон играет против Майка, а Рэймонд отмечает результаты.
Рэймонд играет против Саймона, а Руперт отмечает результаты и т. Д.

Мой GetWriter возвращает записи, но не разделены.
Например: игрок Джейсон пишет никогда, а Раймонд пишет больше всего очков.

0

Решение

У меня есть следующее решение, которое работает хорошо.
Поскольку игрок A и игрок B всегда запускаются, мы устанавливаем ключ в качестве индекса по умолчанию 3.
Теперь мы переходим через GetCounter через всех игроков и получаем писателя / беженца, который первым доступен.

$games = [];
$cnt_players = count($poule);
$players = $poule;
$key = 3;

if ($cnt_players % 2 != 0)
{
array_push($players, ['name' => 'bye', 'uid' => FALSE, 'alias' => NumToChar($cnt_players + 1, TRUE), TRUE]);
$cnt_players++;
}

$away = array_splice($players, $cnt_players / 2);
$home = $players;

for ($i = 0; $i < count($home) + count($away) - 1; $i++)
{
for ($j = 0; $j < count($home); $j++)
{
//Remove the dummy games (where one player is bye)
if ($home[$j]['name'] != 'bye' && $away[$j]['name'] != 'bye')
{
//Get the writer
$writer = $this->GetCounter($home, $away, $j, $poule, $key);

$games[] = [['uid' => $home[$j]['uid'], 'name' => $home[$j]['name'], 'alias' => $home[$j]['alias']], ['uid' => $away[$j]['uid'], 'name' => $away[$j]['name'], 'alias' => $away[$j]['alias']], $writer['array']];
$key = $writer['key'];
}
$key++;
}

if (count($home) + count($away) - 1 > 2)
{
array_unshift($away, current(array_splice($home, 1, 1)));
array_push($home, array_pop($away));
}
}return $games;

И GetCounter

private function GetCounter($home, $away, $j, $writers, $key)
{
if (isset($writers[$key]['alias']))
{
$writer['array'] = $writers[$key];
$writer['key'] = $key;

if ($home[$j]['alias'] == $writer['array']['alias'] || $away[$j]['alias'] == $writer['array']['alias'])
{
$key++;
return $this->GetCounter($home, $away, $j, $writers, $key);
}
}
else {
$key = 0;
return $this->GetCounter($home, $away, $j, $writers, $key);
}

return $writer;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]