public override Player GetWinner()
        {
            Player winningPlayer;

            if (!IsComplete)
            {
                winningPlayer = null;
            }
            else
            {
                var winningPoint = PlayerPoints.Cast <GamePoint>().ToList()
                                   .OrderByDescending(playerPoint => playerPoint.Amount)
                                   .FirstOrDefault(point => point.HasAdvantage || point.Amount == MininumPointsToWinGame);

                winningPlayer = Players.FirstOrDefault(player => player.PlayerID == winningPoint.PlayerID);
            }

            return(winningPlayer);
        }
 protected override void Increase(int winningPlayerID)
 {
     if (IsDeuce())
     {
         (PlayerPoints[winningPlayerID] as GamePoint).HasAdvantage = true;
     }
     else if (IsDeuceSavePoint(winningPlayerID))
     {
         (PlayerPoints.Cast <GamePoint>().ToList())
         .FirstOrDefault(pp => pp.HasAdvantage)
         .HasAdvantage = false;
     }
     else if (IsWinPoint(winningPlayerID))
     {
         (PlayerPoints[winningPlayerID] as GamePoint).IsFinished = true;
     }
     else
     {
         UpdateWinningPlayerScore(winningPlayerID);
     }
 }
 private bool IsDeuceSavePoint(int winningPlayerID)
 {
     return(PlayerPoints[winningPlayerID].Amount == MininumPointsToWinGame &&
            (PlayerPoints.Cast <GamePoint>().ToList()).Any(pp => pp.HasAdvantage));
 }
 private bool IsSimpleScoringUpdate()
 {
     return((PlayerPoints.Cast <GamePoint>().ToList()).All(pp => pp.Amount <= MininumPointsToWinGame && !pp.HasAdvantage) &&
            PlayerPoints.Any(pp => pp.Amount < MininumPointsToWinGame));
 }