Пример #1
0
        public async Task <IActionResult> GoToAction(string submitButton, [Bind("Id,RoundNo,NoTableTops,Players,RoundMatchups")] RoundsModel Round)
        {
            switch (submitButton)
            {
            case "GoToDisplayNextRound":
                // delegate sending to another controller action
                if (ModelState.IsValid)
                {
                    _context.Add(Round);
                    await _context.SaveChangesAsync();

                    return(RedirectToAction("DisplayNextRound", "RoundMatchups"));
                }
                break;

            case "GoToDisplayNextPairRound":
                // call another action to perform the cancellation
                if (ModelState.IsValid)
                {
                    _context.Add(Round);
                    await _context.SaveChangesAsync();

                    return(RedirectToAction("DisplayNextPairRound", "RoundMatchups"));
                }
                break;

            default:
                // If they've submitted the form without a submitButton,
                // just return the view again.
                return(View(Round));
            }
            return(View(Round));
        }
        public async Task <IActionResult> Create([Bind("id,roundNo,battlePoints,sportsmanshipPoints,table")] RoundMatchups roundMatchups)
        {
            if (ModelState.IsValid)
            {
                _context.Add(roundMatchups);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(roundMatchups));
        }
        public async Task <IActionResult> Create([Bind("Id,Name,BattleScore,SportsmanshipScore,Army,Active,EmailAddress,Notes,Paid")] Player player)
        {
            if (ModelState.IsValid)
            {
                _context.Add(player);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(player));
        }
Пример #4
0
        public async Task <IActionResult> Create([Bind("Name,Country,AreEliminated,LastModifiedBy,LastModified,Id,CreatedBy,CreatedDate")] Team team)
        {
            if (ModelState.IsValid)
            {
                _dbContext.Add(team);
                await _dbContext.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(team));
        }
Пример #5
0
 public static void CreateByeRounds(List <Player> activeByePlayers, int roundNo, TournamentDbContext _context)
 {
     foreach (Player activeByePlayer in activeByePlayers)
     {
         _context.Add(new PairRoundMatchup()
         {
             RoundNo   = roundNo,
             PlayerOne = activeByePlayer
         });
     }
 }
Пример #6
0
        public async Task <IActionResult> Create([Bind("Id,BattleScoreRatio,SportsmanshipScoreRatio,ArmyScoreRatio")] Tournament tournament)
        {
            if (tournament.BattleScoreRatio + tournament.SportsmanshipScoreRatio + tournament.ArmyScoreRatio != 1)
            {
                TempData["Errors"] = "The score ratios must add up to a total of 1";
                return(View(tournament));
            }

            if (ModelState.IsValid)
            {
                _context.Add(tournament);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(tournament));
        }
        /**
         *
         * Round Generation
         *
         **/
        public static void GenerateNextRound(TournamentDbContext _context)
        {
            List <Player> players = _context.Players.OrderByDescending(p => p.BattleScore).ToList();
            //List<int> AllocatedTables = new List<int>(GetnoOfTables());
            int secondaryIndex = 0;
            int i = 0;

            while (i < players.Count)
            {
                //Skip this player if they are already allocated an opponent
                if (players[i].CurrentOpponent == null)
                {
                    if (secondaryIndex == 0)
                    {
                        secondaryIndex = i + 1;
                    }
                    int s = 0;

                    for (s = secondaryIndex; s < players.Count; s++)
                    {
                        if (players[s].CurrentOpponent == null)
                        {
                            //Check if higher player has ever played lower player
                            var opponents = PlayerActions.GetAllOpponents(players[i], _context);
                            var hasPlayed = false;
                            foreach (Player opponent in opponents)
                            {
                                if (players[s] == opponent)
                                {
                                    hasPlayed = true;
                                }
                            }
                            //If they have not played allocate them as opponents
                            if (hasPlayed == false)
                            {
                                players[i].CurrentOpponent = players[s];
                                players[s].CurrentOpponent = players[i];
                                secondaryIndex             = 0;
                                break;
                            }

                            /**
                             * Following block is to deallocate the next lowest ranked allocated pair
                             **/
                            if (players.Where(p => p.CurrentOpponent == null).LastOrDefault() == players[s] && (players[i].CurrentOpponent == null))
                            //if (s == (players.Count - 1) && (players[i].CurrentOpponent == null))
                            {
                                if (i - 1 >= 0)
                                {
                                    //Set the lowestAllocatedPair to the highest ranked player
                                    Player lowestAllocatedPair = players[0];
                                    //Iterate from the second highest ranked player all the way to the player ranked one higher than the player currently being matched
                                    for (int playerIndex = 1; playerIndex < i; playerIndex++)
                                    {
                                        //Assign the current player to the player being examined in the current iteration of the loop
                                        Player currentPlayer = players[playerIndex];

                                        //Check that the current player has an opponent (if not, skip to the next iteration of the loop)
                                        if (currentPlayer.CurrentOpponent != null)
                                        {
                                            //Proceed if the current player's opponent has a higher rank than the current player
                                            if (players.IndexOf(currentPlayer.CurrentOpponent) < players.IndexOf(currentPlayer))
                                            {
                                                if (players.IndexOf(currentPlayer.CurrentOpponent) > players.IndexOf(lowestAllocatedPair))
                                                {
                                                    //Set lowestAllocatedPair to the current player's opponent
                                                    //(The highest ranked member of the new lowest ranked allocated pair)
                                                    lowestAllocatedPair = currentPlayer.CurrentOpponent;
                                                }
                                            }
                                            //Proceed if the current player has a higher rank than their opponent
                                            else if (players.IndexOf(currentPlayer) < players.IndexOf(currentPlayer.CurrentOpponent))
                                            {
                                                //Proceed if the current player has a lower rank than the previous value of lowestAllocatedPair
                                                if (players.IndexOf(currentPlayer) > players.IndexOf(lowestAllocatedPair))
                                                {
                                                    //Set lowestAllocatedPair to the current player
                                                    //(The highest ranked member of the new lowest ranked allocated pair)
                                                    lowestAllocatedPair = currentPlayer;
                                                }
                                            }
                                        }
                                    }
                                    //Set the new player to be allocated to the highest member of the lowestAllocatedPair
                                    i = players.IndexOf(lowestAllocatedPair) - 1;
                                    //Set the starting player that will be tested for allocation suitability to one rank lower than
                                    //the opponent of the highest member of the allocated pair
                                    secondaryIndex = players.IndexOf(lowestAllocatedPair.CurrentOpponent) + 1;

                                    //Deallocate the lowest allocated pair as each other's opponent
                                    lowestAllocatedPair.CurrentOpponent.CurrentOpponent = null;
                                    lowestAllocatedPair.CurrentOpponent = null;
                                }
                            }
                        }
                    }
                }
                i++;
            }

            int newRound = GetLastRoundNo(_context) + 1;

            foreach (Player player in players)
            {
                if (players.IndexOf(player) < players.IndexOf(player.CurrentOpponent))
                {
                    RoundMatchup roundMatchup = new RoundMatchup
                    {
                        RoundNo   = newRound,
                        PlayerOne = player,
                        PlayerTwo = player.CurrentOpponent
                    };

                    //allocates table for matchup
                    // roundMatchup.Table = AllocateTable(GetTables(player), AllocatedTables);

                    _context.Add(roundMatchup);
                }
            }

            foreach (Player player in players)
            {
                player.CurrentOpponent = null;
                _context.Update(player);
            }

            _context.SaveChanges();
        }
Пример #8
0
        public static Boolean GenerateNextPairRound(TournamentDbContext _context)
        {
            Boolean           error             = false;
            int               lastRound         = GetLastRoundNo(_context);
            var               roundMatchups     = _context.RoundMatchups.Where(r => !(r is PairRoundMatchup)).Include(r => r.PlayerOne).Include(r => r.PlayerTwo).Where(r => r.RoundNo == lastRound).ToList();
            var               pairRoundMatchups = _context.PairRoundMatchups.Include(r => r.PlayerOne).Include(r => r.PlayerTwo).Include(r => r.PlayerThree).Include(r => r.PlayerFour).Where(r => r.RoundNo == lastRound).ToList();
            List <Player>     activePlayers     = _context.Players.Where(p => p.Active && p.Bye == false).ToList();
            List <Player>     activeByePlayers  = new List <Player>();
            List <PlayerPair> playerPairs       = new List <PlayerPair>();

            roundMatchups = roundMatchups.Union(pairRoundMatchups).ToList();

            if (roundMatchups != null)
            {
                Tuple <List <PlayerPair>, List <Player> > playerPairsAndByes = (RoundMatchupActions.GetPlayerPairs(roundMatchups, activePlayers));
                playerPairs      = playerPairsAndByes.Item1;
                activeByePlayers = playerPairsAndByes.Item2;
            }
            else
            {
                error = true;
            }

            //List<int> AllocatedTables = new List<int>(GetnoOfTables());
            int secondaryIndex = 0;
            int i = 0;

            while (i < playerPairs.Count && i >= 0)
            {
                //Skip this player if they are already allocated an opponent
                if (playerPairs[i].CurrentOpponent == null)
                {
                    if (secondaryIndex == 0)
                    {
                        secondaryIndex = i + 1;
                    }
                    int s = 0;

                    for (s = secondaryIndex; s < playerPairs.Count; s++)
                    {
                        //If there are no more unique matchups, exit
                        if (i == -1)
                        {
                            i     = -2;
                            error = true;
                            break;
                        }
                        if (playerPairs[s].CurrentOpponent == null)
                        {
                            //Check if higher player has ever played lower player
                            var playerOneOpponents = PlayerActions.GetAllOpponents(playerPairs[i].First, _context);
                            var playerTwoOpponents = PlayerActions.GetAllOpponents(playerPairs[i].Second, _context);
                            var opponents          = playerOneOpponents.Union(playerTwoOpponents);
                            var hasPlayed          = false;
                            foreach (Player opponent in opponents)
                            {
                                if (playerPairs[s].First == opponent || playerPairs[s].Second == opponent)
                                {
                                    hasPlayed = true;
                                }
                            }
                            //If they have not played allocate them as opponents
                            if (hasPlayed == false)
                            {
                                playerPairs[i].CurrentOpponent = playerPairs[s];
                                playerPairs[s].CurrentOpponent = playerPairs[i];
                                secondaryIndex = 0;
                                break;
                            }

                            /**
                             * Following block is to deallocate the next lowest ranked allocated pair
                             **/
                            if (playerPairs.Where(p => p.CurrentOpponent == null).LastOrDefault() == playerPairs[s] && (playerPairs[i].CurrentOpponent == null))
                            //if (s == (players.Count - 1) && (players[i].CurrentOpponent == null))
                            {
                                if (i - 1 >= 0)
                                {
                                    //Set the lowestAllocatedPair to the highest ranked pair
                                    PlayerPair lowestAllocatedPair = playerPairs[0];
                                    //Iterate from the second highest ranked pair all the way to the pair ranked one higher than the player currently being matched
                                    for (int playerIndex = 1; playerIndex < i; playerIndex++)
                                    {
                                        //Assign the current player to the player being examined in the current iteration of the loop
                                        PlayerPair currentPair = playerPairs[playerIndex];

                                        //Check that the current player has an opponent (if not, skip to the next iteration of the loop)
                                        if (currentPair.CurrentOpponent != null)
                                        {
                                            //Proceed if the current player's opponent has a higher rank than the current player
                                            if (playerPairs.IndexOf(currentPair.CurrentOpponent) < playerPairs.IndexOf(currentPair))
                                            {
                                                if (playerPairs.IndexOf(currentPair.CurrentOpponent) > playerPairs.IndexOf(lowestAllocatedPair))
                                                {
                                                    //Set lowestAllocatedPair to the current player's opponent
                                                    //(The highest ranked member of the new lowest ranked allocated pair)
                                                    lowestAllocatedPair = currentPair.CurrentOpponent;
                                                }
                                            }
                                            //Proceed if the current player has a higher rank than their opponent
                                            else if (playerPairs.IndexOf(currentPair) < playerPairs.IndexOf(currentPair.CurrentOpponent))
                                            {
                                                //Proceed if the current player has a lower rank than the previous value of lowestAllocatedPair
                                                if (playerPairs.IndexOf(currentPair) > playerPairs.IndexOf(lowestAllocatedPair))
                                                {
                                                    //Set lowestAllocatedPair to the current player
                                                    //(The highest ranked member of the new lowest ranked allocated pair)
                                                    lowestAllocatedPair = currentPair;
                                                }
                                            }
                                        }
                                    }
                                    //Set the new player to be allocated to the highest member of the lowestAllocatedPair
                                    i = playerPairs.IndexOf(lowestAllocatedPair) - 1;

                                    //If there are no more unique matchups, exit
                                    if (i == -1)
                                    {
                                        i     = -2;
                                        error = true;
                                        break;
                                    }

                                    //Set the starting player that will be tested for allocation suitability to one rank lower than
                                    //the opponent of the highest member of the allocated pair
                                    secondaryIndex = playerPairs.IndexOf(lowestAllocatedPair.CurrentOpponent) + 1;

                                    //Deallocate the lowest allocated pair as each other's opponent
                                    lowestAllocatedPair.CurrentOpponent.CurrentOpponent = null;
                                    lowestAllocatedPair.CurrentOpponent = null;
                                }
                                else
                                {
                                    i     = -2;
                                    error = true;
                                    break;
                                }
                            }
                        }
                    }
                }
                i++;
            }
            int newRoundNo = lastRound + 1;

            foreach (PlayerPair playerPair in playerPairs)
            {
                if (playerPairs.IndexOf(playerPair) < playerPairs.IndexOf(playerPair.CurrentOpponent))
                {
                    var roundMatchup = new PairRoundMatchup
                    {
                        RoundNo     = newRoundNo,
                        PlayerOne   = playerPair.First,
                        PlayerTwo   = playerPair.Second,
                        PlayerThree = playerPair.CurrentOpponent.First,
                        PlayerFour  = playerPair.CurrentOpponent.Second
                    };

                    //allocates table for matchup
                    //roundMatchup.Table = AllocateTable(GetTables(player), AllocatedTables);

                    _context.Add(roundMatchup);
                }
                //If there are no more unique matchups
                if (error)
                {
                    //RoundMatchup will hold random pair matchups where teammates were opponents last round unless their opponent is no longer active or has a bye
                    if (playerPair.CurrentOpponent == null && playerPairs[playerPairs.IndexOf(playerPair) + 1] != null)
                    {
                        playerPair.CurrentOpponent = playerPairs[playerPairs.IndexOf(playerPair) + 1];
                        playerPair.CurrentOpponent.CurrentOpponent = playerPair;
                        var roundMatchup = new PairRoundMatchup
                        {
                            RoundNo     = newRoundNo,
                            PlayerOne   = playerPair.First,
                            PlayerTwo   = playerPair.Second,
                            PlayerThree = playerPair.CurrentOpponent.First,
                            PlayerFour  = playerPair.CurrentOpponent.Second
                        };
                        _context.Add(roundMatchup);
                    }
                }
            }

            CreateByeRounds(activeByePlayers, newRoundNo, _context);

            _context.SaveChanges();

            if (error)
            {
                return(false);
            }
            return(true);
        }