У меня есть функция javascript, которая создает циклический перебор для турнира по бадминтону.Проблема в том, что игроки добавляются или выбывают на полпути в турнире, заставляя круговой робин пересчитывать себя и подходящих игроков, которые уже играли.
Я пытаюсь переписать логику следующим образом:
- Найдите игрока, который сыграл наименьшее количество игр
- Найдите оппонента, против которого игрок сыграл наименьшее количество игр
- Сопоставьте его
- Остановитесь, если игрок или противник достиг 10 игр
Я работал над этим несколько дней и до сих пор не могу заставить его работать должным образом.
У меня есть 4объекты:
allPlayers
playersAvailable
gamesCompleted
gamesScheduled
Объект gamesScheduled
создается из данных других 3 объектов и пересчитывается при добавлении или удалении нового игрока.
allplayers: [{.key: -playerKey, name: 'Name'}]
playersAvailable: [{.key:-playerKey, name: 'Name'}]
gamesCompleted: [{playerKey: {opponentKey:numberOfGames,opponentKey:numberOfGames}]
Объект gamesCompleted
не содержит всех игроков.
У меня проблемы с генерацией объекта gamesScheduled
(javascript / es6).Вот мой подход до сих пор:
Сортировка playersAvailable
по наименьшему количеству сыгранных игр
Проход по playersAvailable
, еслиони не играли в 10 игр, ищите противников, которых они еще не играли, сравнив список gamesCompleted
со списком playersAvailable
, если у противника нет 10 сыгранных игр, создайте матчап.
Проходя по playersAvailable
, если они не сыграли 10 игр, найдите противников, в которых они играли наименьшее количество раз, в списке gamesCompleted
, если у противника нет 10 игрсыграно, создайте матчап.
Я могу добраться до # 1 и частично # 2., но при проверке количества сыгранных игр (максимум: 10) я не могу понятьузнайте, как включить новые добавленные игры в объект gamesScheduled
.
Partial Code, когда вы перебираете противников с помощью forEach()
var gamesScheduled = [];
let playersAvailable = this.weekPlayers.slice().sort((a, b) => {
let aTotal = a.gs + a.gp;
let bTotal = b.gs + b.gp;
return aTotal - bTotal;
});
playersAvailable.forEach((player) => {
// if missing games
if (player.gp < 10) {
playerAvailable.forEach(opponent => {
// add opponents unplayed
if (
gamesPlayed[player[".key"]] &&
gamesPlayed[player[".key"]][opponent[".key"]] === undefined &&
opponent.gp <10
) {
gamesScheduled.push({ player1: player, player2: opponent });
}
// add opponents played
});
}
});
return gamesScheduled;