Skip to content

Commit 00e6895

Browse files
committed
Implementing ability to continue playing after a player wins.
1 parent 6215e4a commit 00e6895

File tree

6 files changed

+103
-21
lines changed

6 files changed

+103
-21
lines changed

CardDeck/Deck/Card/GameCard.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,16 @@ public GameCard(CardDescription _description, CardData _data)
2727
public readonly CardData Data { get; }
2828
public bool InUse { get; private set; }
2929

30+
/// <summary>
31+
/// Set card to be in use
32+
/// </summary>
3033
public void PickUp()
3134
{
3235
InUse = true;
3336
}
37+
/// <summary>
38+
/// Set card to be no longer in use
39+
/// </summary>
3440
public void PutDown()
3541
{
3642
InUse = false;

CardDeck/Deck/CardDeck.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,35 @@ public CardDeck(ReadOnlySpan<GameCard> _cards, IRandomizer _randomizer, int _max
3434

3535
private int position;
3636
private int nextFreePosition;
37-
private readonly GameCard[] cards;
3837
private readonly IRandomizer randomizer;
3938

39+
internal readonly GameCard[] cards;
40+
41+
public void ShufflePutDown(IRandomizer _randomizer)
42+
{
43+
position = cards.Length - 1;
44+
nextFreePosition = position;
45+
_randomizer.Randomize(cards);
46+
for (int i = 0; i < cards.Length; i++)
47+
{
48+
cards[i].PutDown();
49+
}
50+
}
51+
public void ShufflePutDown()
52+
{
53+
ShufflePutDown(randomizer);
54+
}
4055
public void Shuffle(IRandomizer _randomizer)
4156
{
4257
position = cards.Length - 1;
4358
_randomizer.Randomize(cards);
4459
}
4560
public void Shuffle()
4661
{
47-
position = cards.Length - 1;
48-
randomizer.Randomize(cards);
62+
Shuffle(randomizer);
4963
}
5064

51-
public void SetCurrent(GameCard _card)
65+
public void SetCurrentCard(GameCard _card)
5266
{
5367
cards[position] = _card;
5468
}
@@ -106,10 +120,9 @@ public bool Add(GameCard _card)
106120

107121
_card.PutDown();
108122

123+
position = nextFreePosition;
109124
cards[nextFreePosition--] = _card;
110125

111-
position = nextFreePosition + 1;
112-
113126
return true;
114127
}
115128
/// <returns>
@@ -130,6 +143,9 @@ public bool TryNextFree(out GameCard _card)
130143
position--;
131144
return position > 0;
132145
}
146+
/// <summary>
147+
/// Destructive operation, will clear internal <see cref="cards"/> array.
148+
/// </summary>
133149
public void Clear()
134150
{
135151
position = cards.Length - 1;

GameOne/Game/GameManager.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,20 @@ public GameManager()
3434
}
3535

3636
renderer = new(players, manager.NonAI);
37+
38+
gameThread = new(Game);
39+
gameThread.Start();
3740
}
3841

3942
private bool playing;
4043
private readonly Player[] players;
44+
private readonly Thread gameThread;
4145
private readonly RoundManager manager;
4246
private readonly GameRenderer renderer;
4347

4448
public void Run()
4549
{
46-
var _winner = manager.AllPlayers().FirstOrDefault(x => x.Score > 500);
50+
var _winner = players.FirstOrDefault(x => x.Score > 500);
4751
if(_winner != null)
4852
{
4953
Console.WriteLine($"{manager.CurrentPlayer} has won the game");
@@ -56,9 +60,6 @@ public void Run()
5660
}
5761
playing = true;
5862

59-
var _gameThread = new Thread(Game);
60-
_gameThread.Start();
61-
6263
while(!manager.GameOver)
6364
{
6465
threadEvent.Set();
@@ -71,6 +72,9 @@ public void Run()
7172
Console.WriteLine(_winningPlayer.Name + $" Won\nPoints: {_winningPlayer.Score}");
7273

7374
playing = false;
75+
76+
77+
7478
Run();
7579
}
7680
public void Render(Player _player)
@@ -83,6 +87,8 @@ public void Render(Player _player)
8387

8488
private void Game()
8589
{
90+
threadEvent.WaitOne();
91+
8692
var _nonAI = manager.NonAI;
8793
lock(lockObject)
8894
{

GameOne/Game/RoundManager.cs

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,41 @@ public RoundManager(CardDeck _deck, int _playerCount, int _startingCards)
5555
private int skipPlayerCount;
5656
private bool reverseOrder;
5757

58+
public void NewGame(int _startingCards)
59+
{
60+
playerIndex = 0;
61+
62+
for(int i = PickupDeck.Cards.Length; i > 0; i++)
63+
{
64+
PickupDeck.TryNextFree(out var _pickupCard);
65+
if(_pickupCard.Data.SubType == Globals.)
66+
}
67+
68+
PickupDeck.ShufflePutDown();
69+
DiscardPile.Clear();
70+
for(int i = 0; i < players.Length; i++)
71+
{
72+
players[i].Clear();
73+
74+
75+
}
76+
77+
PickupDeck.TryNextFree(out var _card);
78+
79+
DiscardPile.Add(_card);
80+
81+
// Make sure first playing card is NUMERICTYPE
82+
while(_card.Description.Type == Globals.SpecialType)
83+
{
84+
if(!PickupDeck.TryNextFree(out _card))
85+
{
86+
throw new Exception("Failed to init, try adding more cards");
87+
}
88+
89+
DiscardPile.Add(_card);
90+
}
91+
}
92+
5893
public void EvaluatePostPlay()
5994
{
6095
OnWin(CurrentPlayer);
@@ -96,14 +131,20 @@ public GameCard GetTopCard()
96131
}
97132
public void SetWildColour(RGBColour _colour)
98133
{
134+
if(_colour == RGBColour.None)
135+
{
136+
_colour = RGBColour.GetClassicColour((CardColour)Random.Shared.Next(4));
137+
Console.WriteLine($"Invalid Colour, Got: {RGBColour.None.Name}, Now: {_colour.Name}");
138+
}
139+
99140
var _card = DiscardPile.Peek();
100141
if(_card.Data.SubType != Globals.WildSubType && _card.Data.SubType != Globals.WildPlusFourSubType)
101142
{
102143
return;
103144
}
104145

105146
_card.Description = _card.Description with { Colour = _colour };
106-
DiscardPile.SetCurrent(_card);
147+
DiscardPile.SetCurrentCard(_card);
107148
}
108149
[MethodImpl(MethodImplOptions.AggressiveInlining)]
109150
public GameCard PeekDiscardPileTopCard() =>
@@ -225,10 +266,7 @@ public bool ExecuteCardBehaviour(GameCard _card)
225266
}
226267
public IEnumerable<Player> AllPlayers()
227268
{
228-
for(int i = 0; i < playersLength; i++)
229-
{
230-
yield return PeekPlayer(i);
231-
}
269+
return players;
232270
}
233271
private void IncrementSkipCount()
234272
{
@@ -276,7 +314,7 @@ private Player[] CreateAndGivePlayersCards(int _playerCount, int _cardsPerPlayer
276314
_players[i] = i switch
277315
{
278316
0 => new GamePlayer("Player", _cards, this),
279-
> 0 => new GameAI("AI " + i, _cards, this),
317+
> 0 => new GameAI($"AI {i}", _cards, this),
280318
_ => throw new IndexOutOfRangeException(nameof(i))
281319
};
282320
}

GameOne/_Player/GameAI.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,12 @@ protected override void PlayImpl(Action<Player> _render)
5353
if(!playerCardMap.TryGetValue(_nextPlayer, out var _cardHistory))
5454
{
5555
defaultCardAction(x => x.CanPlay(_discardCard, false), out bool _colourChange);
56-
if(_colourChange)
56+
if(!_colourChange)
5757
{
58-
manager.SetWildColour(_selfOrdered.First().Key);
58+
return;
5959
}
60+
var _first = _selfOrdered.FirstOrDefault().Key;
61+
manager.SetWildColour(_first);
6062
return;
6163
}
6264

GameOne/_Player/Player.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,21 @@ public Player(IEnumerable<GameCard> _startingCards, RoundManager _manager)
2323

2424
protected int currentCardHandle
2525
{
26-
get => currentCardHandleVal %= cards.Count;
26+
get
27+
{
28+
if(cards.Count == 0)
29+
{
30+
return 0;
31+
}
32+
return currentCardHandleVal %= cards.Count;
33+
}
2734
set
2835
{
36+
if(cards.Count == 0)
37+
{
38+
currentCardHandleVal = 0;
39+
return;
40+
}
2941
currentCardHandleVal = value;
3042
if(currentCardHandle < 0)
3143
{
@@ -38,7 +50,6 @@ protected int currentCardHandle
3850
protected readonly List<GameCard> cards;
3951
protected readonly RoundManager manager;
4052

41-
4253
public GameCard CurrentCard => cards[currentCardHandle];
4354
public bool IsTurn => manager.CurrentPlayer == this;
4455
public List<GameCard> Cards => cards;
@@ -62,6 +73,10 @@ public int SumOfCardsScores
6273
}
6374
}
6475

76+
public void Clear()
77+
{
78+
cards.Clear();
79+
}
6580
public void Play(Action<Player> _render)
6681
{
6782
if(!IsTurn)
@@ -83,7 +98,6 @@ public void Play(Action<Player> _render)
8398

8499
PlayImpl(_render);
85100
}
86-
87101
public void GiveCards(ReadOnlySpan<GameCard> _cards) => cards.AddRange(_cards);
88102
public void GiveCard(GameCard _card) => cards.Add(_card);
89103
public bool PlayCards(ReadOnlySpan<GameCard> _desiredCards)

0 commit comments

Comments
 (0)