@journey-to-code/games 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/backgammon.d.ts +146 -0
- package/dist/backgammon.js +1221 -0
- package/dist/backgammon.js.map +1 -0
- package/dist/blackjack.d.ts +66 -0
- package/dist/blackjack.js +452 -0
- package/dist/blackjack.js.map +1 -0
- package/dist/bluff.d.ts +60 -0
- package/dist/bluff.js +239 -0
- package/dist/bluff.js.map +1 -0
- package/dist/board.d.ts +387 -0
- package/dist/board.js +105 -0
- package/dist/board.js.map +1 -0
- package/dist/bridge.d.ts +86 -0
- package/dist/bridge.js +494 -0
- package/dist/bridge.js.map +1 -0
- package/dist/canasta.d.ts +88 -0
- package/dist/canasta.js +646 -0
- package/dist/canasta.js.map +1 -0
- package/dist/checkers.d.ts +108 -0
- package/dist/checkers.js +756 -0
- package/dist/checkers.js.map +1 -0
- package/dist/chess.d.ts +162 -0
- package/dist/chess.js +904 -0
- package/dist/chess.js.map +1 -0
- package/dist/chesscore.d.ts +136 -0
- package/dist/chesscore.js +1121 -0
- package/dist/chesscore.js.map +1 -0
- package/dist/combat.d.ts +102 -0
- package/dist/combat.js +772 -0
- package/dist/combat.js.map +1 -0
- package/dist/contractrummy.d.ts +77 -0
- package/dist/contractrummy.js +430 -0
- package/dist/contractrummy.js.map +1 -0
- package/dist/crazy8.d.ts +65 -0
- package/dist/crazy8.js +366 -0
- package/dist/crazy8.js.map +1 -0
- package/dist/cribbage.d.ts +75 -0
- package/dist/cribbage.js +428 -0
- package/dist/cribbage.js.map +1 -0
- package/dist/cuckoo.d.ts +43 -0
- package/dist/cuckoo.js +216 -0
- package/dist/cuckoo.js.map +1 -0
- package/dist/drinkingpyramid.d.ts +54 -0
- package/dist/drinkingpyramid.js +213 -0
- package/dist/drinkingpyramid.js.map +1 -0
- package/dist/drinks.d.ts +25 -0
- package/dist/drinks.js +40 -0
- package/dist/drinks.js.map +1 -0
- package/dist/dropfour.d.ts +103 -0
- package/dist/dropfour.js +577 -0
- package/dist/dropfour.js.map +1 -0
- package/dist/durak.d.ts +58 -0
- package/dist/durak.js +332 -0
- package/dist/durak.js.map +1 -0
- package/dist/euchre.d.ts +80 -0
- package/dist/euchre.js +453 -0
- package/dist/euchre.js.map +1 -0
- package/dist/fivedraw.d.ts +50 -0
- package/dist/fivedraw.js +289 -0
- package/dist/fivedraw.js.map +1 -0
- package/dist/fivehundred.d.ts +90 -0
- package/dist/fivehundred.js +504 -0
- package/dist/fivehundred.js.map +1 -0
- package/dist/freecell.d.ts +50 -0
- package/dist/freecell.js +327 -0
- package/dist/freecell.js.map +1 -0
- package/dist/fruitsalad.d.ts +69 -0
- package/dist/fruitsalad.js +427 -0
- package/dist/fruitsalad.js.map +1 -0
- package/dist/gin.d.ts +72 -0
- package/dist/gin.js +393 -0
- package/dist/gin.js.map +1 -0
- package/dist/go.d.ts +132 -0
- package/dist/go.js +659 -0
- package/dist/go.js.map +1 -0
- package/dist/goboard.d.ts +218 -0
- package/dist/goboard.js +880 -0
- package/dist/goboard.js.map +1 -0
- package/dist/gofish.d.ts +37 -0
- package/dist/gofish.js +235 -0
- package/dist/gofish.js.map +1 -0
- package/dist/golf.d.ts +64 -0
- package/dist/golf.js +343 -0
- package/dist/golf.js.map +1 -0
- package/dist/handfoot.d.ts +86 -0
- package/dist/handfoot.js +515 -0
- package/dist/handfoot.js.map +1 -0
- package/dist/hearts.d.ts +65 -0
- package/dist/hearts.js +390 -0
- package/dist/hearts.js.map +1 -0
- package/dist/holdem.d.ts +45 -0
- package/dist/holdem.js +286 -0
- package/dist/holdem.js.map +1 -0
- package/dist/horserace.d.ts +49 -0
- package/dist/horserace.js +207 -0
- package/dist/horserace.js.map +1 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/kingscorner.d.ts +59 -0
- package/dist/kingscorner.js +374 -0
- package/dist/kingscorner.js.map +1 -0
- package/dist/kingscup.d.ts +44 -0
- package/dist/kingscup.js +185 -0
- package/dist/kingscup.js.map +1 -0
- package/dist/kit.d.ts +283 -0
- package/dist/kit.js +73 -0
- package/dist/kit.js.map +1 -0
- package/dist/klondike.d.ts +57 -0
- package/dist/klondike.js +314 -0
- package/dist/klondike.js.map +1 -0
- package/dist/liarspoker.d.ts +61 -0
- package/dist/liarspoker.js +298 -0
- package/dist/liarspoker.js.map +1 -0
- package/dist/memory.d.ts +36 -0
- package/dist/memory.js +181 -0
- package/dist/memory.js.map +1 -0
- package/dist/minigolf.d.ts +104 -0
- package/dist/minigolf.js +724 -0
- package/dist/minigolf.js.map +1 -0
- package/dist/minigolfcourse.d.ts +127 -0
- package/dist/minigolfcourse.js +470 -0
- package/dist/minigolfcourse.js.map +1 -0
- package/dist/offers.d.ts +136 -0
- package/dist/offers.js +279 -0
- package/dist/offers.js.map +1 -0
- package/dist/ohhell.d.ts +66 -0
- package/dist/ohhell.js +331 -0
- package/dist/ohhell.js.map +1 -0
- package/dist/oldmaid.d.ts +40 -0
- package/dist/oldmaid.js +186 -0
- package/dist/oldmaid.js.map +1 -0
- package/dist/pinochle.d.ts +94 -0
- package/dist/pinochle.js +466 -0
- package/dist/pinochle.js.map +1 -0
- package/dist/pitch.d.ts +77 -0
- package/dist/pitch.js +362 -0
- package/dist/pitch.js.map +1 -0
- package/dist/poker.d.ts +79 -0
- package/dist/poker.js +268 -0
- package/dist/poker.js.map +1 -0
- package/dist/president.d.ts +56 -0
- package/dist/president.js +339 -0
- package/dist/president.js.map +1 -0
- package/dist/pyramid.d.ts +39 -0
- package/dist/pyramid.js +200 -0
- package/dist/pyramid.js.map +1 -0
- package/dist/registry.d.ts +17 -0
- package/dist/registry.js +70 -0
- package/dist/registry.js.map +1 -0
- package/dist/reversi.d.ts +69 -0
- package/dist/reversi.js +584 -0
- package/dist/reversi.js.map +1 -0
- package/dist/ridethebus.d.ts +48 -0
- package/dist/ridethebus.js +257 -0
- package/dist/ridethebus.js.map +1 -0
- package/dist/rummy500.d.ts +89 -0
- package/dist/rummy500.js +474 -0
- package/dist/rummy500.js.map +1 -0
- package/dist/sevens.d.ts +48 -0
- package/dist/sevens.js +221 -0
- package/dist/sevens.js.map +1 -0
- package/dist/slapjack.d.ts +42 -0
- package/dist/slapjack.js +224 -0
- package/dist/slapjack.js.map +1 -0
- package/dist/speed.d.ts +44 -0
- package/dist/speed.js +201 -0
- package/dist/speed.js.map +1 -0
- package/dist/spider.d.ts +51 -0
- package/dist/spider.js +320 -0
- package/dist/spider.js.map +1 -0
- package/dist/spite.d.ts +75 -0
- package/dist/spite.js +372 -0
- package/dist/spite.js.map +1 -0
- package/dist/sport.d.ts +266 -0
- package/dist/sport.js +48 -0
- package/dist/sport.js.map +1 -0
- package/dist/switch.d.ts +69 -0
- package/dist/switch.js +393 -0
- package/dist/switch.js.map +1 -0
- package/dist/table.d.ts +284 -0
- package/dist/table.js +67 -0
- package/dist/table.js.map +1 -0
- package/dist/talk.d.ts +17 -0
- package/dist/talk.js +44 -0
- package/dist/talk.js.map +1 -0
- package/dist/thirtyone.d.ts +66 -0
- package/dist/thirtyone.js +372 -0
- package/dist/thirtyone.js.map +1 -0
- package/dist/tictactoe.d.ts +68 -0
- package/dist/tictactoe.js +541 -0
- package/dist/tictactoe.js.map +1 -0
- package/dist/tricks.d.ts +21 -0
- package/dist/tricks.js +48 -0
- package/dist/tricks.js.map +1 -0
- package/dist/war.d.ts +44 -0
- package/dist/war.js +185 -0
- package/dist/war.js.map +1 -0
- package/dist/whist.d.ts +52 -0
- package/dist/whist.js +218 -0
- package/dist/whist.js.map +1 -0
- package/dist/yacht.d.ts +96 -0
- package/dist/yacht.js +653 -0
- package/dist/yacht.js.map +1 -0
- package/package.json +41 -4
- package/README.md +0 -3
package/dist/pitch.d.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Suit } from "@journey-to-code/rules";
|
|
2
|
+
import { type BaseRules, type CardGame, type KCard } from "./kit.js";
|
|
3
|
+
import { type Play } from "./tricks.js";
|
|
4
|
+
export interface PitchRules extends BaseRules {
|
|
5
|
+
playTo: number;
|
|
6
|
+
/** Low goes to whoever takes it in a trick, instead of whoever played it. */
|
|
7
|
+
lowToTaker: boolean;
|
|
8
|
+
/** Everyone passes: the dealer must bid 2 (else the hand is thrown in and redealt). */
|
|
9
|
+
stickDealer: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare const classicPitch: PitchRules;
|
|
12
|
+
export declare const longPitch: PitchRules;
|
|
13
|
+
export declare const setbackPitch: PitchRules;
|
|
14
|
+
type Point = "high" | "low" | "jack" | "game";
|
|
15
|
+
export interface PitchState {
|
|
16
|
+
game: "pitch";
|
|
17
|
+
rules: PitchRules;
|
|
18
|
+
seats: number;
|
|
19
|
+
rng: number;
|
|
20
|
+
hand: number;
|
|
21
|
+
dealer: number;
|
|
22
|
+
phase: "bidding" | "playing" | "scored" | "finished";
|
|
23
|
+
hands: KCard[][];
|
|
24
|
+
/** Each seat's bid this hand: null not yet, 0 passed. */
|
|
25
|
+
bids: (number | null)[];
|
|
26
|
+
bidder: number | null;
|
|
27
|
+
trump: Suit | null;
|
|
28
|
+
trick: Play[];
|
|
29
|
+
lastTrick: {
|
|
30
|
+
plays: Play[];
|
|
31
|
+
winner: number;
|
|
32
|
+
} | null;
|
|
33
|
+
/** Cards each seat has taken in tricks. */
|
|
34
|
+
taken: KCard[][];
|
|
35
|
+
/** Every card played, and by whom (for High and Low). */
|
|
36
|
+
played: Play[];
|
|
37
|
+
turn: number;
|
|
38
|
+
scores: number[];
|
|
39
|
+
lastHand: {
|
|
40
|
+
bidder: number;
|
|
41
|
+
bid: number;
|
|
42
|
+
won: Record<Point, number | null>;
|
|
43
|
+
points: number[];
|
|
44
|
+
made: boolean;
|
|
45
|
+
gamePoints: number[];
|
|
46
|
+
} | null;
|
|
47
|
+
ready: boolean[];
|
|
48
|
+
narration: string | null;
|
|
49
|
+
}
|
|
50
|
+
/** Points toward Game. */
|
|
51
|
+
export declare const gameValue: (c: KCard) => number;
|
|
52
|
+
export declare function newPitch(rules: PitchRules, seats: number, seed: number): PitchState;
|
|
53
|
+
/** The bids this seat may make: pass, or more than the high bid, up to 4. */
|
|
54
|
+
export declare function pitchBids(s: PitchState, seat: number): number[];
|
|
55
|
+
/** What may be played: anything to lead; after that the suit led or a trump; trumps led must be followed. */
|
|
56
|
+
export declare function pitchLegal(s: PitchState, seat: number): KCard[];
|
|
57
|
+
type Move = {
|
|
58
|
+
type: "bid";
|
|
59
|
+
bid: number;
|
|
60
|
+
} | {
|
|
61
|
+
type: "play";
|
|
62
|
+
card: string;
|
|
63
|
+
} | {
|
|
64
|
+
type: "next";
|
|
65
|
+
};
|
|
66
|
+
/** Who wins each point: High, Low, Jack and Game (null when nobody does). */
|
|
67
|
+
export declare function pitchPoints(s: PitchState): {
|
|
68
|
+
won: Record<Point, number | null>;
|
|
69
|
+
gamePoints: number[];
|
|
70
|
+
};
|
|
71
|
+
/** The best suit to pitch and how many points it should bring. */
|
|
72
|
+
export declare function pitchEstimate(hand: KCard[], seats: number): {
|
|
73
|
+
suit: Suit;
|
|
74
|
+
points: number;
|
|
75
|
+
};
|
|
76
|
+
export declare const pitch: CardGame<PitchRules, PitchState, Move>;
|
|
77
|
+
export {};
|
package/dist/pitch.js
ADDED
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { clone, FULL, GameError, makeDeck, markReady, nextRandom, rankLabel, rankSeats, shuffled, sortCards, SUITS, SYMBOL, thinkFor, who, } from "./kit.js";
|
|
2
|
+
import { bestLoser, cheapestWinner, trickWinner } from "./tricks.js";
|
|
3
|
+
export const classicPitch = { id: "pitch-classic", name: "Pitch (to 11)", playTo: 11, lowToTaker: false, stickDealer: true };
|
|
4
|
+
export const longPitch = { ...classicPitch, id: "pitch-long", name: "Long game (to 21)", playTo: 21 };
|
|
5
|
+
export const setbackPitch = { ...classicPitch, id: "pitch-setback", name: "Setback (low to the taker)", lowToTaker: true };
|
|
6
|
+
const suitOf = (c) => c.suit;
|
|
7
|
+
const power = (c) => c.rank;
|
|
8
|
+
const label = (c) => `${rankLabel(power(c))}${SYMBOL[suitOf(c)]}`;
|
|
9
|
+
/** Points toward Game. */
|
|
10
|
+
export const gameValue = (c) => ({ 10: 10, 14: 4, 13: 3, 12: 2, 11: 1 }[power(c)] ?? 0);
|
|
11
|
+
const POINT_NAMES = { high: "High", low: "Low", jack: "Jack", game: "Game" };
|
|
12
|
+
function deal(s) {
|
|
13
|
+
const deck = shuffled(makeDeck({ ranks: FULL }), nextRandom(s));
|
|
14
|
+
s.hands = Array.from({ length: s.seats }, (_, i) => sortCards(deck.slice(i * 6, i * 6 + 6)));
|
|
15
|
+
s.bids = Array(s.seats).fill(null);
|
|
16
|
+
s.bidder = null;
|
|
17
|
+
s.trump = null;
|
|
18
|
+
s.trick = [];
|
|
19
|
+
s.lastTrick = null;
|
|
20
|
+
s.taken = Array.from({ length: s.seats }, () => []);
|
|
21
|
+
s.played = [];
|
|
22
|
+
s.turn = (s.dealer + 1) % s.seats;
|
|
23
|
+
s.ready = Array(s.seats).fill(false);
|
|
24
|
+
s.phase = "bidding";
|
|
25
|
+
}
|
|
26
|
+
export function newPitch(rules, seats, seed) {
|
|
27
|
+
const s = { game: "pitch", rules, seats, rng: seed >>> 0, hand: 0, dealer: seed % seats, scores: Array(seats).fill(0), lastHand: null, narration: null };
|
|
28
|
+
deal(s);
|
|
29
|
+
return s;
|
|
30
|
+
}
|
|
31
|
+
const highBid = (s) => Math.max(0, ...s.bids.map((b) => b ?? 0));
|
|
32
|
+
/** The bids this seat may make: pass, or more than the high bid, up to 4. */
|
|
33
|
+
export function pitchBids(s, seat) {
|
|
34
|
+
if (s.phase !== "bidding" || s.turn !== seat)
|
|
35
|
+
return [];
|
|
36
|
+
const out = [];
|
|
37
|
+
for (let b = Math.max(2, highBid(s) + 1); b <= 4; b++)
|
|
38
|
+
out.push(b);
|
|
39
|
+
const everyonePassed = s.bids.every((b, i) => i === seat || b === 0);
|
|
40
|
+
if (!(seat === s.dealer && everyonePassed && s.rules.stickDealer))
|
|
41
|
+
out.unshift(0);
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
/** What may be played: anything to lead; after that the suit led or a trump; trumps led must be followed. */
|
|
45
|
+
export function pitchLegal(s, seat) {
|
|
46
|
+
if (s.phase !== "playing" || s.turn !== seat)
|
|
47
|
+
return [];
|
|
48
|
+
const hand = s.hands[seat];
|
|
49
|
+
if (!s.trick.length)
|
|
50
|
+
return hand;
|
|
51
|
+
const led = suitOf(s.trick[0].card);
|
|
52
|
+
const same = hand.filter((c) => suitOf(c) === led);
|
|
53
|
+
if (!same.length)
|
|
54
|
+
return hand;
|
|
55
|
+
if (led === s.trump)
|
|
56
|
+
return same;
|
|
57
|
+
return hand.filter((c) => suitOf(c) === led || suitOf(c) === s.trump);
|
|
58
|
+
}
|
|
59
|
+
function apply(state, seat, move) {
|
|
60
|
+
const s = clone(state);
|
|
61
|
+
if (move.type === "next") {
|
|
62
|
+
if (s.phase !== "scored")
|
|
63
|
+
throw new GameError("The hand isn't over.");
|
|
64
|
+
if (markReady(s.ready, seat)) {
|
|
65
|
+
s.hand += 1;
|
|
66
|
+
s.dealer = (s.dealer + 1) % s.seats;
|
|
67
|
+
s.narration = null;
|
|
68
|
+
deal(s);
|
|
69
|
+
}
|
|
70
|
+
return s;
|
|
71
|
+
}
|
|
72
|
+
if (move.type === "bid") {
|
|
73
|
+
if (s.phase !== "bidding" || s.turn !== seat)
|
|
74
|
+
throw new GameError("It's not your turn to bid.");
|
|
75
|
+
const bid = Number(move.bid);
|
|
76
|
+
if (!pitchBids(s, seat).includes(bid))
|
|
77
|
+
throw new GameError(bid === 0 ? "Everyone passed: the dealer has to bid." : `Bid more than ${highBid(s)}, up to 4, or pass.`);
|
|
78
|
+
s.bids[seat] = bid;
|
|
79
|
+
s.narration = bid ? `${who(seat)} bid ${bid}` : `${who(seat)} passed`;
|
|
80
|
+
if (seat === s.dealer) {
|
|
81
|
+
const top = highBid(s);
|
|
82
|
+
if (!top) {
|
|
83
|
+
// Everyone passed and the dealer isn't stuck: throw the hand in.
|
|
84
|
+
s.narration = "Everyone passed: new deal";
|
|
85
|
+
s.dealer = (s.dealer + 1) % s.seats;
|
|
86
|
+
deal(s);
|
|
87
|
+
return s;
|
|
88
|
+
}
|
|
89
|
+
s.bidder = s.bids.findIndex((b) => b === top);
|
|
90
|
+
s.phase = "playing";
|
|
91
|
+
s.turn = s.bidder;
|
|
92
|
+
s.narration = `${who(s.bidder)} won the bid at ${top} and pitches`;
|
|
93
|
+
}
|
|
94
|
+
else
|
|
95
|
+
s.turn = (seat + 1) % s.seats;
|
|
96
|
+
return s;
|
|
97
|
+
}
|
|
98
|
+
if (move.type !== "play")
|
|
99
|
+
throw new GameError("That's not a move in Pitch.");
|
|
100
|
+
if (s.phase !== "playing" || s.turn !== seat)
|
|
101
|
+
throw new GameError("It's not your turn.");
|
|
102
|
+
const card = s.hands[seat].find((c) => c.id === move.card);
|
|
103
|
+
if (!card)
|
|
104
|
+
throw new GameError("You don't have that card.");
|
|
105
|
+
if (!pitchLegal(s, seat).some((c) => c.id === card.id)) {
|
|
106
|
+
const led = suitOf(s.trick[0].card);
|
|
107
|
+
throw new GameError(led === s.trump ? `Trump was led: play a ${SYMBOL[led]}.` : `Follow suit (${SYMBOL[led]}) or play a trump.`);
|
|
108
|
+
}
|
|
109
|
+
if (!s.trump) {
|
|
110
|
+
s.trump = suitOf(card);
|
|
111
|
+
s.narration = `${who(seat)} pitched the ${label(card)}: ${SYMBOL[s.trump]} are trump`;
|
|
112
|
+
}
|
|
113
|
+
else
|
|
114
|
+
s.narration = null;
|
|
115
|
+
if (!s.trick.length)
|
|
116
|
+
s.lastTrick = null;
|
|
117
|
+
s.hands[seat] = s.hands[seat].filter((c) => c.id !== card.id);
|
|
118
|
+
s.trick.push({ seat, card });
|
|
119
|
+
s.played.push({ seat, card });
|
|
120
|
+
if (s.trick.length < s.seats) {
|
|
121
|
+
s.turn = (seat + 1) % s.seats;
|
|
122
|
+
return s;
|
|
123
|
+
}
|
|
124
|
+
const win = trickWinner(s.trick, s.trump, suitOf, power);
|
|
125
|
+
s.taken[win.seat].push(...s.trick.map((p) => p.card));
|
|
126
|
+
s.lastTrick = { plays: s.trick, winner: win.seat };
|
|
127
|
+
s.trick = [];
|
|
128
|
+
s.turn = win.seat;
|
|
129
|
+
if (s.hands.every((h) => !h.length))
|
|
130
|
+
scoreHand(s);
|
|
131
|
+
return s;
|
|
132
|
+
}
|
|
133
|
+
/** Who wins each point: High, Low, Jack and Game (null when nobody does). */
|
|
134
|
+
export function pitchPoints(s) {
|
|
135
|
+
const trumps = s.played.filter((p) => suitOf(p.card) === s.trump);
|
|
136
|
+
const takerOf = (id) => s.taken.findIndex((t) => t.some((c) => c.id === id));
|
|
137
|
+
const high = trumps.reduce((b, p) => (!b || power(p.card) > power(b.card) ? p : b), null);
|
|
138
|
+
const low = trumps.reduce((b, p) => (!b || power(p.card) < power(b.card) ? p : b), null);
|
|
139
|
+
const jack = trumps.find((p) => power(p.card) === 11);
|
|
140
|
+
const gamePoints = s.taken.map((t) => t.reduce((n, c) => n + gameValue(c), 0));
|
|
141
|
+
const best = Math.max(...gamePoints);
|
|
142
|
+
const leaders = gamePoints.flatMap((n, i) => (n === best ? [i] : []));
|
|
143
|
+
return {
|
|
144
|
+
won: {
|
|
145
|
+
high: high ? high.seat : null,
|
|
146
|
+
low: low ? (s.rules.lowToTaker ? takerOf(low.card.id) : low.seat) : null,
|
|
147
|
+
jack: jack ? takerOf(jack.card.id) : null,
|
|
148
|
+
game: leaders.length === 1 && best > 0 ? leaders[0] : null,
|
|
149
|
+
},
|
|
150
|
+
gamePoints,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function scoreHand(s) {
|
|
154
|
+
const { won, gamePoints } = pitchPoints(s);
|
|
155
|
+
const bidder = s.bidder;
|
|
156
|
+
const bid = s.bids[bidder];
|
|
157
|
+
const got = Array(s.seats).fill(0);
|
|
158
|
+
for (const p of Object.values(won))
|
|
159
|
+
if (p !== null)
|
|
160
|
+
got[p] += 1;
|
|
161
|
+
const made = got[bidder] >= bid;
|
|
162
|
+
const points = got.map((n, i) => (i === bidder && !made ? -bid : n));
|
|
163
|
+
s.scores = s.scores.map((n, i) => n + points[i]);
|
|
164
|
+
s.lastHand = { bidder, bid, won, points, made, gamePoints };
|
|
165
|
+
s.narration = made ? `${who(bidder)} made the bid of ${bid}` : `${who(bidder)} was set back ${bid}`;
|
|
166
|
+
s.ready = Array(s.seats).fill(false);
|
|
167
|
+
// The bidder goes out first; otherwise the highest score over the line.
|
|
168
|
+
const over = s.scores.map((n, i) => (n >= s.rules.playTo ? i : -1)).filter((i) => i >= 0);
|
|
169
|
+
const top = Math.max(...s.scores);
|
|
170
|
+
const done = over.includes(bidder) || (over.length > 0 && s.scores.filter((n) => n === top).length === 1);
|
|
171
|
+
s.phase = done ? "finished" : "scored";
|
|
172
|
+
}
|
|
173
|
+
function winners(s) {
|
|
174
|
+
const bidder = s.lastHand?.bidder;
|
|
175
|
+
if (bidder !== undefined && s.scores[bidder] >= s.rules.playTo)
|
|
176
|
+
return [bidder];
|
|
177
|
+
const top = Math.max(...s.scores);
|
|
178
|
+
return s.scores.flatMap((n, i) => (n === top ? [i] : []));
|
|
179
|
+
}
|
|
180
|
+
function view(s, seat) {
|
|
181
|
+
const over = s.phase === "finished";
|
|
182
|
+
const bids = pitchBids(s, seat);
|
|
183
|
+
let choices = null;
|
|
184
|
+
if (bids.length) {
|
|
185
|
+
const options = bids.map((b) => ({ label: b ? String(b) : "Pass", move: { type: "bid", bid: b } }));
|
|
186
|
+
choices = { prompt: highBid(s) ? `The bid is ${highBid(s)}. Bid higher, or pass.` : bids.includes(0) ? "How many points will you take?" : "Everyone passed: you have to bid.", options, layout: "row" };
|
|
187
|
+
}
|
|
188
|
+
else if (s.phase === "scored" && !s.ready[seat])
|
|
189
|
+
choices = { prompt: "", options: [{ label: "Deal the next hand", move: { type: "next" }, primary: true }] };
|
|
190
|
+
const lh = s.lastHand;
|
|
191
|
+
const pointRow = (p) => ({ label: POINT_NAMES[p], values: s.scores.map((_, i) => (lh?.won[p] === i ? "✓" : "")) });
|
|
192
|
+
return {
|
|
193
|
+
game: "pitch",
|
|
194
|
+
seats: s.seats,
|
|
195
|
+
me: seat,
|
|
196
|
+
teams: false,
|
|
197
|
+
phase: s.phase,
|
|
198
|
+
turn: s.phase === "bidding" || s.phase === "playing" ? s.turn : null,
|
|
199
|
+
dealer: s.dealer,
|
|
200
|
+
hand: s.hands[seat],
|
|
201
|
+
tap: s.phase === "playing" && s.turn === seat ? { type: "play", cards: pitchLegal(s, seat).map((c) => c.id) } : null,
|
|
202
|
+
pick: null,
|
|
203
|
+
choices,
|
|
204
|
+
players: s.hands.map((h, i) => ({
|
|
205
|
+
cards: h.length,
|
|
206
|
+
line: s.phase === "bidding" ? (s.bids[i] === null ? "" : s.bids[i] ? `Bid ${s.bids[i]}` : "Passed") : i === s.bidder ? `Bid ${s.bids[i]}` : "",
|
|
207
|
+
dealer: i === s.dealer,
|
|
208
|
+
badge: i === s.bidder && s.phase === "playing" ? "Pitcher" : undefined,
|
|
209
|
+
})),
|
|
210
|
+
center: { kind: "trick", plays: s.trick.length ? s.trick : (s.lastTrick?.plays ?? []), winner: s.trick.length ? null : (s.lastTrick?.winner ?? null) },
|
|
211
|
+
melds: [],
|
|
212
|
+
info: [
|
|
213
|
+
s.trump ? `Trump ${SYMBOL[s.trump]}` : s.phase === "playing" ? "The first card sets trump" : "High · Low · Jack · Game",
|
|
214
|
+
...(s.bidder !== null && s.phase === "playing" ? [`${who(s.bidder)} bid ${s.bids[s.bidder]}`] : []),
|
|
215
|
+
`To ${s.rules.playTo}`,
|
|
216
|
+
],
|
|
217
|
+
narration: s.narration,
|
|
218
|
+
scores: s.scores.map((value, i) => ({ seats: [i], value })),
|
|
219
|
+
result: lh && (s.phase === "scored" || over)
|
|
220
|
+
? {
|
|
221
|
+
key: `pitch-${s.hand}`,
|
|
222
|
+
title: lh.made ? `${who(lh.bidder)} made ${lh.bid}` : `${who(lh.bidder)} was set back ${lh.bid}`,
|
|
223
|
+
sides: s.scores.map((_, i) => [i]),
|
|
224
|
+
rows: [
|
|
225
|
+
pointRow("high"),
|
|
226
|
+
pointRow("low"),
|
|
227
|
+
pointRow("jack"),
|
|
228
|
+
{ label: "Game", values: lh.gamePoints.map((n, i) => `${n}${lh.won.game === i ? " ✓" : ""}`) },
|
|
229
|
+
{ label: "This hand", values: lh.points.map((p) => (p > 0 ? `+${p}` : String(p))), tone: "score" },
|
|
230
|
+
{ label: "Total", values: s.scores.map(String), tone: "total" },
|
|
231
|
+
],
|
|
232
|
+
}
|
|
233
|
+
: null,
|
|
234
|
+
over: over ? { winners: winners(s), title: winners(s).length > 1 ? "A tie at the top" : `${who(winners(s)[0])} wins with ${s.scores[winners(s)[0]]}` } : null,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// ---- Computer players --------------------------------------------------------------------------
|
|
238
|
+
/** The best suit to pitch and how many points it should bring. */
|
|
239
|
+
export function pitchEstimate(hand, seats) {
|
|
240
|
+
let best = { suit: SUITS[0], points: -1 };
|
|
241
|
+
for (const suit of SUITS) {
|
|
242
|
+
const cards = hand.filter((c) => suitOf(c) === suit);
|
|
243
|
+
if (!cards.length)
|
|
244
|
+
continue;
|
|
245
|
+
const ranks = cards.map(power);
|
|
246
|
+
const top = Math.max(...ranks);
|
|
247
|
+
const bottom = Math.min(...ranks);
|
|
248
|
+
let p = top === 14 ? 1 : top === 13 ? 0.65 : top === 12 ? 0.35 : 0.1;
|
|
249
|
+
p += bottom === 2 ? 0.95 : bottom === 3 ? 0.65 : bottom <= 5 ? 0.35 : 0.1;
|
|
250
|
+
if (ranks.includes(11))
|
|
251
|
+
p += cards.length >= 3 || ranks.includes(14) ? 0.75 : 0.45;
|
|
252
|
+
p += Math.min(0.7, hand.filter((c) => power(c) === 10 || power(c) === 14).length * 0.15 + cards.length * 0.08);
|
|
253
|
+
p *= seats <= 2 ? 1.1 : seats >= 5 ? 0.85 : 1;
|
|
254
|
+
if (p > best.points)
|
|
255
|
+
best = { suit, points: p };
|
|
256
|
+
}
|
|
257
|
+
return best;
|
|
258
|
+
}
|
|
259
|
+
function bot(s, seat, style) {
|
|
260
|
+
if (s.phase === "scored")
|
|
261
|
+
return s.ready[seat] ? null : { type: "next" };
|
|
262
|
+
const sloppy = Math.random() < (style.sloppy ?? 0) + (1 - (style.skill ?? 1)) * 0.25;
|
|
263
|
+
if (s.phase === "bidding") {
|
|
264
|
+
if (s.turn !== seat)
|
|
265
|
+
return null;
|
|
266
|
+
const bids = pitchBids(s, seat);
|
|
267
|
+
const est = Math.floor(pitchEstimate(s.hands[seat], s.seats).points + (style.bold ?? 0.3) * 0.6);
|
|
268
|
+
const pick = bids.filter((b) => b > 0 && b <= est).at(-1) ?? (bids.includes(0) ? 0 : bids[0]);
|
|
269
|
+
return { type: "bid", bid: pick };
|
|
270
|
+
}
|
|
271
|
+
if (s.phase !== "playing" || s.turn !== seat)
|
|
272
|
+
return null;
|
|
273
|
+
const legal = pitchLegal(s, seat);
|
|
274
|
+
if (legal.length === 1 || sloppy)
|
|
275
|
+
return { type: "play", card: legal[Math.floor(Math.random() * legal.length)].id };
|
|
276
|
+
// Pitching: lead the top of the best suit.
|
|
277
|
+
if (!s.trump) {
|
|
278
|
+
const suit = pitchEstimate(s.hands[seat], s.seats).suit;
|
|
279
|
+
return { type: "play", card: [...legal].filter((c) => suitOf(c) === suit).sort((a, b) => power(b) - power(a))[0].id };
|
|
280
|
+
}
|
|
281
|
+
const trump = s.trump;
|
|
282
|
+
if (!s.trick.length) {
|
|
283
|
+
// Lead high trumps while they're boss, otherwise a low card that gives little away.
|
|
284
|
+
const myTrumps = legal.filter((c) => suitOf(c) === trump).sort((a, b) => power(b) - power(a));
|
|
285
|
+
// Trumps above my best that haven't shown up yet (somebody may hold them).
|
|
286
|
+
const seen = new Set([...s.played, ...s.hands[seat].map((card) => ({ card }))].map((p) => p.card.id));
|
|
287
|
+
const higher = makeDeck({ ranks: FULL }).filter((c) => suitOf(c) === trump && power(c) > power(myTrumps[0] ?? c) && !seen.has(c.id));
|
|
288
|
+
if (myTrumps.length && !higher.length && seat === s.bidder)
|
|
289
|
+
return { type: "play", card: myTrumps[0].id };
|
|
290
|
+
const plain = legal.filter((c) => suitOf(c) !== trump).sort((a, b) => gameValue(a) - gameValue(b) || power(a) - power(b));
|
|
291
|
+
return { type: "play", card: (plain[0] ?? legal.sort((a, b) => power(a) - power(b))[0]).id };
|
|
292
|
+
}
|
|
293
|
+
const worth = s.trick.reduce((n, p) => n + gameValue(p.card) + (suitOf(p.card) === trump && power(p.card) === 11 ? 20 : 0), 0);
|
|
294
|
+
const win = cheapestWinner(legal, seat, s.trick, trump, suitOf, power);
|
|
295
|
+
// Take tricks with something in them, or protect a ten or the jack.
|
|
296
|
+
const precious = legal.some((c) => power(c) === 10 || (suitOf(c) === trump && power(c) === 11));
|
|
297
|
+
if (win && (worth >= 3 || precious || s.trick.length === s.seats - 1))
|
|
298
|
+
return { type: "play", card: win.id };
|
|
299
|
+
// Losing anyway: don't throw points away.
|
|
300
|
+
const losers = legal.filter((c) => !win || c.id !== win.id).sort((a, b) => gameValue(a) - gameValue(b) || power(a) - power(b));
|
|
301
|
+
return { type: "play", card: (losers.find((c) => !(suitOf(c) === trump && power(c) === 11)) ?? bestLoser(legal, seat, s.trick, trump, suitOf, power)).id };
|
|
302
|
+
}
|
|
303
|
+
export const pitch = {
|
|
304
|
+
id: "pitch",
|
|
305
|
+
name: "Pitch",
|
|
306
|
+
emoji: "⚾",
|
|
307
|
+
blurb: "Bid for High, Low, Jack and Game",
|
|
308
|
+
tagline: "Win the bid, pitch the first card to set trump, and take High, Low, Jack and Game.",
|
|
309
|
+
seats: { min: 2, max: 6, default: 4 },
|
|
310
|
+
teams: false,
|
|
311
|
+
presets: [classicPitch, longPitch, setbackPitch],
|
|
312
|
+
fields: [
|
|
313
|
+
{ key: "playTo", label: "Play to", kind: "choice", options: [[7, "7"], [11, "11"], [15, "15"], [21, "21"]] },
|
|
314
|
+
{ key: "lowToTaker", label: "Low goes to whoever takes it", hint: "Instead of whoever played it.", kind: "toggle" },
|
|
315
|
+
{ key: "stickDealer", label: "Stick the dealer", hint: "If everyone passes, the dealer has to bid 2.", kind: "toggle" },
|
|
316
|
+
],
|
|
317
|
+
normalize(rules) {
|
|
318
|
+
const given = (rules && typeof rules === "object" ? rules : {});
|
|
319
|
+
const base = [classicPitch, longPitch, setbackPitch].find((p) => p.id === given.id) ?? classicPitch;
|
|
320
|
+
const r = { ...base, ...given };
|
|
321
|
+
return { ...r, playTo: Number(r.playTo) };
|
|
322
|
+
},
|
|
323
|
+
validate(r) {
|
|
324
|
+
return r.playTo >= 5 && r.playTo <= 52 ? [] : ["Play to between 5 and 52."];
|
|
325
|
+
},
|
|
326
|
+
describe(r) {
|
|
327
|
+
return [
|
|
328
|
+
"Six cards each. Bid how many of the four points you'll take (2 to 4), or pass; each bid must be higher.",
|
|
329
|
+
`${r.stickDealer ? "If everyone passes, the dealer has to bid 2." : "If everyone passes, the hand is thrown in."} The high bidder pitches: the first card they lead sets trump.`,
|
|
330
|
+
"Follow the suit led or play a trump; when trump is led, follow trump if you can.",
|
|
331
|
+
`The points: High (the highest trump played), Low (the lowest trump played, to whoever ${r.lowToTaker ? "takes it" : "played it"}), Jack (whoever takes the jack of trump) and Game (the most card points in your tricks: tens 10, aces 4, kings 3, queens 2, jacks 1; a tie scores nobody).`,
|
|
332
|
+
`Make your bid and score what you won; fall short and lose your bid. Everyone else scores what they won. First to ${r.playTo} wins, and the bidder goes out first.`,
|
|
333
|
+
];
|
|
334
|
+
},
|
|
335
|
+
newGame: newPitch,
|
|
336
|
+
apply,
|
|
337
|
+
view,
|
|
338
|
+
bot,
|
|
339
|
+
thinkingTime(s, seat) {
|
|
340
|
+
if (s.phase === "bidding")
|
|
341
|
+
return 1500;
|
|
342
|
+
if (s.phase === "scored")
|
|
343
|
+
return 900;
|
|
344
|
+
return thinkFor(pitchLegal(s, seat).length);
|
|
345
|
+
},
|
|
346
|
+
summary(s) {
|
|
347
|
+
const over = s.phase === "finished";
|
|
348
|
+
return {
|
|
349
|
+
game: "pitch",
|
|
350
|
+
rules: s.rules.name,
|
|
351
|
+
phase: s.phase,
|
|
352
|
+
over,
|
|
353
|
+
hand: s.hand + 1,
|
|
354
|
+
scoreLine: s.scores.join(" · "),
|
|
355
|
+
order: over ? rankSeats(s.scores.map((score, i) => ({ seats: [i], score }))) : null,
|
|
356
|
+
winners: over ? winners(s) : null,
|
|
357
|
+
teams: false,
|
|
358
|
+
seats: s.seats,
|
|
359
|
+
};
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
//# sourceMappingURL=pitch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pitch.js","sourceRoot":"","sources":["../src/pitch.ts"],"names":[],"mappings":"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"}
|
package/dist/poker.d.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { rankLabel, who, type KCard } from "./kit.js";
|
|
2
|
+
export declare const CATEGORY: readonly ["High card", "One pair", "Two pair", "Three of a kind", "Straight", "Flush", "Full house", "Four of a kind", "Straight flush"];
|
|
3
|
+
/** A five-card hand's strength: its category, then the ranks that break ties. Compare with compareScore. */
|
|
4
|
+
export declare function score5(cards: KCard[]): number[];
|
|
5
|
+
export declare function compareScore(a: number[], b: number[]): number;
|
|
6
|
+
/** The best five cards of five to seven, and their score. */
|
|
7
|
+
export declare function bestHand(cards: KCard[]): {
|
|
8
|
+
score: number[];
|
|
9
|
+
cards: KCard[];
|
|
10
|
+
};
|
|
11
|
+
/** A hand's name, as you'd say it at the table: "two pair, kings and sevens". */
|
|
12
|
+
export declare function handName(score: number[]): string;
|
|
13
|
+
/** Roughly how strong a made hand is, 0 to 1, for the computer players. */
|
|
14
|
+
export declare function strengthOf(score: number[]): number;
|
|
15
|
+
export interface Betting {
|
|
16
|
+
/** Chips each player has behind (not yet in the pot). */
|
|
17
|
+
stacks: number[];
|
|
18
|
+
/** Still in this hand (dealt in and not folded). */
|
|
19
|
+
live: boolean[];
|
|
20
|
+
/** Chips each player has put in this hand, and this betting round. */
|
|
21
|
+
committed: number[];
|
|
22
|
+
roundBet: number[];
|
|
23
|
+
/** The bet to match this round, the size of a bet or raise, and how many have been made. */
|
|
24
|
+
toMatch: number;
|
|
25
|
+
size: number;
|
|
26
|
+
raises: number;
|
|
27
|
+
/** Players who have acted since the last bet or raise. */
|
|
28
|
+
acted: boolean[];
|
|
29
|
+
turn: number;
|
|
30
|
+
}
|
|
31
|
+
export declare const MAX_RAISES = 4;
|
|
32
|
+
export declare const allIn: (b: Betting, seat: number) => boolean;
|
|
33
|
+
export declare const pot: (b: Betting) => number;
|
|
34
|
+
/** Put chips in (as many as the player has: short of that is all in). */
|
|
35
|
+
export declare function putIn(b: Betting, seat: number, chips: number): void;
|
|
36
|
+
/** Start a betting round: no bets yet (blinds are put in by the caller), first to act given. */
|
|
37
|
+
export declare function newRound(b: Betting, size: number, first: number): void;
|
|
38
|
+
/** The next player after `from` who can act, or null. */
|
|
39
|
+
export declare function nextToAct(b: Betting, from: number): number | null;
|
|
40
|
+
/** The round is over: everyone who can act has, and has matched the bet. */
|
|
41
|
+
export declare function roundDone(b: Betting): boolean;
|
|
42
|
+
export type BetMove = {
|
|
43
|
+
type: "fold";
|
|
44
|
+
} | {
|
|
45
|
+
type: "check";
|
|
46
|
+
} | {
|
|
47
|
+
type: "call";
|
|
48
|
+
} | {
|
|
49
|
+
type: "raise";
|
|
50
|
+
};
|
|
51
|
+
/** What this player may do now, with the chips each costs. */
|
|
52
|
+
export declare function options(b: Betting, seat: number): {
|
|
53
|
+
fold: boolean;
|
|
54
|
+
check: boolean;
|
|
55
|
+
call: number | null;
|
|
56
|
+
raise: number | null;
|
|
57
|
+
};
|
|
58
|
+
/** Apply a betting move. Returns a few words for the news. */
|
|
59
|
+
export declare function bet(b: Betting, seat: number, move: BetMove): string;
|
|
60
|
+
/**
|
|
61
|
+
* Share out the pot at the showdown: main pot and side pots, each to the best hand among those who
|
|
62
|
+
* paid into it (ties split; odd chips to the first winner after the dealer). Returns chips won.
|
|
63
|
+
*/
|
|
64
|
+
export declare function settle(b: Betting, scores: (number[] | null)[], dealer: number): number[];
|
|
65
|
+
/** Everyone but one folded: they take it all without showing. */
|
|
66
|
+
export declare function lastStanding(b: Betting): number | null;
|
|
67
|
+
/** The betting buttons for whoever's turn it is. */
|
|
68
|
+
export declare function betChoices(b: Betting, seat: number, wording?: {
|
|
69
|
+
bet: string;
|
|
70
|
+
raise: string;
|
|
71
|
+
}): {
|
|
72
|
+
label: string;
|
|
73
|
+
move: BetMove;
|
|
74
|
+
primary?: boolean;
|
|
75
|
+
}[];
|
|
76
|
+
/** For a computer player: fold, check/call or raise, from how strong its hand is and its nerve. */
|
|
77
|
+
export declare function decide(b: Betting, seat: number, strength: number, bold: number, rand?: () => number): BetMove;
|
|
78
|
+
export declare const chipsWord: (n: number) => string;
|
|
79
|
+
export { rankLabel, who };
|