Exemplo n.º 1
0
 private GroupTournamentViewModel MapGroupTournament(GroupTournament groupTournament)
 {
     return(new GroupTournamentViewModel
     {
         Type = TournamentType.Group,
         Groups = groupTournament.GameIds.Select(MapGroup).ToArray()
     });
 }
Exemplo n.º 2
0
        public int GenerateGroup(string name, int teamsCount)
        {
            var teamNames = Enumerable.Range(1, teamsCount).Select(i => $"team №{i}").ToArray();
            var group     = new GroupTournament
            {
                GameIds = Enumerable.Range(0, teamsCount).Select(_ => new int[teamsCount]).ToArray()
            };

            for (var i = 0; i < teamsCount; i++)
            {
                for (var j = 0; j < teamsCount; j++)
                {
                    if (i != j)
                    {
                        if (i < j)
                        {
                            group.GameIds[i][j] = GenerateMatchOfTeams(teamNames[i], teamNames[j]).GameId;
                        }
                        else
                        {
                            group.GameIds[i][j] = group.GameIds[j][i];
                        }
                    }
                }
            }
            var generatedTournament =
                context.Tournaments.Add(new Tournament
            {
                Name           = name,
                TournamentTree = group.ToJson(),
                Type           = TournamentType.Group
            }).Entity;

            context.SaveChanges();
            return(generatedTournament.TournamentId);
        }
Exemplo n.º 3
0
        private GroupTournamentViewModel MapGroup(GroupTournament groupTournament)
        {
            var gameIds        = groupTournament.GameIds.SelectMany(row => row).ToArray();
            var idToGameMap    = gamesRepository.GetByIds(gameIds).ToDictionary(g => g.GameId, g => g);
            var groupSize      = groupTournament.GameIds.Length;
            var groupViewModel = new GroupTournamentViewModel
            {
                Games = Enumerable.Range(0, groupSize)
                        .Select(_ => new Game[groupSize])
                        .ToArray()
            };

            for (var i = 0; i < groupSize; i++)
            {
                for (var j = 0; j < groupSize; j++)
                {
                    if (i != j)
                    {
                        groupViewModel.Games[i][j] = idToGameMap[groupTournament.GameIds[i][j]];
                    }
                }
            }
            return(groupViewModel);
        }
        public List <FightCompetitor> Run(List <string> selected)
        {
            const int TOURMENAMENT_COMPETITOR_QTY = 20;
            const int TOURMENAMENT_GROUP_QTY      = 5;

            List <FightCompetitor> comp = GetAllCompetitors();

            //Neste query a seleção dos competitores valida também a multiplicidade
            // Participantes distintos somente
            var competitors = (from r in comp
                               where (from p in selected select p).Contains(r.Name)
                               select r).ToList();

            if (competitors.Count != TOURMENAMENT_COMPETITOR_QTY)
            {
                throw new InvalidOperationException($"Necessário selecionar {TOURMENAMENT_COMPETITOR_QTY} participantes");
            }

            //Grupos
            var groups = new List <IGroupTournament>();
            var grupoA = new GroupTournament()
            {
                Name = "Grupo 1", Code = "A"
            };
            var grupoB = new GroupTournament()
            {
                Name = "Grupo 2", Code = "B"
            };
            var grupoC = new GroupTournament()
            {
                Name = "Grupo 3", Code = "C"
            };
            var grupoD = new GroupTournament()
            {
                Name = "Grupo 4", Code = "D"
            };

            groups.Add(grupoA);
            groups.Add(grupoB);
            groups.Add(grupoC);
            groups.Add(grupoD);

            //Divisão em grupos conforme idade
            int i = 0;
            int j = 0;

            foreach (var c in competitors.OrderBy(x => x.Age))
            {
                if (i >= TOURMENAMENT_COMPETITOR_QTY)
                {
                    competitors.Remove(c);
                    continue;
                }
                j = (int)i / TOURMENAMENT_GROUP_QTY;
                ((FightCompetitor)c).Group = groups.ElementAt(j);
                i++;
            }


            //Critérios das fases - Como as partidas são organizadas
            var stageGroupCriterias = new List <IStageCriteria>();

            stageGroupCriterias.Add(new AllversusAllCriteria()
            {
                Order = 1
            });

            var stage4thsCriterias = new List <IStageCriteria>();

            stage4thsCriterias.Add(new FirstSecondExchange()
            {
                Order = 1
            });

            var stage2thsCriterias = new List <IStageCriteria>();

            stage2thsCriterias.Add(new FirstVerusFirst()
            {
                Order = 1
            });


            //Criterios da disputa - Como as partidas são definidas
            var matchCriteria = new List <IMatchCriteria>();

            matchCriteria.Add(new WinPercentageCriteria()
            {
                Order = 1
            });

            //Fases do campeonato
            var stages = new List <IStageTournament>();

            stages.Add(new FightStageTournament()
            {
                Name = "Inicio"
            });
            stages.Add(new FightStageTournament()
            {
                Name = "Grupos", StageCriteria = stageGroupCriterias, MatchCriteria = matchCriteria
            });
            stages.Add(new FightStageTournament()
            {
                Name = "Quartas de final", StageCriteria = stage4thsCriterias, MatchCriteria = matchCriteria
            });
            stages.Add(new FightStageTournament()
            {
                Name = "Semifinal", StageCriteria = stage2thsCriterias, MatchCriteria = matchCriteria
            });
            stages.Add(new FightStageTournament()
            {
                Name = "Final", StageCriteria = stage2thsCriterias, MatchCriteria = matchCriteria, isRanking = true, rankingWinFactor = 3, rankingLoseFactor = 0
            });

            //Torneio
            var tournament = new MultiStageTournament();

            tournament.Groups      = groups;
            tournament.Stages      = stages;
            tournament.Competitors = competitors.Cast <ICompetitor>().ToList();

            //Gerenciador Torneio
            var manager = new TournamentService(tournament);

            manager.ProcessMatches();
            var results = manager.GetResults();

            return(results
                   .Where(x => x.Ranking.HasValue == true)
                   .OrderBy(y => y.Ranking).ToList());
        }