Exemplo n.º 1
0
        private void AdjustScore(Guid agentId, CompetitorResult result)
        {
            var scriptScore = _context.Stats
                              .SingleOrDefault(s => s.ScriptId == agentId);

            if (scriptScore == null)
            {
                var newStats = new ScriptStatistics()
                {
                    ScriptId = agentId, Wins = result.Result == CompetitionResult.Winner ? 1 : 0, GamesPlayed = 1, CumulativeScore = result.Score
                };

                _context.Stats.Add(newStats);
                scriptScore = newStats;
            }
            else
            {
                scriptScore.GamesPlayed += 1;

                scriptScore.CumulativeScore += result.Score;

                if (result.Result == CompetitionResult.Winner)
                {
                    scriptScore.Wins += 1;
                }
            }

            _context.Commit();
        }
Exemplo n.º 2
0
 protected override CompetitorResult GetResult(IActorRef playerActor)
 {
     if (_gameBoard.PlayersWithIllegalMoves.Contains(playerActor))
     {
         return(CompetitorResult.FromResult(CompetitionResult.Loser));
     }
     if (_gameBoard.IsPlayerWinner(playerActor))
     {
         return(CompetitorResult.FromResult(CompetitionResult.Winner));
     }
     if (_gameBoard.IsFull() || _gameBoard.IsIllegalMoveCommitted())
     {
         return(CompetitorResult.FromResult(CompetitionResult.Inconclusive));
     }
     return(CompetitorResult.FromResult(CompetitionResult.Loser));
 }
Exemplo n.º 3
0
        private bool generateFinalResults(List<CompetitorAxware> competitorsRawResults)
        {
            int maxNumberOfTimes = 0;
            string[] timesStr = new string[20];
            double[] times = new double[20];

            double overallFastestLap = Double.MaxValue;
            double n2FastestLap = Double.MaxValue;
            double n4FastestLap = Double.MaxValue;
            double e2FastestLap = Double.MaxValue;
            double e4FastestLap = Double.MaxValue;
            double proFastestLap = Double.MaxValue;

            double truckFastestLap = Double.MaxValue;
            // Holders to find the best times in class
            double[] overallCompetitorTimes = new double[competitorsRawResults.Count()];
            List<double> n2CompetitorTimes = new List<double>();
            List<double> n4CompetitorTimes = new List<double>();
            List<double> e2CompetitorTimes = new List<double>();
            List<double> e4CompetitorTimes = new List<double>();
            List<double> proCompetitorTimes = new List<double>();
            List<double> truckCompetitorTimes = new List<double>();

            // Container to hold calculated results, but unordered
            //  List<CompetitorResult> competitorsProcessedResults = new List<CompetitorResult>();
            int competitorIndex = 0;

            // First find how many runs each competitor have completed and find the maximum value;
            foreach (CompetitorAxware competitor in competitorsRawResults)
            {
                var timeList = new List<string> { competitor.Run1, competitor.Run2, competitor.Run3,competitor.Run4,competitor.Run5,competitor.Run6,competitor.Run7,competitor.Run8, competitor.Run9,competitor.Run10,competitor.Run11,
                    competitor.Run12,competitor.Run13,competitor.Run14,competitor.Run15,competitor.Run16,competitor.Run17,competitor.Run18,competitor.Run19,competitor.Run20 };
                var numberOfTimes = timeList.Count(k => k != "");
                if (numberOfTimes > maxNumberOfTimes)
                    maxNumberOfTimes = numberOfTimes;
            }

            // Calculate total time and position for each competitor
            foreach (CompetitorAxware competitor in competitorsRawResults)
            {
                var competitorFinalResult = new CompetitorResult
                {
                    // Assign the basic properties
                    Car = competitor.Car,
                    Name = competitor.Name,
                    //Class = competitor.Class,
                    Number = competitor.Number
                };

                if (maxNumberOfTimes > 0)
                {
                    int penalties = 0;
                    var timeList = new List<string> { competitor.Run1, competitor.Run2, competitor.Run3,competitor.Run4,competitor.Run5,competitor.Run6,competitor.Run7,competitor.Run8, competitor.Run9,competitor.Run10,competitor.Run11,
                    competitor.Run12,competitor.Run13,competitor.Run14,competitor.Run15,competitor.Run16,competitor.Run17,competitor.Run18,competitor.Run19,competitor.Run20 };
                    var penaltyList = new List<string> { competitor.Pen1, competitor.Pen2, competitor.Pen3, competitor.Pen4, competitor.Pen5, competitor.Pen6, competitor.Pen7, competitor.Pen8, competitor.Pen9, competitor.Pen10,
                    competitor.Pen11, competitor.Pen12,competitor.Pen13, competitor.Pen14,competitor.Pen15, competitor.Pen16,competitor.Pen17, competitor.Pen18,competitor.Pen19, competitor.Pen20};

                    // Add times to an array
                    int i = 0;
                    foreach (var time in timeList)
                    {
                        timesStr[i] = time;
                        i++;
                    }

                    // Update time string with penalties (if applicable). Times over 300s or Off-course are capped
                    i = 0;
                    foreach (string penalty in penaltyList)
                    {
                        times[i] = singleTimeValidation(ref timesStr[i], penalty);
                        if (penalty != "")
                        {
                            try
                            {
                                penalties += Convert.ToInt32(penalty);
                            }
                            catch (Exception)
                            {
                                // Cannot convert (off/dnf/dns)
                                //continue;
                            }
                        }
                        i++;
                    }

                    // If competitor has less timed runs than the maximum number of timed runs, add 300s to the missed runs
                    if (times.Count(k => k > 0) < maxNumberOfTimes)
                    {
                        for (int j = times.Count(k => k > 0); j < maxNumberOfTimes; j++)
                        {
                            times[j] = 300;
                            timesStr[j] = "300.000";
                        }
                    }

                    // Update result field with times + penalty
                    competitorFinalResult.Time1 = timesStr[0];
                    competitorFinalResult.Time2 = timesStr[1];
                    competitorFinalResult.Time3 = timesStr[2];
                    competitorFinalResult.Time4 = timesStr[3];
                    competitorFinalResult.Time5 = timesStr[4];
                    competitorFinalResult.Time6 = timesStr[5];
                    competitorFinalResult.Time7 = timesStr[6];
                    competitorFinalResult.Time8 = timesStr[7];
                    competitorFinalResult.Time9 = timesStr[8];
                    competitorFinalResult.Time10 = timesStr[9];
                    competitorFinalResult.Time11 = timesStr[10];
                    competitorFinalResult.Time12 = timesStr[11];
                    competitorFinalResult.Time13 = timesStr[12];
                    competitorFinalResult.Time14 = timesStr[13];
                    competitorFinalResult.Time15 = timesStr[14];
                    competitorFinalResult.Time16 = timesStr[15];
                    competitorFinalResult.Time17 = timesStr[16];
                    competitorFinalResult.Time18 = timesStr[17];
                    competitorFinalResult.Time19 = timesStr[18];
                    competitorFinalResult.Time20 = timesStr[19];
                    competitorFinalResult.Penalties = penalties;

                    // Raw time (all summed up)
                    competitorFinalResult.RawTime = times.Sum();

                    //Discard the slowest time if competitor has more than one timed run
                    if (maxNumberOfTimes > 1)
                        competitorFinalResult.MinusSlowest = times.Sum() - times.Max();
                    else
                        competitorFinalResult.MinusSlowest = times.Sum();

                    overallCompetitorTimes[competitorIndex] = competitorFinalResult.MinusSlowest;

                    competitorFinalResult.FastestLap = times.Where(f => f > 0).Min();
                }

                if (competitorFinalResult.FastestLap < overallFastestLap)
                    overallFastestLap = competitorFinalResult.FastestLap;

                switch (competitor.Class)
                {
                    case CompetitionClass.n2:
                        n2CompetitorTimes.Add(competitorFinalResult.MinusSlowest);
                        n2Competitors.Add(competitorFinalResult);
                        if (competitorFinalResult.FastestLap < n2FastestLap)
                            n2FastestLap = competitorFinalResult.FastestLap;
                        break;
                    case CompetitionClass.n4:
                        n4CompetitorTimes.Add(competitorFinalResult.MinusSlowest);
                        n4Competitors.Add(competitorFinalResult);
                        if (competitorFinalResult.FastestLap < n4FastestLap)
                            n4FastestLap = competitorFinalResult.FastestLap;
                        break;
                    case CompetitionClass.e2:
                        e2CompetitorTimes.Add(competitorFinalResult.MinusSlowest);
                        e2Competitors.Add(competitorFinalResult);
                        if (competitorFinalResult.FastestLap < e2FastestLap)
                            e2FastestLap = competitorFinalResult.FastestLap;
                        break;
                    case CompetitionClass.e4:
                        e4CompetitorTimes.Add(competitorFinalResult.MinusSlowest);
                        e4Competitors.Add(competitorFinalResult);
                        if (competitorFinalResult.FastestLap < e4FastestLap)
                            e4FastestLap = competitorFinalResult.FastestLap;
                        break;
                    case CompetitionClass.pro:
                    case CompetitionClass.p2:
                    case CompetitionClass.p4:
                        proCompetitorTimes.Add(competitorFinalResult.MinusSlowest);
                        proCompetitors.Add(competitorFinalResult);
                        if (competitorFinalResult.FastestLap < proFastestLap)
                            proFastestLap = competitorFinalResult.FastestLap;
                        break;
                    case CompetitionClass.truck:
                        truckCompetitorTimes.Add(competitorFinalResult.MinusSlowest);
                        truckCompetitors.Add(competitorFinalResult);
                        if (competitorFinalResult.FastestLap < truckFastestLap)
                            truckFastestLap = competitorFinalResult.FastestLap;
                        break;
                    default:
                        break;
                }
                // Clone the object, so it can be used in two different lists independently
                overallCompetitors.Add((CompetitorResult)competitorFinalResult.Clone());
                competitorIndex++;
            }

            // Find out what is the overall position for each competitor
            double[] n2CompetitorTimesArray = n2CompetitorTimes.ToArray();
            double[] n4CompetitorTimesArray = n4CompetitorTimes.ToArray();
            double[] e2CompetitorTimesArray = e2CompetitorTimes.ToArray();
            double[] e4CompetitorTimesArray = e4CompetitorTimes.ToArray();
            double[] proCompetitorTimesArray = proCompetitorTimes.ToArray();
            double[] truckCompetitorTimesArray = truckCompetitorTimes.ToArray();

            //Sort array by fastest times
            Array.Sort(overallCompetitorTimes);
            Array.Sort(n2CompetitorTimesArray);
            Array.Sort(n4CompetitorTimesArray);
            Array.Sort(e2CompetitorTimesArray);
            Array.Sort(e4CompetitorTimesArray);
            Array.Sort(proCompetitorTimesArray);
            Array.Sort(truckCompetitorTimesArray);

            // Set classification + competitors in class + fastest lap points
            int[] pointsScheme = { 20, 18, 16, 14, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1 };
            int bestLap = 3;

            foreach (var competitor in overallCompetitors)
            {
                competitor.Position = Array.IndexOf(overallCompetitorTimes, competitor.MinusSlowest) + 1;
                competitor.CompetitorsInClassPoints = overallCompetitors.Count();
                competitor.FastestLapPoints = competitor.FastestLap == overallFastestLap ? bestLap : 0;
                competitor.PositionPoints = competitor.Position < pointsScheme.Length ? pointsScheme[competitor.Position - 1] : 0;
                competitor.Points = competitor.FastestLapPoints + competitor.CompetitorsInClassPoints + competitor.PositionPoints;
            }

            foreach (var competitor in n2Competitors)
            {
                competitor.Position = Array.IndexOf(n2CompetitorTimesArray, competitor.MinusSlowest) + 1;
                competitor.CompetitorsInClassPoints = n2Competitors.Count();
                competitor.FastestLapPoints = competitor.FastestLap == n2FastestLap ? bestLap : 0;
                competitor.PositionPoints = competitor.Position < pointsScheme.Length ? pointsScheme[competitor.Position - 1] : 0;
                competitor.Points = competitor.FastestLapPoints + competitor.CompetitorsInClassPoints + competitor.PositionPoints;
            }

            foreach (var competitor in n4Competitors)
            {
                competitor.Position = Array.IndexOf(n4CompetitorTimesArray, competitor.MinusSlowest) + 1;
                competitor.CompetitorsInClassPoints = n4Competitors.Count();
                competitor.FastestLapPoints = competitor.FastestLap == n4FastestLap ? bestLap : 0;
                competitor.PositionPoints = competitor.Position < pointsScheme.Length ? pointsScheme[competitor.Position - 1] : 0;
                competitor.Points = competitor.FastestLapPoints + competitor.CompetitorsInClassPoints + competitor.PositionPoints;
            }

            foreach (var competitor in e2Competitors)
            {
                competitor.Position = Array.IndexOf(e2CompetitorTimesArray, competitor.MinusSlowest) + 1;
                competitor.CompetitorsInClassPoints = e2Competitors.Count();
                competitor.FastestLapPoints = competitor.FastestLap == e2FastestLap ? bestLap : 0;
                competitor.PositionPoints = competitor.Position < pointsScheme.Length ? pointsScheme[competitor.Position - 1] : 0;
                competitor.Points = competitor.FastestLapPoints + competitor.CompetitorsInClassPoints + competitor.PositionPoints;
            }

            foreach (var competitor in e4Competitors)
            {
                competitor.Position = Array.IndexOf(e4CompetitorTimesArray, competitor.MinusSlowest) + 1;
                competitor.CompetitorsInClassPoints = e4Competitors.Count();
                competitor.FastestLapPoints = competitor.FastestLap == e4FastestLap ? bestLap : 0;
                competitor.PositionPoints = competitor.Position < pointsScheme.Length ? pointsScheme[competitor.Position - 1] : 0;
                competitor.Points = competitor.FastestLapPoints + competitor.CompetitorsInClassPoints + competitor.PositionPoints;
            }
            foreach (var competitor in proCompetitors)
            {
                competitor.Position = Array.IndexOf(proCompetitorTimesArray, competitor.MinusSlowest) + 1;
                competitor.CompetitorsInClassPoints = proCompetitors.Count();
                competitor.FastestLapPoints = competitor.FastestLap == proFastestLap ? bestLap : 0;
                competitor.PositionPoints = competitor.Position < pointsScheme.Length ? pointsScheme[competitor.Position - 1] : 0;
                competitor.Points = competitor.FastestLapPoints + competitor.CompetitorsInClassPoints + competitor.PositionPoints;
            }
            foreach (var competitor in truckCompetitors)
            {
                competitor.Position = Array.IndexOf(truckCompetitorTimesArray, competitor.MinusSlowest) + 1;
                competitor.CompetitorsInClassPoints = truckCompetitors.Count();
                competitor.FastestLapPoints = competitor.FastestLap == truckFastestLap ? bestLap : 0;
                competitor.PositionPoints = competitor.Position < pointsScheme.Length ? pointsScheme[competitor.Position - 1] : 0;
                competitor.Points = competitor.FastestLapPoints + competitor.CompetitorsInClassPoints + competitor.PositionPoints;
            }
            // Order by position
            overallCompetitors = overallCompetitors.OrderBy(o => o.Position).ToList();
            n2Competitors = n2Competitors.OrderBy(o => o.Position).ToList();
            n4Competitors = n4Competitors.OrderBy(o => o.Position).ToList();
            e2Competitors = e2Competitors.OrderBy(o => o.Position).ToList();
            e4Competitors = e4Competitors.OrderBy(o => o.Position).ToList();
            proCompetitors = proCompetitors.OrderBy(o => o.Position).ToList();
            truckCompetitors = truckCompetitors.OrderBy(o => o.Position).ToList();

            // Write to file
            return CompetitorService.WriteResultsFile(Path.Combine(path, "ERCresult.csv"), overallCompetitors, n2Competitors, n4Competitors, e2Competitors, e4Competitors, proCompetitors, truckCompetitors);
        }
Exemplo n.º 4
0
 public ScriptCompetitionResult(Guid scriptId, CompetitorResult result)
 {
     ScriptId = scriptId;
     Result   = result;
 }
        public void WriteAndRead()
        {
            using (var databaseSession = NHibernateHelper.OpenSession())
            {
                var competitorResults = from competitorResult in databaseSession.Query<CompetitorResult>()
                                        where competitorResult.Competitor == this.testCompetitor
                                        select competitorResult;

                Assert.IsNotNull(competitorResults);
                Assert.AreEqual(0, competitorResults.Count());

                var toAdd = new CompetitorResult
                {
                    Competitor = this.testCompetitor,
                    Station = this.testStation
                };
                using (var transaction = databaseSession.BeginTransaction())
                {
                    databaseSession.Save(toAdd);
                    transaction.Commit();
                }
            }

            using (var databaseSession = NHibernateHelper.OpenSession())
            {
                var competitorResults = from competitorResult in databaseSession.Query<CompetitorResult>()
                                        where competitorResult.Competitor == this.testCompetitor
                                        select competitorResult;

                Assert.IsNotNull(competitorResults);
                Assert.AreEqual(1, competitorResults.Count());

                using (var transaction = databaseSession.BeginTransaction())
                {
                    databaseSession.Delete(competitorResults.ToArray()[0]);
                    transaction.Commit();
                }
            }

            using (var databaseSession = NHibernateHelper.OpenSession())
            {
                var competitorResults = from competitorResult in databaseSession.Query<CompetitorResult>()
                                        where competitorResult.Competitor == this.testCompetitor
                                        select competitorResult;

                Assert.IsNotNull(competitorResults);
                Assert.AreEqual(0, competitorResults.Count());
            }
        }
        public void DeleteCompetitionAndCascade()
        {
            using (var databaseSession = NHibernateHelper.OpenSession())
            {
                var competitorResults = (from competitorResult in databaseSession.Query<CompetitorResult>()
                                        where competitorResult.Competitor == this.testCompetitor
                                        select competitorResult).ToArray();

                Assert.IsNotNull(competitorResults);
                Assert.AreEqual(0, competitorResults.Count());

                var toAdd = new CompetitorResult
                {
                    Competitor = this.testCompetitor,
                    Station = this.testStation
                };
                using (var transaction = databaseSession.BeginTransaction())
                {
                    databaseSession.Save(toAdd);
                    transaction.Commit();
                }
            }

            using (var databaseSession = NHibernateHelper.OpenSession())
            {
                var competition = (from dbcompetition in databaseSession.Query<Competition>()
                                   where dbcompetition.Name == CompetitionName
                                   select dbcompetition).First();

                Assert.AreEqual(1, competition.Shooters.Count);
                Assert.AreEqual(1, competition.Shooters[0].Competitors.Count);
                Assert.AreEqual(1, competition.Shooters[0].Competitors[0].CompetitorResults.Count);

                var competitorResults = (from competitorResult in databaseSession.Query<CompetitorResult>()
                                        where competitorResult.Competitor == this.testCompetitor
                                        select competitorResult).ToArray();

                Assert.IsNotNull(competitorResults);
                Assert.AreEqual(1, competitorResults.Count());

                using (var transaction = databaseSession.BeginTransaction())
                {
                    databaseSession.Delete(competition);
                    transaction.Commit();
                }

                competitorResults = (from competitorResult in databaseSession.Query<CompetitorResult>()
                                         where competitorResult.Competitor == this.testCompetitor
                                         select competitorResult).ToArray();

                Assert.IsNotNull(competitorResults);
                Assert.AreEqual(0, competitorResults.Count());
            }
        }