59 lines
1.1 KiB
TypeScript
59 lines
1.1 KiB
TypeScript
const suits = ["heart", "diamond", "spade", "club"] as const;
|
|
export type Suit = (typeof suits)[number];
|
|
|
|
const ranks = [
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
"jack",
|
|
"queen",
|
|
"king",
|
|
"ace",
|
|
] as const;
|
|
export type Rank = (typeof ranks)[number];
|
|
|
|
export type Card =
|
|
| {
|
|
kind: "normal";
|
|
suit: Suit;
|
|
rank: Rank;
|
|
}
|
|
| { kind: "joker"; color: "red" | "black" };
|
|
|
|
export type vCard = Card | null | number;
|
|
export type Pile<C extends vCard = Card> = C[];
|
|
export type Stack<C extends vCard = Card> = C[];
|
|
export type Hand<C extends vCard = Card> = C[];
|
|
export type Board<C extends vCard = Card> = C[];
|
|
|
|
export const newDeck = (withJokers = false): Pile =>
|
|
suits
|
|
.map((suit) =>
|
|
ranks.map((rank) => ({ kind: "normal", suit, rank } as Card))
|
|
)
|
|
.flat()
|
|
.concat(
|
|
withJokers
|
|
? [
|
|
{ kind: "joker", color: "red" },
|
|
{ kind: "joker", color: "black" },
|
|
]
|
|
: []
|
|
);
|
|
|
|
export const shuffle = (cards: Card[]) => {
|
|
let i = cards.length;
|
|
while (i > 0) {
|
|
const j = Math.floor(Math.random() * i);
|
|
i--;
|
|
[cards[i], cards[j]] = [cards[j], cards[i]];
|
|
}
|
|
return cards;
|
|
};
|