private GroupTournamentViewModel MapGroupTournament(GroupTournament groupTournament) { return(new GroupTournamentViewModel { Type = TournamentType.Group, Groups = groupTournament.GameIds.Select(MapGroup).ToArray() }); }
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); }
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()); }