diff --git a/Lottery/Generator.cs b/Lottery/Generator.cs
index f27f7b6..c399367 100644
--- a/Lottery/Generator.cs
+++ b/Lottery/Generator.cs
@@ -1,101 +1,19 @@
namespace Lottery
{
- record Limits(int Count, int Lower, int Upper);
-
- ///
- /// Abstract base class for generators
- /// All subclasses must implement 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)
+ internal class Generator
+ {
+ public static List Generate(Limits Limits)
{
List Candidates = Enumerable.Range(Limits.Lower, Limits.Upper).ToList();
+ List Numbers = [];
for (int i = 0; i < Limits.Count; i++)
{
int RandomIndex = Random.Shared.Next(Candidates.Count);
- NumberList.Add(Candidates[RandomIndex]);
+ Numbers.Add(Candidates[RandomIndex]);
Candidates.RemoveAt(RandomIndex);
}
- NumberList.Sort();
- }
-
- protected static void FillNumbers(
- List NormalList, Limits NormalLimits,
- List SpecialList, Limits SpecialLimits)
- {
- FillNumbers(NormalList, NormalLimits);
- FillNumbers(SpecialList, SpecialLimits);
- }
- }
-
- ///
- /// Concrete UKLottoGenerator class.
- /// Generates six balls from 1 to 59
- ///
- class UKLottoGenerator : Generator
- {
- private readonly Limits Limits = new(6, 1, 59);
-
- public override Numbers Generate()
- {
- Numbers Numbers = new([]);
- Generator.FillNumbers(Numbers.Normal, Limits);
- return Numbers;
- }
- }
-
- ///
- /// Concrete EuroMillionsGenerator class.
- /// Generates five balls from 1 to 50 and two balls from 1 to 12
- ///
- class EuroMillionsGenerator : Generator
- {
- private readonly Limits NormalLimits = new(5, 1, 50);
- private readonly Limits SpecialLimits = new(2, 1, 12);
-
- public override Numbers Generate()
- {
- NumbersWithSpecial Numbers = new([], []);
- Generator.FillNumbers(Numbers.Normal, NormalLimits, 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([], []);
- Generator.FillNumbers(Numbers.Normal, NormalLimits, 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([], []);
- Generator.FillNumbers(Numbers.Normal, NormalLimits, Numbers.Special, SpecialLimits);
+ Numbers.Sort();
return Numbers;
}
}
diff --git a/Lottery/IGenerator.cs b/Lottery/IGenerator.cs
deleted file mode 100644
index f086499..0000000
--- a/Lottery/IGenerator.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace Lottery
-{
- ///
- /// All Generators must implement the Generate method
- ///
- interface IGenerator
- {
- Numbers Generate();
- }
-}
diff --git a/Lottery/Lottery.cs b/Lottery/Lottery.cs
index 8168c05..13671a4 100644
--- a/Lottery/Lottery.cs
+++ b/Lottery/Lottery.cs
@@ -1,53 +1,36 @@
namespace Lottery
{
- ///
- /// Base Lottery class, use it for lotteries that generate a single set of numbers.
- /// SpecialIdentifier may be overridden for Lotteries with Special values.
- ///
- /// A fully formed Generator
- internal class Lottery(IGenerator Generator)
+ internal class Lottery(Limits limits)
{
- protected Numbers GenerateNumbers() => Generator.Generate();
-
- public virtual string Output()
- {
- var numbers = GenerateNumbers();
- return $"Numbers: {string.Join(", ", numbers.Normal)}";
- }
+ protected Limits Limits => limits;
+ public virtual string Play() => $"Numbers: {string.Join(", ", Generator.Generate(Limits))}";
}
- ///
- /// Abstract base class, for lotteries with special values.
- /// It subclasses Lottery.
- ///
- /// A fully formed Generator
- internal class LotteryWithSpecial(IGenerator Generator) : Lottery(Generator)
+ internal class LotteryWithSpecial(Limits limits, Limits specialLimits) : Lottery(limits)
{
+ protected Limits SpecialLimits => specialLimits;
protected virtual string SpecialIdentifier => throw new NotImplementedException();
- public override string Output()
+ public override string Play()
{
- var numbers = GenerateNumbers() as NumbersWithSpecial
- ?? throw new LotteryException($"Unable to generate numbers for {this}");
-
return string.Join("\t", [
- $"Numbers: {string.Join(", ", numbers.Normal)}",
- $"{SpecialIdentifier}: {string.Join(", ", numbers.Special)}",
+ $"Numbers: {string.Join(", ", Generator.Generate(Limits))}",
+ $"{SpecialIdentifier}: {string.Join(", ", Generator.Generate(SpecialLimits))}",
]);
}
}
- internal class EuroMillionsLotteryWithSpecial(IGenerator Generator) : LotteryWithSpecial(Generator)
+ internal class EuroMillionsLottery(Limits limits, Limits specialLimits) : LotteryWithSpecial(limits, specialLimits)
{
protected override string SpecialIdentifier => "Lucky Stars";
}
- internal class SetForLifeLotteryWithSpecial(IGenerator Generator) : LotteryWithSpecial(Generator)
+ internal class SetForLifeLottery(Limits limits, Limits specialLimits) : LotteryWithSpecial(limits, specialLimits)
{
protected override string SpecialIdentifier => "Life Ball";
}
- internal class ThunderballLotteryWithSpecial(IGenerator Generator) : LotteryWithSpecial(Generator)
+ internal class ThunderballLottery(Limits limits, Limits specialLimits) : LotteryWithSpecial(limits, specialLimits)
{
protected override string SpecialIdentifier => "Thunderball";
}
diff --git a/Lottery/MainPage.xaml b/Lottery/MainPage.xaml
index 3412cf7..83ec55f 100644
--- a/Lottery/MainPage.xaml
+++ b/Lottery/MainPage.xaml
@@ -9,9 +9,9 @@
Spacing="25">
-
+
-
+
diff --git a/Lottery/MainPage.xaml.cs b/Lottery/MainPage.xaml.cs
index 9d32ae0..18ea968 100644
--- a/Lottery/MainPage.xaml.cs
+++ b/Lottery/MainPage.xaml.cs
@@ -1,12 +1,14 @@
namespace Lottery
{
+ internal record Limits(int Count, int Lower, int Upper);
+
public partial class MainPage : ContentPage
{
readonly List Lotteries = [
- new Lottery(new UKLottoGenerator()),
- new EuroMillionsLotteryWithSpecial(new EuroMillionsGenerator()),
- new SetForLifeLotteryWithSpecial(new SetForLifeGenerator()),
- new ThunderballLotteryWithSpecial(new ThunderBallGenerator())
+ new Lottery(limits: new Limits(6, 1, 59)),
+ new EuroMillionsLottery(limits: new Limits(5, 1, 50), specialLimits: new Limits(2, 1, 12)),
+ new SetForLifeLottery(limits: new Limits(5, 1, 47), specialLimits: new Limits(1, 1, 10)),
+ new ThunderballLottery(limits: new Limits(5, 1, 39), specialLimits: new Limits(1, 1, 14))
];
const KindOfLottery DefaultLottery = KindOfLottery.Uk;
Lottery Lottery;
@@ -22,9 +24,9 @@
Lottery = Lotteries[LotteryPicker.SelectedIndex];
}
- private void SpinButton_Clicked(object sender, EventArgs e)
+ private void PlayButton_Clicked(object sender, EventArgs e)
{
- NumbersLabel.Text = Lottery.Output();
+ NumbersLabel.Text = Lottery.Play();
SemanticScreenReader.Announce(NumbersLabel.Text);
}
diff --git a/Lottery/Numbers.cs b/Lottery/Numbers.cs
deleted file mode 100644
index f6ca9b4..0000000
--- a/Lottery/Numbers.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace Lottery
-{
- internal record Numbers(List Normal);
-
- internal record NumbersWithSpecial(List Normal, List Special) : Numbers(Normal);
-}