예제 #1
0
        protected virtual void PopulateResults(NascarQualifyingRun qRun, int count)
        {
            var results = qRun.ConsecutiveLaps
                          .GroupBy(g => new { g.VehicleId, g.DriverId })
                          .Select((item, index) => new { item, index })
                          .Select(g => new QualifyingResult()
            {
                Position  = g.index,
                Round     = qRun.Round,
                VehicleId = g.item.Key.VehicleId,
                DriverId  = g.item.Key.DriverId,
                LapTime   = g.item.Min(l => l.BestLap.LapTime),
                LapSpeed  = g.item.Max(l => l.BestLap.LapSpeed)
            })
                          .ToList();

            var orderedResults = results.OrderBy(r => r.LapTime).Take(count);

            int i = 1;

            foreach (QualifyingResult qResult in orderedResults)
            {
                qResult.Position = i;
                i++;
            }

            qRun.Results = orderedResults.ToList();

            PrintRoundResults(qRun);
        }
예제 #2
0
        protected virtual void SimulateQualifyingRun(NascarQualifyingRun run)
        {
            Console.WriteLine($"Simulating {run.RunType.ToString()} for series {run.SeriesId}");

            var timesOnTrack = 1;

            foreach (NascarVehicle vehicle in run.Vehicles)
            {
                int lapNumber = 0;

                for (int i = 0; i < timesOnTrack; i++)
                {
                    var laps = new NascarConsecutiveLaps()
                    {
                        DriverId  = vehicle.DriverId,
                        VehicleId = vehicle.VehicleId,
                        Laps      = GetLaps(lapNumber + 1)
                    };

                    run.ConsecutiveLaps.Add(laps);

                    lapNumber = laps.Laps.Max(l => l.LapNumber);
                }
            }
        }
예제 #3
0
        public async virtual Task <NascarEvent> SimulateQualifyingAsync(NascarEvent raceEvent)
        {
            _lapTimeService = new LapTimeService(raceEvent.Track);

            NascarQualifyingRun q1 = raceEvent.Runs.OfType <NascarQualifyingRun>().FirstOrDefault(r => r.RunType == NascarRunType.QualifyingStage1);

            if (q1 != null)
            {
                q1.Vehicles = raceEvent.Vehicles;
                SimulateQualifyingRun(q1);
                PopulateResults(q1, raceEvent.Series.QualifyingRound1Count.Value);
            }

            NascarQualifyingRun q2 = raceEvent.Runs.OfType <NascarQualifyingRun>().FirstOrDefault(r => r.RunType == NascarRunType.QualifyingStage2);

            if (q2 != null)
            {
                q2.Vehicles.Clear();
                foreach (QualifyingResult result in q1.Results.OrderBy(r => r.Position).Take(raceEvent.Series.QualifyingRound2Count.Value))
                {
                    q2.Vehicles.Add(new NascarVehicle()
                    {
                        DriverId  = result.DriverId,
                        VehicleId = result.VehicleId
                    });
                }
                SimulateQualifyingRun(q2);
                PopulateResults(q2, raceEvent.Series.QualifyingRound2Count.Value);
            }

            NascarQualifyingRun q3 = raceEvent.Runs.OfType <NascarQualifyingRun>().FirstOrDefault(r => r.RunType == NascarRunType.FinalQualifyingStage);

            if (q3 != null)
            {
                q3.Vehicles.Clear();
                foreach (QualifyingResult result in q2.Results.OrderBy(r => r.Position).Take(raceEvent.Series.QualifyingFinalRoundCount))
                {
                    q3.Vehicles.Add(new NascarVehicle()
                    {
                        DriverId  = result.DriverId,
                        VehicleId = result.VehicleId
                    });
                }
                SimulateQualifyingRun(q3);
                PopulateResults(q3, raceEvent.Series.QualifyingFinalRoundCount);
            }

            ((List <QualifyingResult>)raceEvent.QualifyingResults).AddRange(q1.Results.OrderBy(r => r.Position).Skip(raceEvent.Series.QualifyingRound2Count.Value));
            ((List <QualifyingResult>)raceEvent.QualifyingResults).AddRange(q2.Results.OrderBy(r => r.Position).Skip(raceEvent.Series.QualifyingFinalRoundCount));
            ((List <QualifyingResult>)raceEvent.QualifyingResults).AddRange(q3.Results.OrderBy(r => r.Position).Take(raceEvent.Series.QualifyingRound1Count.Value));

            PrintQualifyingResults(raceEvent);

            return(await Task.FromResult(raceEvent));
        }
예제 #4
0
        private void PrintRoundResults(NascarQualifyingRun qrun)
        {
            Console.WriteLine($" Qualifying Round {qrun.Round} Results");

            foreach (QualifyingResult q in qrun.Results.OrderBy(r => r.Position))
            {
                Console.WriteLine($"{q.Position} Car# {q.VehicleId} {q.LapTime} {q.LapSpeed}");
            }

            Console.WriteLine();
        }