diff --git a/Lottery/Generator.cs b/Lottery/Generator.cs index 89950e1..bbf0142 100644 --- a/Lottery/Generator.cs +++ b/Lottery/Generator.cs @@ -1,56 +1,97 @@ namespace Lottery { - /// - /// - /// - class UKGenerator : IGenerator - { - public int Count { get; } = 6; + record Limits(int Count, int Lower, int Upper); - public List Generate() + /// + /// Abstract base class for generators + /// It implements the IGenerator interface + /// Provides some default implementation + /// + class Generator : IGenerator + { + public virtual Numbers Generate() => throw new NotImplementedException(); + + protected static void FillNumbers(List NumberList, Limits Limits) { - List numbers = []; - for (int i = 0; i < Count; i++) + List Candidates = Enumerable.Range(Limits.Lower, Limits.Upper).ToList(); + + for (int i = 0; i < Limits.Count; i++) { - numbers.Add(Random.Shared.Next(60)); + int RandomIndex = Random.Shared.Next(Candidates.Count); + NumberList.Add(Candidates[RandomIndex]); + Candidates.RemoveAt(RandomIndex); } - return numbers; + NumberList.Sort(); } } /// - /// + /// Concrete UKGenerator class. + /// Generates six balls from 1 to 59 /// - class EuroGenerator : IGenerator + class UKGenerator : Generator { - public int Count { get; } = 8; + private readonly Limits Limits = new(6, 1, 59); - public List Generate() + public override Numbers Generate() { - List numbers = []; - for (int i = 0; i < Count; i++) - { - numbers.Add(Random.Shared.Next(60)); - } - return numbers; + Numbers Numbers = new(KindOfLotto.Uk, []); + Generator.FillNumbers(Numbers.Normal, Limits); + return Numbers; } } /// - /// + /// Concrete EuroGenerator class. + /// Generates five balls from 1 to 50 and two balls from 1 to 12 /// - class SetForLifeGenerator : IGenerator + class EuroGenerator : Generator { - public int Count { get; } = 10; + private readonly Limits NormalLimits = new(5, 1, 50); + private readonly Limits SpecialLimits = new(2, 1, 12); - public List Generate() + public override Numbers Generate() { - List numbers = []; - for (int i = 0; i < Count; i++) - { - numbers.Add(Random.Shared.Next(60)); - } - return numbers; + NumbersWithSpecial Numbers = new(KindOfLotto.Euro, [], []); + Generator.FillNumbers(Numbers.Normal, NormalLimits); + Generator.FillNumbers(Numbers.Special, SpecialLimits); + return Numbers; + } + } + + /// + /// Concrete SetForLifeGenerator class. + /// Generates five balls from 1 to 47 and one ball from 1 to 10 + /// + class SetForLifeGenerator : Generator + { + private readonly Limits NormalLimits = new(5, 1, 47); + private readonly Limits SpecialLimits = new(1, 1, 10); + + public override Numbers Generate() + { + NumbersWithSpecial Numbers = new(KindOfLotto.SetForLife, [], []); + Generator.FillNumbers(Numbers.Normal, NormalLimits); + Generator.FillNumbers(Numbers.Special, SpecialLimits); + return Numbers; + } + } + + /// + /// Concrete ThunderBallGenerator class. + /// Generates fives balls from 1 to 39 and one ball from 1 to 14 + /// + class ThunderBallGenerator : Generator + { + private readonly Limits NormalLimits = new(5, 1, 39); + private readonly Limits SpecialLimits = new(1, 1, 14); + + public override Numbers Generate() + { + NumbersWithSpecial Numbers = new(KindOfLotto.Thunderball, [], []); + Generator.FillNumbers(Numbers.Normal, NormalLimits); + Generator.FillNumbers(Numbers.Special, SpecialLimits); + return Numbers; } } }