diff --git a/src/Nadeko.Econ/Deck/NewCard.cs b/src/Nadeko.Econ/Deck/NewCard.cs index 9422a0cbe..b52f5ac4f 100644 --- a/src/Nadeko.Econ/Deck/NewCard.cs +++ b/src/Nadeko.Econ/Deck/NewCard.cs @@ -1,15 +1,5 @@ namespace Nadeko.Econ; -public abstract class NewCard +public abstract record class NewCard(TSuit Suit, TValue Value) where TSuit : struct, Enum - where TValue : struct, Enum -{ - public TSuit Suit { get; } - public TValue Value { get; } - - public NewCard(TSuit suit, TValue value) - { - Suit = suit; - Value = value; - } -} \ No newline at end of file + where TValue : struct, Enum; \ No newline at end of file diff --git a/src/Nadeko.Econ/Deck/NewDeck.cs b/src/Nadeko.Econ/Deck/NewDeck.cs index b22debfa8..eee2150a3 100644 --- a/src/Nadeko.Econ/Deck/NewDeck.cs +++ b/src/Nadeko.Econ/Deck/NewDeck.cs @@ -5,26 +5,18 @@ public abstract class NewDeck where TSuit : struct, Enum where TValue : struct, Enum { + protected static readonly TSuit[] _suits = Enum.GetValues(); + protected static readonly TValue[] _values = Enum.GetValues(); + public virtual int CurrentCount => _cards.Count; public virtual int TotalCount { get; } - private readonly LinkedList _cards = new(); + protected readonly LinkedList _cards = new(); public NewDeck() { - var suits = Enum.GetValues(); - var values = Enum.GetValues(); - - TotalCount = suits.Length * values.Length; - - foreach (var suit in suits) - { - foreach (var val in values) - { - _cards.AddLast((TCard)Activator.CreateInstance(typeof(TCard), suit, val)!); - } - } + TotalCount = _suits.Length * _values.Length; } public virtual TCard? Draw() diff --git a/src/Nadeko.Econ/Deck/Regular/MultipleRegularDeck/MultipleRegularDeck.cs b/src/Nadeko.Econ/Deck/Regular/MultipleRegularDeck/MultipleRegularDeck.cs new file mode 100644 index 000000000..189ec4ce7 --- /dev/null +++ b/src/Nadeko.Econ/Deck/Regular/MultipleRegularDeck/MultipleRegularDeck.cs @@ -0,0 +1,28 @@ +namespace Nadeko.Econ; + +public class MultipleRegularDeck : NewDeck +{ + private int Decks { get; } + + public override int TotalCount { get; } + + public MultipleRegularDeck(int decks = 1) + { + if (decks < 1) + throw new ArgumentOutOfRangeException(nameof(decks), "Has to be more than 0"); + + Decks = decks; + TotalCount = base.TotalCount * decks; + + for (var i = 0; i < Decks; i++) + { + foreach (var suit in _suits) + { + foreach (var val in _values) + { + _cards.AddLast((RegularCard)Activator.CreateInstance(typeof(RegularCard), suit, val)!); + } + } + } + } +} \ No newline at end of file diff --git a/src/Nadeko.Econ/Deck/Regular/RegularCard.cs b/src/Nadeko.Econ/Deck/Regular/RegularCard.cs index 80c242c29..70a8278e4 100644 --- a/src/Nadeko.Econ/Deck/Regular/RegularCard.cs +++ b/src/Nadeko.Econ/Deck/Regular/RegularCard.cs @@ -1,20 +1,4 @@ namespace Nadeko.Econ; -public sealed class RegularCard : NewCard -{ - public RegularCard(RegularSuit suit, RegularValue value) : base(suit, value) - { - } - - private bool Equals(RegularCard other) - => other.Suit == this.Suit && other.Value == this.Value; - - public override bool Equals(object? obj) - => ReferenceEquals(this, obj) || obj is RegularCard other && Equals(other); - - public override int GetHashCode() - => Suit.GetHashCode() * 17 + Value.GetHashCode(); - - public override string ToString() - => $"{Value.ToString()}-{Suit.ToString()}"; -} \ No newline at end of file +public sealed record class RegularCard(RegularSuit Suit, RegularValue Value) + : NewCard(Suit, Value); \ No newline at end of file diff --git a/src/Nadeko.Econ/Deck/Regular/RegularDeck.cs b/src/Nadeko.Econ/Deck/Regular/RegularDeck.cs index 28eebd8a0..291c159c6 100644 --- a/src/Nadeko.Econ/Deck/Regular/RegularDeck.cs +++ b/src/Nadeko.Econ/Deck/Regular/RegularDeck.cs @@ -2,4 +2,14 @@ public sealed class RegularDeck : NewDeck { + public RegularDeck() + { + foreach (var suit in _suits) + { + foreach (var val in _values) + { + _cards.AddLast((RegularCard)Activator.CreateInstance(typeof(RegularCard), suit, val)!); + } + } + } } \ No newline at end of file diff --git a/src/NadekoBot.Tests/NewDeckTests.cs b/src/NadekoBot.Tests/NewDeckTests.cs index 31e8d869b..aa0736766 100644 --- a/src/NadekoBot.Tests/NewDeckTests.cs +++ b/src/NadekoBot.Tests/NewDeckTests.cs @@ -42,7 +42,7 @@ public class NewDeckTests var lastCard = _deck.Draw(); Assert.IsNotNull(lastCard); - Assert.AreEqual(lastCard, new RegularCard(RegularSuit.Spades, RegularValue.King)); + Assert.AreEqual(new RegularCard(RegularSuit.Spades, RegularValue.King), lastCard); var noCard = _deck.Draw(); @@ -65,7 +65,19 @@ public class NewDeckTests var ace = _deck.Peek()!; var tenOfSpades = _deck.Peek(48); - Assert.AreEqual(ace, new RegularCard(RegularSuit.Hearts, RegularValue.Ace)); - Assert.AreEqual(tenOfSpades, new RegularCard(RegularSuit.Spades, RegularValue.Ten)); + Assert.AreEqual(new RegularCard(RegularSuit.Hearts, RegularValue.Ace), ace); + Assert.AreEqual(new RegularCard(RegularSuit.Spades, RegularValue.Ten), tenOfSpades); + } + + [Test] + public void TestMultipleDeck() + { + var quadDeck = new MultipleRegularDeck(4); + var count = quadDeck.TotalCount; + + Assert.AreEqual(52 * 4, count); + + var card = quadDeck.Peek(54); + Assert.AreEqual(new RegularCard(RegularSuit.Hearts, RegularValue.Three), card); } } \ No newline at end of file