Added MultipleDeck which can be used in place of the old QuadDeck, converted cards from classes to records as it is useful to have default equality checks.

This commit is contained in:
Kwoth
2022-07-23 07:43:18 +02:00
parent ccf92ca702
commit 967784c860
6 changed files with 62 additions and 46 deletions

View File

@@ -1,15 +1,5 @@
namespace Nadeko.Econ;
public abstract class NewCard<TSuit, TValue>
public abstract record class NewCard<TSuit, TValue>(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;
}
}
where TValue : struct, Enum;

View File

@@ -5,26 +5,18 @@ public abstract class NewDeck<TCard, TSuit, TValue>
where TSuit : struct, Enum
where TValue : struct, Enum
{
protected static readonly TSuit[] _suits = Enum.GetValues<TSuit>();
protected static readonly TValue[] _values = Enum.GetValues<TValue>();
public virtual int CurrentCount
=> _cards.Count;
public virtual int TotalCount { get; }
private readonly LinkedList<TCard> _cards = new();
protected readonly LinkedList<TCard> _cards = new();
public NewDeck()
{
var suits = Enum.GetValues<TSuit>();
var values = Enum.GetValues<TValue>();
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()

View File

@@ -0,0 +1,28 @@
namespace Nadeko.Econ;
public class MultipleRegularDeck : NewDeck<RegularCard, RegularSuit, RegularValue>
{
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)!);
}
}
}
}
}

View File

@@ -1,20 +1,4 @@
namespace Nadeko.Econ;
public sealed class RegularCard : NewCard<RegularSuit, RegularValue>
{
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()}";
}
public sealed record class RegularCard(RegularSuit Suit, RegularValue Value)
: NewCard<RegularSuit, RegularValue>(Suit, Value);

View File

@@ -2,4 +2,14 @@
public sealed class RegularDeck : NewDeck<RegularCard, RegularSuit, RegularValue>
{
public RegularDeck()
{
foreach (var suit in _suits)
{
foreach (var val in _values)
{
_cards.AddLast((RegularCard)Activator.CreateInstance(typeof(RegularCard), suit, val)!);
}
}
}
}

View File

@@ -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);
}
}