69 lines
No EOL
1.5 KiB
TypeScript
69 lines
No EOL
1.5 KiB
TypeScript
export class Deck<T> {
|
|
private _discard: T[];
|
|
private _unknown: T[];
|
|
private _deck: T[];
|
|
|
|
|
|
constructor(cards: T[]) {
|
|
this._deck = cards;
|
|
this._discard = [];
|
|
this._unknown = [];
|
|
};
|
|
|
|
|
|
get size(): number { return this._deck.length; }
|
|
|
|
|
|
/**
|
|
* Draws X cards from the deck
|
|
*
|
|
* @param quantity The number of cards to draw
|
|
* @throws Error If quantity is <= 0
|
|
* @throws Error If quantity > size
|
|
*/
|
|
public draw(quantity: number): T[] {
|
|
if (quantity <= 0) {
|
|
throw new Error(`Cannot get ${quantity} cards.`);
|
|
} else if (quantity > this.size) {
|
|
throw new Error(`Cannot draw more cards than there are in the deck.`);
|
|
};
|
|
|
|
let cards: T[] = [];
|
|
|
|
// Draw the cards for the player and move them into the unknown group
|
|
for (var i = 0; i < quantity; i++) {
|
|
|
|
// Determine the card for the player(s)
|
|
let index = Math.floor(Math.random() * this.size);
|
|
let card = this._deck[index];
|
|
|
|
// Move it from the arrays
|
|
cards.push(card);
|
|
this._deck.splice(index, 1);
|
|
this._unknown.push(card);
|
|
};
|
|
|
|
return cards;
|
|
};
|
|
|
|
|
|
/**
|
|
* Adds the specific card to the discard pile
|
|
*
|
|
* @param card The card to add to the discard pile
|
|
*/
|
|
public discard(card: T) {
|
|
this._unknown = this._unknown.filter(x => x != card);
|
|
this._discard.push(card);
|
|
};
|
|
|
|
|
|
/**
|
|
* Resets all of the cards in the deck and puts them back in the draw pile
|
|
*/
|
|
public reset() {
|
|
this._deck.push(...this._discard, ...this._unknown);
|
|
this._discard = [];
|
|
this._unknown = [];
|
|
};
|
|
}; |