Всем привет. Пытаюсь сгенерировать турнирную сетку, ниже пример пока что только для нечетного кол-ва участников. У меня в примере 7 участников и для 7 участников сетка генерится отлично. Но если ввести 3,5,9,11 и тп. Выдает ошибку, все перебрал не могу понять почему.
Сетка должна генерится так:
7 участников, значит 21 раунд. 21 потому что каждая команда пропусти по 1 дню. В рауде будет играться 3 игры.
Буду очень признателен любой помощи! Может кто то предложит свое решение.
const teams = [
{
'id': 1,
'player': 'Alex',
'team': 'Arsenal'
},
{
'id': 2,
'player': 'Bob',
'team': 'Real Madrid'
},
{
'id': 3,
'player': 'Jon',
'team': 'FC Bayern'
},
{
'id': 4,
'player': 'Ron',
'team': 'Atletico Madrid'
},
{
'id': 5,
'player': 'Fill',
'team': 'Roma'
},
{
'id': 6,
'player': 'Bill',
'team': 'Barcelona'
},
{
'id': 7,
'player': 'Zill',
'team': 'Man United'
}
];
createTable() {
let teamsQty = this.state.teams.length;
console.log(teamsQty);
var gamesPlayed = [];
for (let k = 1; k <= teamsQty; k++) {
gamesPlayed[k] = {
teamNum: k,
gamesPlayed: 0
};
}
var gamesMap = {};
for (let roundNum = 0; roundNum < teamsQty; roundNum++) { // round
console.log(roundNum + ' round');
gamesPlayed = gamesPlayed.sort((a, b) => {
return a.gamesPlayed < b.gamesPlayed || a.gamesPlayed > b.gamesPlayed ? -1 : 1;
});
var roundData = [];
var roundGamesPlayed = [];
for (var i = 0; i < teamsQty; i++) {
roundGamesPlayed[i] = false;
}
var gamesPerRound = Math.floor(teamsQty / 2);
for (let game = 0; game < gamesPerRound; game++) {
var teamA = null;
var teamB = null;
for (let ii = 0; ii < teamsQty; ii++) {
for (let jj = 0; jj < teamsQty; jj++) {
if (ii == jj) {
continue;
}
let roundTeamAId = gamesPlayed[ii].teamNum;
let roundTeamBId = gamesPlayed[jj].teamNum;
if (roundGamesPlayed[ii] == true || roundGamesPlayed[jj] == true) {
continue;
}
let roundKey = [roundTeamAId, roundTeamBId].sort().join(':');
if (roundKey in gamesMap) {
continue;
}
teamA = ii;
teamB = jj;
break;
}
}
roundGamesPlayed[teamA] = true;
roundGamesPlayed[teamB] = true;
var teamAId = gamesPlayed[teamA].teamNum;
var teamBId = gamesPlayed[teamB].teamNum;
roundData.push({
home: teamAId,
away: teamBId
});
gamesPlayed[teamA].gamesPlayed++;
gamesPlayed[teamB].gamesPlayed++;
var key = [teamAId, teamBId].sort().join(':');
gamesMap[key] = key in gamesMap ? gamesMap[key] + 1 : 1;
}
var roundGames = [];
roundData.forEach(function (round) {
var teamHome = _.find(teams, teamName => teamName.id === round.home);
var teamAway = _.find(teams, teamName => teamName.id === round.away);
console.log(roundNum + ' | ' + teamHome.team + ' -- ' + teamAway.team);
});
}
}