LaBeuof
@LaBeuof
web-developer

Почему не правильно генерируется турнирная сетка?

Всем привет. Пытаюсь сгенерировать турнирную сетку, ниже пример пока что только для нечетного кол-ва участников. У меня в примере 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);
            });
        }
    }
  • Вопрос задан
  • 191 просмотр
Решения вопроса 1
dpigo
@dpigo
Front-end developer
У вас не отслеживается ситуация когда количество игр в раунде превышает количество возможных играющих команд (если я правильно понял) https://jsbin.com/mezabel/13/edit?js,console

Исправляется так:
if(teamA === null || teamB === null) {
  console.error(`[Warning] Round ${roundNum}, Game ${game}, teamA is ${teamA}, teamB is ${teamB}`);
  break;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы