diff --git a/backend/uno-game-engine/engine.ts b/backend/uno-game-engine/engine.ts index 17bf2fe..ad9110c 100644 --- a/backend/uno-game-engine/engine.ts +++ b/backend/uno-game-engine/engine.ts @@ -21,7 +21,6 @@ export class GameEngine { this.lastThrownCard = null; this.currentColor = 0; this.direction = 1; - this.status = 'READY'; } allotCards() { @@ -48,10 +47,32 @@ export class GameEngine { (this.currentPlayerIndex + this.direction) % this.players.length; } drawCardFromDeck(player: Player) { - //todo: Handle the case when the deck is empty and we have to move the thrown cards back to the deck - this.players - .find((p: Player) => p.id === player.id) - .cards.push(this.cardDeck.pop()); + if (this.cardDeck.length === 0) { + if (this.thrownCards.length === 0) { + throw new Error('No cards left to draw'); + } + // Move thrown cards back to the deck + this.cardDeck = this.thrownCards; + this.thrownCards = []; + // Shuffle the deck + this.shuffleDeck(this.cardDeck); + } + + // Draw a card for the player + const drawnCard = this.cardDeck.pop(); + if (drawnCard) { + this.players.find((p) => p.id === player.id)?.cards.push(drawnCard); + } else { + throw new Error('Failed to draw a card'); + } + } + + shuffleDeck(deck) { + // Fisher-Yates shuffle + for (let i = deck.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [deck[i], deck[j]] = [deck[j], deck[i]]; + } } dispatchEvent(event: GameEvent) { // handle different types of events based on event.type