@journey-to-code/games 0.0.0-stage → 0.1.0

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.
Files changed (207) hide show
  1. package/LICENSE +21 -0
  2. package/dist/backgammon.d.ts +146 -0
  3. package/dist/backgammon.js +1221 -0
  4. package/dist/backgammon.js.map +1 -0
  5. package/dist/blackjack.d.ts +66 -0
  6. package/dist/blackjack.js +452 -0
  7. package/dist/blackjack.js.map +1 -0
  8. package/dist/bluff.d.ts +60 -0
  9. package/dist/bluff.js +239 -0
  10. package/dist/bluff.js.map +1 -0
  11. package/dist/board.d.ts +387 -0
  12. package/dist/board.js +105 -0
  13. package/dist/board.js.map +1 -0
  14. package/dist/bridge.d.ts +86 -0
  15. package/dist/bridge.js +494 -0
  16. package/dist/bridge.js.map +1 -0
  17. package/dist/canasta.d.ts +88 -0
  18. package/dist/canasta.js +646 -0
  19. package/dist/canasta.js.map +1 -0
  20. package/dist/checkers.d.ts +108 -0
  21. package/dist/checkers.js +756 -0
  22. package/dist/checkers.js.map +1 -0
  23. package/dist/chess.d.ts +162 -0
  24. package/dist/chess.js +904 -0
  25. package/dist/chess.js.map +1 -0
  26. package/dist/chesscore.d.ts +136 -0
  27. package/dist/chesscore.js +1121 -0
  28. package/dist/chesscore.js.map +1 -0
  29. package/dist/combat.d.ts +102 -0
  30. package/dist/combat.js +772 -0
  31. package/dist/combat.js.map +1 -0
  32. package/dist/contractrummy.d.ts +77 -0
  33. package/dist/contractrummy.js +430 -0
  34. package/dist/contractrummy.js.map +1 -0
  35. package/dist/crazy8.d.ts +65 -0
  36. package/dist/crazy8.js +366 -0
  37. package/dist/crazy8.js.map +1 -0
  38. package/dist/cribbage.d.ts +75 -0
  39. package/dist/cribbage.js +428 -0
  40. package/dist/cribbage.js.map +1 -0
  41. package/dist/cuckoo.d.ts +43 -0
  42. package/dist/cuckoo.js +216 -0
  43. package/dist/cuckoo.js.map +1 -0
  44. package/dist/drinkingpyramid.d.ts +54 -0
  45. package/dist/drinkingpyramid.js +213 -0
  46. package/dist/drinkingpyramid.js.map +1 -0
  47. package/dist/drinks.d.ts +25 -0
  48. package/dist/drinks.js +40 -0
  49. package/dist/drinks.js.map +1 -0
  50. package/dist/dropfour.d.ts +103 -0
  51. package/dist/dropfour.js +577 -0
  52. package/dist/dropfour.js.map +1 -0
  53. package/dist/durak.d.ts +58 -0
  54. package/dist/durak.js +332 -0
  55. package/dist/durak.js.map +1 -0
  56. package/dist/euchre.d.ts +80 -0
  57. package/dist/euchre.js +453 -0
  58. package/dist/euchre.js.map +1 -0
  59. package/dist/fivedraw.d.ts +50 -0
  60. package/dist/fivedraw.js +289 -0
  61. package/dist/fivedraw.js.map +1 -0
  62. package/dist/fivehundred.d.ts +90 -0
  63. package/dist/fivehundred.js +504 -0
  64. package/dist/fivehundred.js.map +1 -0
  65. package/dist/freecell.d.ts +50 -0
  66. package/dist/freecell.js +327 -0
  67. package/dist/freecell.js.map +1 -0
  68. package/dist/fruitsalad.d.ts +69 -0
  69. package/dist/fruitsalad.js +427 -0
  70. package/dist/fruitsalad.js.map +1 -0
  71. package/dist/gin.d.ts +72 -0
  72. package/dist/gin.js +393 -0
  73. package/dist/gin.js.map +1 -0
  74. package/dist/go.d.ts +132 -0
  75. package/dist/go.js +659 -0
  76. package/dist/go.js.map +1 -0
  77. package/dist/goboard.d.ts +218 -0
  78. package/dist/goboard.js +880 -0
  79. package/dist/goboard.js.map +1 -0
  80. package/dist/gofish.d.ts +37 -0
  81. package/dist/gofish.js +235 -0
  82. package/dist/gofish.js.map +1 -0
  83. package/dist/golf.d.ts +64 -0
  84. package/dist/golf.js +343 -0
  85. package/dist/golf.js.map +1 -0
  86. package/dist/handfoot.d.ts +86 -0
  87. package/dist/handfoot.js +515 -0
  88. package/dist/handfoot.js.map +1 -0
  89. package/dist/hearts.d.ts +65 -0
  90. package/dist/hearts.js +390 -0
  91. package/dist/hearts.js.map +1 -0
  92. package/dist/holdem.d.ts +45 -0
  93. package/dist/holdem.js +286 -0
  94. package/dist/holdem.js.map +1 -0
  95. package/dist/horserace.d.ts +49 -0
  96. package/dist/horserace.js +207 -0
  97. package/dist/horserace.js.map +1 -0
  98. package/dist/index.d.ts +65 -0
  99. package/dist/index.js +66 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/kingscorner.d.ts +59 -0
  102. package/dist/kingscorner.js +374 -0
  103. package/dist/kingscorner.js.map +1 -0
  104. package/dist/kingscup.d.ts +44 -0
  105. package/dist/kingscup.js +185 -0
  106. package/dist/kingscup.js.map +1 -0
  107. package/dist/kit.d.ts +283 -0
  108. package/dist/kit.js +73 -0
  109. package/dist/kit.js.map +1 -0
  110. package/dist/klondike.d.ts +57 -0
  111. package/dist/klondike.js +314 -0
  112. package/dist/klondike.js.map +1 -0
  113. package/dist/liarspoker.d.ts +61 -0
  114. package/dist/liarspoker.js +298 -0
  115. package/dist/liarspoker.js.map +1 -0
  116. package/dist/memory.d.ts +36 -0
  117. package/dist/memory.js +181 -0
  118. package/dist/memory.js.map +1 -0
  119. package/dist/minigolf.d.ts +104 -0
  120. package/dist/minigolf.js +724 -0
  121. package/dist/minigolf.js.map +1 -0
  122. package/dist/minigolfcourse.d.ts +127 -0
  123. package/dist/minigolfcourse.js +470 -0
  124. package/dist/minigolfcourse.js.map +1 -0
  125. package/dist/offers.d.ts +136 -0
  126. package/dist/offers.js +279 -0
  127. package/dist/offers.js.map +1 -0
  128. package/dist/ohhell.d.ts +66 -0
  129. package/dist/ohhell.js +331 -0
  130. package/dist/ohhell.js.map +1 -0
  131. package/dist/oldmaid.d.ts +40 -0
  132. package/dist/oldmaid.js +186 -0
  133. package/dist/oldmaid.js.map +1 -0
  134. package/dist/pinochle.d.ts +94 -0
  135. package/dist/pinochle.js +466 -0
  136. package/dist/pinochle.js.map +1 -0
  137. package/dist/pitch.d.ts +77 -0
  138. package/dist/pitch.js +362 -0
  139. package/dist/pitch.js.map +1 -0
  140. package/dist/poker.d.ts +79 -0
  141. package/dist/poker.js +268 -0
  142. package/dist/poker.js.map +1 -0
  143. package/dist/president.d.ts +56 -0
  144. package/dist/president.js +339 -0
  145. package/dist/president.js.map +1 -0
  146. package/dist/pyramid.d.ts +39 -0
  147. package/dist/pyramid.js +200 -0
  148. package/dist/pyramid.js.map +1 -0
  149. package/dist/registry.d.ts +17 -0
  150. package/dist/registry.js +70 -0
  151. package/dist/registry.js.map +1 -0
  152. package/dist/reversi.d.ts +69 -0
  153. package/dist/reversi.js +584 -0
  154. package/dist/reversi.js.map +1 -0
  155. package/dist/ridethebus.d.ts +48 -0
  156. package/dist/ridethebus.js +257 -0
  157. package/dist/ridethebus.js.map +1 -0
  158. package/dist/rummy500.d.ts +89 -0
  159. package/dist/rummy500.js +474 -0
  160. package/dist/rummy500.js.map +1 -0
  161. package/dist/sevens.d.ts +48 -0
  162. package/dist/sevens.js +221 -0
  163. package/dist/sevens.js.map +1 -0
  164. package/dist/slapjack.d.ts +42 -0
  165. package/dist/slapjack.js +224 -0
  166. package/dist/slapjack.js.map +1 -0
  167. package/dist/speed.d.ts +44 -0
  168. package/dist/speed.js +201 -0
  169. package/dist/speed.js.map +1 -0
  170. package/dist/spider.d.ts +51 -0
  171. package/dist/spider.js +320 -0
  172. package/dist/spider.js.map +1 -0
  173. package/dist/spite.d.ts +75 -0
  174. package/dist/spite.js +372 -0
  175. package/dist/spite.js.map +1 -0
  176. package/dist/sport.d.ts +266 -0
  177. package/dist/sport.js +48 -0
  178. package/dist/sport.js.map +1 -0
  179. package/dist/switch.d.ts +69 -0
  180. package/dist/switch.js +393 -0
  181. package/dist/switch.js.map +1 -0
  182. package/dist/table.d.ts +284 -0
  183. package/dist/table.js +67 -0
  184. package/dist/table.js.map +1 -0
  185. package/dist/talk.d.ts +17 -0
  186. package/dist/talk.js +44 -0
  187. package/dist/talk.js.map +1 -0
  188. package/dist/thirtyone.d.ts +66 -0
  189. package/dist/thirtyone.js +372 -0
  190. package/dist/thirtyone.js.map +1 -0
  191. package/dist/tictactoe.d.ts +68 -0
  192. package/dist/tictactoe.js +541 -0
  193. package/dist/tictactoe.js.map +1 -0
  194. package/dist/tricks.d.ts +21 -0
  195. package/dist/tricks.js +48 -0
  196. package/dist/tricks.js.map +1 -0
  197. package/dist/war.d.ts +44 -0
  198. package/dist/war.js +185 -0
  199. package/dist/war.js.map +1 -0
  200. package/dist/whist.d.ts +52 -0
  201. package/dist/whist.js +218 -0
  202. package/dist/whist.js.map +1 -0
  203. package/dist/yacht.d.ts +96 -0
  204. package/dist/yacht.js +653 -0
  205. package/dist/yacht.js.map +1 -0
  206. package/package.json +41 -4
  207. package/README.md +0 -3
@@ -0,0 +1,541 @@
1
+ import { settleMatch, withOffers } from "./offers.js";
2
+ import { cellAt, cellName, chessCoords, colOf, lineThrough, rowOf } from "./board.js";
3
+ import { careless, clone, GameError, markReady, nextHandChoices, nextRandom, pickRandom, thinkFor, who } from "./table.js";
4
+ export const classicTicTacToe = { id: "tictactoe-classic", name: "Classic 3×3", board: "single", size: 3, line: 3, first: "random", games: 1 };
5
+ export const ultimateTicTacToe = { id: "tictactoe-ultimate", name: "Ultimate (nine boards)", board: "ultimate", size: 3, line: 3, first: "random", games: 1 };
6
+ export const fourTicTacToe = { id: "tictactoe-four", name: "Four in a row on 6×6", board: "single", size: 6, line: 4, first: "random", games: 1 };
7
+ export const gomoku = { id: "tictactoe-gomoku", name: "Gomoku (15×15, five in a row)", board: "single", size: 15, line: 5, first: "random", games: 1 };
8
+ const PRESETS = [classicTicTacToe, ultimateTicTacToe, fourTicTacToe, gomoku];
9
+ const SIZES = [3, 4, 5, 6, 7, 9, 11, 13, 15];
10
+ const ultimate = (s) => s.rules.board === "ultimate";
11
+ /** Cells along one side of the whole grid. */
12
+ export const sideOf = (rules) => (rules.board === "ultimate" ? 9 : rules.size);
13
+ const other = (seat) => 1 - seat;
14
+ function startRound(s) {
15
+ const n = sideOf(s.rules);
16
+ s.cells = Array(n * n).fill(null);
17
+ s.blocks = ultimate(s) ? Array(9).fill(null) : null;
18
+ s.forced = null;
19
+ s.turn = s.first;
20
+ s.last = null;
21
+ s.won = null;
22
+ s.roundWinner = null;
23
+ s.phase = "playing";
24
+ s.ready = Array(s.seats).fill(false);
25
+ s.narration = null;
26
+ }
27
+ export function newTicTacToe(rules, seats, seed) {
28
+ const s = { game: "tictactoe", rules, seats: 2, rng: seed >>> 0, round: 1, wins: [0, 0], draws: 0 };
29
+ s.first = rules.first === "seat1" ? 0 : rules.first === "seat2" ? 1 : nextRandom(s)() < 0.5 ? 0 : 1;
30
+ startRound(s);
31
+ return s;
32
+ }
33
+ // ---- Ultimate's geometry --------------------------------------------------------------------------
34
+ /** The small board a cell of the 9×9 is in, and its place within that board (both 0–8). */
35
+ export const blockOf = (cell) => Math.floor(rowOf(9, cell) / 3) * 3 + Math.floor(colOf(9, cell) / 3);
36
+ export const spotOf = (cell) => (rowOf(9, cell) % 3) * 3 + (colOf(9, cell) % 3);
37
+ /** The 9×9 cell at a spot of a small board. */
38
+ export const cellIn = (block, spot) => cellAt(9, Math.floor(block / 3) * 3 + Math.floor(spot / 3), (block % 3) * 3 + (spot % 3));
39
+ const LINES3 = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]];
40
+ const SPOTS = [0, 1, 2, 3, 4, 5, 6, 7, 8];
41
+ const lineOf3 = (at, who) => LINES3.find((l) => l.every((i) => at(i) === who)) ?? null;
42
+ /** The cells a move can go in now. */
43
+ export function openCells(s) {
44
+ if (s.phase !== "playing")
45
+ return [];
46
+ if (!ultimate(s))
47
+ return s.cells.flatMap((m, i) => (m === null ? [i] : []));
48
+ return s.cells.flatMap((m, i) => (m === null && s.blocks[blockOf(i)] === null && (s.forced === null || s.forced === blockOf(i)) ? [i] : []));
49
+ }
50
+ /** Put a mark down and work out what it did. Changes `s`: callers pass a copy. */
51
+ function place(s, seat, cell) {
52
+ s.cells[cell] = seat;
53
+ s.last = cell;
54
+ if (!ultimate(s)) {
55
+ const n = s.rules.size;
56
+ const line = lineThrough(n, n, cell, s.rules.line, (c) => s.cells[c] === seat);
57
+ if (line) {
58
+ s.won = line;
59
+ return "won";
60
+ }
61
+ return s.cells.every((m) => m !== null) ? "draw" : null;
62
+ }
63
+ const block = blockOf(cell);
64
+ const blocks = s.blocks;
65
+ if (lineOf3((i) => s.cells[cellIn(block, i)], seat))
66
+ blocks[block] = seat;
67
+ else if (SPOTS.every((i) => s.cells[cellIn(block, i)] !== null))
68
+ blocks[block] = "draw";
69
+ // The square played says where the other player goes, unless that small board is finished.
70
+ s.forced = blocks[spotOf(cell)] === null ? spotOf(cell) : null;
71
+ const big = lineOf3((i) => blocks[i], seat);
72
+ if (big) {
73
+ s.won = big.flatMap((b) => SPOTS.map((i) => cellIn(b, i)));
74
+ return "won";
75
+ }
76
+ return blocks.every((b) => b !== null) ? "draw" : null;
77
+ }
78
+ // ---- Moves --------------------------------------------------------------------------------------
79
+ /** How a match stands once this game is in: finished when the games run out or one side can't be caught. */
80
+ function matchOver(s) {
81
+ const left = s.rules.games - s.round;
82
+ return left <= 0 || Math.abs(s.wins[0] - s.wins[1]) > left;
83
+ }
84
+ function apply(state, seat, move) {
85
+ if (move?.type === "next") {
86
+ if (state.phase !== "scored")
87
+ throw new GameError("There's a game going on.");
88
+ const s = clone(state);
89
+ if (markReady(s.ready, seat)) {
90
+ // Take turns going first.
91
+ s.round += 1;
92
+ s.first = other(s.first);
93
+ startRound(s);
94
+ }
95
+ return s;
96
+ }
97
+ if (move?.type !== "mark")
98
+ throw new GameError("That's not a move in Tic-Tac-Toe.");
99
+ if (state.phase !== "playing")
100
+ throw new GameError("This game is over.");
101
+ if (state.turn !== seat)
102
+ throw new GameError("It's not your turn.");
103
+ const cell = Number(move.cell);
104
+ if (!Number.isInteger(cell) || cell < 0 || cell >= state.cells.length)
105
+ throw new GameError("That's not on the board.");
106
+ if (state.cells[cell] !== null)
107
+ throw new GameError("That square is taken.");
108
+ if (ultimate(state)) {
109
+ if (state.blocks[blockOf(cell)] !== null)
110
+ throw new GameError("That small board is finished.");
111
+ if (state.forced !== null && state.forced !== blockOf(cell))
112
+ throw new GameError("You have to play in the lit-up board.");
113
+ }
114
+ const s = clone(state);
115
+ const end = place(s, seat, cell);
116
+ const grid = gridOf(s);
117
+ s.narration = `${who(seat)} plays ${markOf(s, seat).label} ${nameOf(grid, cell)}`;
118
+ if (!end) {
119
+ s.turn = other(seat);
120
+ return s;
121
+ }
122
+ if (end === "won") {
123
+ s.wins[seat] += 1;
124
+ s.roundWinner = seat;
125
+ }
126
+ else
127
+ s.draws += 1;
128
+ const many = s.rules.games > 1;
129
+ s.narration = end === "won" ? `${who(seat)} wins${many ? ` game ${s.round}` : ""}!` : many ? `Game ${s.round} is a draw` : "It's a draw!";
130
+ s.phase = matchOver(s) ? "finished" : "scored";
131
+ return s;
132
+ }
133
+ /** Best first. A drawn match lists the player who went second in the last game first: holding X to a draw is the better result. */
134
+ function order(s) {
135
+ const [a, b] = s.wins;
136
+ if (a !== b)
137
+ return a > b ? [0, 1] : [1, 0];
138
+ return [other(s.first), s.first];
139
+ }
140
+ const winners = (s) => (s.wins[0] === s.wins[1] ? [0, 1] : [s.wins[0] > s.wins[1] ? 0 : 1]);
141
+ // ---- What a seat sees ---------------------------------------------------------------------------
142
+ const X = { kind: "x", glyph: "✕", label: "X", tone: "red" };
143
+ const O = { kind: "o", glyph: "◯", label: "O", tone: "blue" };
144
+ const markOf = (s, seat) => ({ ...(seat === s.first ? X : O), owner: seat });
145
+ const ROWS3 = ["top", "middle", "bottom"];
146
+ const COLS3 = ["left", "middle", "right"];
147
+ const spotName = (spot) => (spot === 4 ? "centre" : `${ROWS3[Math.floor(spot / 3)]} ${COLS3[spot % 3]}`);
148
+ /** The board without its pieces: enough to name a cell. */
149
+ function gridOf(s) {
150
+ if (ultimate(s))
151
+ return { cols: 9, names: s.cells.map((_, i) => `${spotName(spotOf(i))} of the ${spotName(blockOf(i))} board`) };
152
+ if (s.rules.size === 3)
153
+ return { cols: 3, names: s.cells.map((_, i) => spotName(i)) };
154
+ return { cols: s.rules.size, coords: chessCoords(s.rules.size, s.rules.size) };
155
+ }
156
+ const nameOf = (grid, cell) => (grid.names ? `in the ${grid.names[cell]}` : `at ${cellName(grid, cell)}`);
157
+ const goal = (r) => (r.board === "ultimate" ? "Three small boards in a row wins" : `${["Three", "Four", "Five", "Six"][r.line - 3] ?? r.line} in a row wins`);
158
+ function view(s, seat) {
159
+ const over = s.phase === "finished";
160
+ const mine = s.phase === "playing" && s.turn === seat;
161
+ const many = s.rules.games > 1;
162
+ const n = sideOf(s.rules);
163
+ const w = over ? winners(s) : [];
164
+ const marks = [];
165
+ if (s.last !== null)
166
+ marks.push({ cell: s.last, mark: "last" });
167
+ for (const cell of s.won ?? [])
168
+ marks.push({ cell, mark: "win" });
169
+ const open = openCells(s);
170
+ const grid = {
171
+ id: "board",
172
+ label: "Board",
173
+ rows: n,
174
+ ...gridOf(s),
175
+ cells: s.cells.map((m) => (m === null ? null : markOf(s, m))),
176
+ marks,
177
+ tap: mine ? { type: "mark", cells: open } : null,
178
+ };
179
+ if (ultimate(s)) {
180
+ grid.blocks = {
181
+ rows: 3,
182
+ cols: 3,
183
+ states: s.blocks.map((b, i) => ({
184
+ owner: typeof b === "number" ? b : null,
185
+ glyph: typeof b === "number" ? markOf(s, b).glyph : undefined,
186
+ label: typeof b === "number" ? `won by ${markOf(s, b).label}` : b === "draw" ? "drawn" : undefined,
187
+ closed: b !== null,
188
+ active: s.phase === "playing" && b === null && (s.forced === null || s.forced === i),
189
+ })),
190
+ };
191
+ }
192
+ const scoreTitle = s.roundWinner === null ? `Game ${s.round} is a draw` : `${who(s.roundWinner)} wins game ${s.round}`;
193
+ return {
194
+ game: "tictactoe",
195
+ seats: s.seats,
196
+ me: seat,
197
+ teams: false,
198
+ phase: s.phase,
199
+ turn: s.phase === "playing" ? s.turn : null,
200
+ grids: [grid],
201
+ reserves: [],
202
+ choices: s.phase === "scored" ? nextHandChoices(s.ready, seat, false, "Next game") : null,
203
+ players: s.wins.map((wins, i) => ({ line: many ? `${wins} win${wins === 1 ? "" : "s"}` : "", piece: markOf(s, i), badge: s.phase === "playing" && s.last === null && i === s.first ? "Goes first" : undefined })),
204
+ info: [goal(s.rules), ...(many ? [`Game ${s.round} of ${s.rules.games}`] : []), ...(ultimate(s) && s.phase === "playing" ? [s.forced === null ? "Play in any open board" : `Play in the ${spotName(s.forced)} board`] : [])],
205
+ narration: s.narration ?? (mine ? "You're X: you go first" : null),
206
+ scores: s.wins.map((value, i) => ({ seats: [i], value })),
207
+ result: many && s.phase !== "playing"
208
+ ? { key: `game-${s.round}`, title: scoreTitle, sides: [[0], [1]], rows: [{ label: "Wins", values: s.wins.map(String), tone: "total" }, ...(s.draws ? [{ label: "Draws", values: [String(s.draws), String(s.draws)] }] : [])] }
209
+ : null,
210
+ over: over ? { winners: w, title: w.length > 1 ? "It's a draw!" : `${who(w[0])} wins${many ? ` ${s.wins[w[0]]} to ${s.wins[other(w[0])]}` : ""}!` } : null,
211
+ };
212
+ }
213
+ // ---- Computer players ---------------------------------------------------------------------------
214
+ // Three brains. 3×3 is small enough to know completely, so at full skill it never loses. Bigger
215
+ // boards are scored square by square (what a mark there would build, and what it would stop) with
216
+ // a look at the other player's best answer. Ultimate looks a few moves ahead. A careless player
217
+ // (see `careless`) plays the first square that comes to mind instead, which is how the easier
218
+ // tables get beaten.
219
+ // -- 3×3: the whole game tree, remembered. The value is for the player about to move: 1 win, 0 draw, -1 loss.
220
+ const solved = new Map();
221
+ function solve3(cells, turn) {
222
+ const key = cells.map((m) => (m === null ? "." : m)).join("") + turn;
223
+ const known = solved.get(key);
224
+ if (known !== undefined)
225
+ return known;
226
+ let best = -2;
227
+ for (let i = 0; i < 9 && best < 1; i++) {
228
+ if (cells[i] !== null)
229
+ continue;
230
+ cells[i] = turn;
231
+ const value = lineOf3((j) => cells[j], turn) ? 1 : cells.every((m) => m !== null) ? 0 : -solve3(cells, other(turn));
232
+ cells[i] = null;
233
+ best = Math.max(best, value);
234
+ }
235
+ solved.set(key, best);
236
+ return best;
237
+ }
238
+ /** Every best move on a 3×3 board: the squares that keep the best result that can still be had. */
239
+ export function bestClassicMoves(cells, turn) {
240
+ const board = [...cells];
241
+ let best = -2;
242
+ let moves = [];
243
+ for (let i = 0; i < 9; i++) {
244
+ if (board[i] !== null)
245
+ continue;
246
+ board[i] = turn;
247
+ const value = lineOf3((j) => board[j], turn) ? 1 : board.every((m) => m !== null) ? 0 : -solve3(board, other(turn));
248
+ board[i] = null;
249
+ if (value > best)
250
+ [best, moves] = [value, [i]];
251
+ else if (value === best)
252
+ moves.push(i);
253
+ }
254
+ return moves;
255
+ }
256
+ // -- Bigger boards. Every run of `line` squares through a square counts: a run with only my marks
257
+ // in it is one I'm building (worth more the fuller it is), a run with only theirs is one to stop.
258
+ const WORTH = [1, 6, 40, 400, 6000, 90000];
259
+ const WIN = 1e9;
260
+ /** What a mark in `cell` would do for `seat`: [what it builds, what it stops]. WIN in either means a line finished or denied. */
261
+ function rate(cells, n, line, cell, seat) {
262
+ const r0 = rowOf(n, cell);
263
+ const c0 = colOf(n, cell);
264
+ let build = 0;
265
+ let stop = 0;
266
+ for (const [dr, dc] of [[0, 1], [1, 0], [1, 1], [1, -1]]) {
267
+ for (let start = 1 - line; start <= 0; start++) {
268
+ const r1 = r0 + dr * start;
269
+ const c1 = c0 + dc * start;
270
+ const r2 = r1 + dr * (line - 1);
271
+ const c2 = c1 + dc * (line - 1);
272
+ if (r1 < 0 || r1 >= n || c1 < 0 || c1 >= n || r2 < 0 || r2 >= n || c2 < 0 || c2 >= n)
273
+ continue;
274
+ let mine = 0;
275
+ let theirs = 0;
276
+ for (let k = 0; k < line; k++) {
277
+ const m = cells[cellAt(n, r1 + dr * k, c1 + dc * k)];
278
+ if (m === seat)
279
+ mine++;
280
+ else if (m !== null && m !== undefined)
281
+ theirs++;
282
+ }
283
+ if (!theirs)
284
+ build += mine === line - 1 ? WIN : WORTH[Math.min(mine, 5)];
285
+ if (!mine && theirs)
286
+ stop += theirs === line - 1 ? WIN : WORTH[Math.min(theirs, 5)] * 0.8;
287
+ }
288
+ }
289
+ return [build, stop];
290
+ }
291
+ /** Squares worth thinking about: all of a small board; on a big one, those within two of a mark. */
292
+ function candidates(cells, n) {
293
+ const empty = cells.flatMap((m, i) => (m === null ? [i] : []));
294
+ if (n <= 7)
295
+ return empty;
296
+ if (empty.length === cells.length)
297
+ return [cellAt(n, Math.floor(n / 2), Math.floor(n / 2))];
298
+ const near = empty.filter((i) => {
299
+ const r = rowOf(n, i);
300
+ const c = colOf(n, i);
301
+ for (let dr = -2; dr <= 2; dr++)
302
+ for (let dc = -2; dc <= 2; dc++)
303
+ if (r + dr >= 0 && r + dr < n && c + dc >= 0 && c + dc < n && cells[cellAt(n, r + dr, c + dc)] !== null)
304
+ return true;
305
+ return false;
306
+ });
307
+ return near.length ? near : empty;
308
+ }
309
+ function bestBigMove(s, seat, rand) {
310
+ const n = s.rules.size;
311
+ const line = s.rules.line;
312
+ const cells = [...s.cells];
313
+ const scored = candidates(cells, n)
314
+ .map((cell) => {
315
+ const [build, stop] = rate(cells, n, line, cell, seat);
316
+ return { cell, build, stop, value: build + stop + rand() };
317
+ })
318
+ .sort((a, b) => b.value - a.value);
319
+ // Finish my own line if I can; failing that, stop theirs.
320
+ const win = scored.find((o) => o.build >= WIN);
321
+ if (win)
322
+ return win.cell;
323
+ const block = scored.find((o) => o.stop >= WIN);
324
+ if (block)
325
+ return block.cell;
326
+ // Otherwise weigh the best few against what each leaves the other player.
327
+ let best = scored[0];
328
+ let bestNet = -Infinity;
329
+ for (const option of scored.slice(0, 8)) {
330
+ cells[option.cell] = seat;
331
+ const after = candidates(cells, n);
332
+ const wins = after.filter((c) => rate(cells, n, line, c, seat)[0] >= WIN);
333
+ // Two ways to finish next turn can't both be stopped.
334
+ if (wins.length >= 2)
335
+ return option.cell;
336
+ // One way to finish forces their answer; otherwise they play whatever builds the most.
337
+ const answers = (wins.length ? wins : after).map((cell) => ({ cell, build: rate(cells, n, line, cell, other(seat))[0] })).sort((a, b) => b.build - a.build);
338
+ let net = option.value - Math.min(answers[0]?.build ?? 0, WIN / 10) * 0.6;
339
+ // And an answer that leaves them two ways to finish is one I can't come back from.
340
+ for (const answer of answers.slice(0, 5)) {
341
+ cells[answer.cell] = other(seat);
342
+ if (candidates(cells, n).filter((c) => rate(cells, n, line, c, other(seat))[0] >= WIN).length >= 2)
343
+ net -= WIN / 100;
344
+ cells[answer.cell] = null;
345
+ }
346
+ cells[option.cell] = null;
347
+ if (net > bestNet)
348
+ [best, bestNet] = [option, net];
349
+ }
350
+ return best.cell;
351
+ }
352
+ // -- Ultimate: look a few moves ahead, and judge what's left by the small boards held and the
353
+ // lines of them still open.
354
+ const SPOT_WEIGHT = [1.2, 1, 1.2, 1, 1.4, 1, 1.2, 1, 1.2];
355
+ function judge(s, seat) {
356
+ const blocks = s.blocks;
357
+ let total = 0;
358
+ for (let b = 0; b < 9; b++) {
359
+ const held = blocks[b];
360
+ if (held === seat)
361
+ total += 100 * SPOT_WEIGHT[b];
362
+ else if (typeof held === "number")
363
+ total -= 100 * SPOT_WEIGHT[b];
364
+ else if (held === null) {
365
+ for (const l of LINES3) {
366
+ let mine = 0;
367
+ let theirs = 0;
368
+ for (const i of l) {
369
+ const m = s.cells[cellIn(b, i)];
370
+ if (m === seat)
371
+ mine++;
372
+ else if (m !== null)
373
+ theirs++;
374
+ }
375
+ if (!theirs)
376
+ total += [0, 1, 6][mine] * SPOT_WEIGHT[b];
377
+ if (!mine)
378
+ total -= [0, 1, 6][theirs] * SPOT_WEIGHT[b];
379
+ }
380
+ }
381
+ }
382
+ for (const l of LINES3) {
383
+ const held = l.map((i) => blocks[i]);
384
+ const mine = held.filter((h) => h === seat).length;
385
+ const theirs = held.filter((h) => typeof h === "number" && h !== seat).length;
386
+ const dead = held.some((h) => h === "draw");
387
+ if (!dead && !theirs)
388
+ total += [0, 30, 250][mine] ?? 0;
389
+ if (!dead && !mine)
390
+ total -= [0, 30, 250][theirs] ?? 0;
391
+ }
392
+ return total;
393
+ }
394
+ /** The value of the position for `seat`, who is about to move, looking `depth` moves ahead. */
395
+ function search(s, seat, depth, alpha, beta) {
396
+ const moves = openCells(s);
397
+ if (depth === 0)
398
+ return judge(s, seat);
399
+ let best = -Infinity;
400
+ for (const cell of moves) {
401
+ const next = { ...s, cells: [...s.cells], blocks: [...s.blocks] };
402
+ const end = place(next, seat, cell);
403
+ // Sooner wins are better than later ones.
404
+ const value = end === "won" ? 100000 + depth : end === "draw" ? 0 : -search(next, other(seat), depth - 1, -beta, -alpha);
405
+ if (value > best)
406
+ best = value;
407
+ if (best > alpha)
408
+ alpha = best;
409
+ if (alpha >= beta)
410
+ break;
411
+ }
412
+ return best;
413
+ }
414
+ function bestUltimateMove(s, seat, depth, rand) {
415
+ const moves = openCells(s);
416
+ // A free choice of all nine boards is a lot of moves: look one move less far.
417
+ const deep = moves.length > 27 ? depth - 1 : depth;
418
+ let best = moves[0];
419
+ let bestValue = -Infinity;
420
+ for (const cell of moves) {
421
+ const next = { ...s, cells: [...s.cells], blocks: [...s.blocks] };
422
+ const end = place(next, seat, cell);
423
+ const value = (end === "won" ? 100000 + deep : end === "draw" ? 0 : -search(next, other(seat), deep - 1, -Infinity, Infinity)) + rand();
424
+ if (value > bestValue)
425
+ [best, bestValue] = [cell, value];
426
+ }
427
+ return best;
428
+ }
429
+ function bot(s, seat, style, rand = Math.random) {
430
+ if (s.phase === "scored")
431
+ return s.ready[seat] ? null : { type: "next" };
432
+ if (s.phase !== "playing" || s.turn !== seat)
433
+ return null;
434
+ const open = openCells(s);
435
+ if (ultimate(s)) {
436
+ if (careless(style, rand))
437
+ return { type: "mark", cell: pickRandom(open, rand) };
438
+ return { type: "mark", cell: bestUltimateMove(s, seat, (style.skill ?? 1) >= 0.9 ? 4 : (style.skill ?? 1) >= 0.5 ? 3 : 2, rand) };
439
+ }
440
+ if (s.rules.size === 3 && s.rules.line === 3) {
441
+ if (careless(style, rand))
442
+ return { type: "mark", cell: pickRandom(open, rand) };
443
+ return { type: "mark", cell: pickRandom(bestClassicMoves(s.cells, seat), rand) };
444
+ }
445
+ // A careless move on a big board is still somewhere near the action, just not thought through.
446
+ if (careless(style, rand))
447
+ return { type: "mark", cell: pickRandom(candidates(s.cells, s.rules.size), rand) };
448
+ return { type: "mark", cell: bestBigMove(s, seat, rand) };
449
+ }
450
+ // ---- The game -----------------------------------------------------------------------------------
451
+ function normalize(rules) {
452
+ const given = (rules && typeof rules === "object" ? rules : {});
453
+ const base = PRESETS.find((p) => p.id === given.id) ?? classicTicTacToe;
454
+ const r = { ...base, ...given };
455
+ const board = r.board === "ultimate" ? "ultimate" : "single";
456
+ // Ultimate is always 3×3 boards and three in a row, whatever was saved with it.
457
+ const size = board === "ultimate" ? 3 : Math.min(15, Math.max(3, Math.round(Number(r.size)) || 3));
458
+ const line = board === "ultimate" ? 3 : Math.min(6, Math.max(3, Math.round(Number(r.line)) || 3));
459
+ return {
460
+ id: String(r.id),
461
+ name: String(r.name),
462
+ board,
463
+ size,
464
+ line,
465
+ first: r.first === "seat1" || r.first === "seat2" ? r.first : "random",
466
+ games: [1, 3, 5, 7].includes(Number(r.games)) ? Number(r.games) : 1,
467
+ };
468
+ }
469
+ const rules = {
470
+ id: "tictactoe",
471
+ name: "Tic-Tac-Toe",
472
+ emoji: "⭕",
473
+ blurb: "Three in a row, or nine boards at once",
474
+ tagline: "Xs and Os: get yours in a row first. Try Ultimate when three in a row gets too easy.",
475
+ seats: { min: 2, max: 2, default: 2 },
476
+ teams: false,
477
+ presets: PRESETS,
478
+ fields: [
479
+ { key: "board", label: "Board", kind: "choice", options: [["single", "One board"], ["ultimate", "Ultimate: nine small boards"]] },
480
+ { key: "size", label: "Board size (one board)", kind: "choice", options: SIZES.map((n) => [n, `${n}×${n}`]) },
481
+ { key: "line", label: "In a row to win (one board)", kind: "choice", options: [[3, "Three"], [4, "Four"], [5, "Five"], [6, "Six"]] },
482
+ { key: "first", label: "Who goes first", kind: "choice", options: [["random", "Luck of the draw"], ["seat1", "The first seat"], ["seat2", "The second seat"]] },
483
+ { key: "games", label: "Games in a match", kind: "choice", options: [[1, "Just one"], [3, "Three"], [5, "Five"], [7, "Seven"]] },
484
+ ],
485
+ normalize,
486
+ validate(r) {
487
+ return r.board === "single" && r.line > r.size ? [`${r.line} in a row doesn't fit on a ${r.size}×${r.size} board.`] : [];
488
+ },
489
+ describe(r) {
490
+ const match = r.games > 1 ? [`A match is ${r.games} games; most wins takes it. Players take turns going first.`] : [];
491
+ const first = r.first === "random" ? "X goes first; who gets to be X is the luck of the draw." : `X goes first, and the ${r.first === "seat1" ? "first" : "second"} seat is X.`;
492
+ if (r.board === "ultimate") {
493
+ return [
494
+ "Nine small Tic-Tac-Toe boards make one big one. Take turns putting your mark in a square.",
495
+ "The square you pick says where the other player goes next: play the top-right square of a small board, and they must play in the top-right small board.",
496
+ "Three in a row in a small board wins that board. If you're sent to a board that's finished, play in any open one.",
497
+ "Win three small boards in a row to win. If every board is finished first, it's a draw.",
498
+ first,
499
+ ...match,
500
+ ];
501
+ }
502
+ return [
503
+ `Take turns putting your mark on a ${r.size}×${r.size} board.`,
504
+ `${["Three", "Four", "Five", "Six"][r.line - 3]} in a row wins: across, down or on a slant.${r.line < r.size ? " More than that in a row wins too." : ""}`,
505
+ "If the board fills up first, it's a draw.",
506
+ first,
507
+ ...match,
508
+ ];
509
+ },
510
+ newGame: newTicTacToe,
511
+ apply,
512
+ view,
513
+ bot,
514
+ // The big boards are searched; three in a row is known by heart.
515
+ heavy: (s, seat) => s.phase === "playing" && s.turn === seat && !(s.rules.size === 3 && s.rules.line === 3 && !ultimate(s)),
516
+ thinkingTime: (s) => thinkFor(Math.min(openCells(s).length, 6), s.last === null ? 0.7 : 1),
517
+ summary(s) {
518
+ const over = s.phase === "finished";
519
+ return {
520
+ game: "tictactoe",
521
+ rules: s.rules.name,
522
+ phase: s.phase,
523
+ over,
524
+ hand: s.round,
525
+ scoreLine: `${s.wins[0]} to ${s.wins[1]}${s.draws ? ` · ${s.draws} drawn` : ""}`,
526
+ order: over ? order(s) : null,
527
+ winners: over ? winners(s) : null,
528
+ teams: false,
529
+ seats: s.seats,
530
+ };
531
+ },
532
+ };
533
+ /** Tic-Tac-Toe, with resigning, draw offers and taking a move back (see offers.ts). */
534
+ export const ticTacToe = withOffers(rules, {
535
+ takeBack: true,
536
+ settle: settleMatch,
537
+ // The 3×3 game is known to the end, so a level position is a drawn one however early; the bigger boards aren't judged.
538
+ levelAfter: 2,
539
+ standing: (s, seat) => (s.rules.board === "single" && s.rules.size === 3 && s.rules.line === 3 ? solve3([...s.cells], s.turn) * (s.turn === seat ? 1 : -1) : null),
540
+ });
541
+ //# sourceMappingURL=tictactoe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tictactoe.js","sourceRoot":"","sources":["../src/tictactoe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Suit } from "@journey-to-code/rules";
2
+ import type { KCard } from "./kit.js";
3
+ export interface Play {
4
+ seat: number;
5
+ card: KCard;
6
+ }
7
+ /**
8
+ * The winning play: the highest trump if any was played, else the highest card of the suit led.
9
+ * `suitOf` says which suit a card counts as (Euchre's left bower is a trump), `power` how high it is.
10
+ */
11
+ export declare function trickWinner(plays: Play[], trump: Suit | null, suitOf: (c: KCard) => Suit, power: (c: KCard) => number): Play;
12
+ /** Cards that follow the suit led, or every card when you have none of it. */
13
+ export declare function following(hand: KCard[], plays: Play[], suitOf: (c: KCard) => Suit): KCard[];
14
+ /** Would this card win the trick if played now? */
15
+ export declare function wouldWin(card: KCard, seat: number, plays: Play[], trump: Suit | null, suitOf: (c: KCard) => Suit, power: (c: KCard) => number): boolean;
16
+ /** For a player who wants this trick: the cheapest card that wins it now, or null. */
17
+ export declare function cheapestWinner(legal: KCard[], seat: number, plays: Play[], trump: Suit | null, suitOf: (c: KCard) => Suit, power: (c: KCard) => number): KCard | null;
18
+ /** For a player who doesn't want it: the strongest card that still loses, else the weakest card. */
19
+ export declare function bestLoser(legal: KCard[], seat: number, plays: Play[], trump: Suit | null, suitOf: (c: KCard) => Suit, power: (c: KCard) => number): KCard;
20
+ /** One number for how strong a card is overall: trumps above everything else. */
21
+ export declare const strength: (c: KCard, trump: Suit | null, suitOf: (c: KCard) => Suit, power: (c: KCard) => number) => number;