@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.
- 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/reversi.js
ADDED
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
import { settleMatch, withOffers } from "./offers.js";
|
|
2
|
+
import { cellName, DIRECTIONS } from "./board.js";
|
|
3
|
+
import { careless, clone, GameError, markReady, nextHandChoices, nextRandom, pickRandom, thinkFor, who } from "./table.js";
|
|
4
|
+
export const classicReversi = { id: "reversi-classic", name: "Classic 8×8", size: 8, first: "random", hints: true, games: 1 };
|
|
5
|
+
export const smallReversi = { id: "reversi-small", name: "Small 6×6", size: 6, first: "random", hints: true, games: 1 };
|
|
6
|
+
export const bigReversi = { id: "reversi-big", name: "Big 10×10", size: 10, first: "random", hints: true, games: 1 };
|
|
7
|
+
const PRESETS = [classicReversi, smallReversi, bigReversi];
|
|
8
|
+
const SIZES = [6, 8, 10];
|
|
9
|
+
const other = (seat) => 1 - seat;
|
|
10
|
+
// ---- The board ------------------------------------------------------------------------------------
|
|
11
|
+
/**
|
|
12
|
+
* From every cell, the cells along each of the eight directions out to the edge. Worked out once
|
|
13
|
+
* per board size: both the rules and the computer player walk these instead of doing the sums again.
|
|
14
|
+
* Directions with fewer than two cells are left out, since nothing can be trapped along them.
|
|
15
|
+
*/
|
|
16
|
+
const RAYS = new Map();
|
|
17
|
+
function raysOf(n) {
|
|
18
|
+
let rays = RAYS.get(n);
|
|
19
|
+
if (rays)
|
|
20
|
+
return rays;
|
|
21
|
+
rays = [];
|
|
22
|
+
for (let cell = 0; cell < n * n; cell++) {
|
|
23
|
+
const from = [];
|
|
24
|
+
for (const [dr, dc] of DIRECTIONS) {
|
|
25
|
+
const ray = [];
|
|
26
|
+
for (let r = Math.floor(cell / n) + dr, c = (cell % n) + dc; r >= 0 && r < n && c >= 0 && c < n; r += dr, c += dc)
|
|
27
|
+
ray.push(r * n + c);
|
|
28
|
+
if (ray.length >= 2)
|
|
29
|
+
from.push(ray);
|
|
30
|
+
}
|
|
31
|
+
rays.push(from);
|
|
32
|
+
}
|
|
33
|
+
RAYS.set(n, rays);
|
|
34
|
+
return rays;
|
|
35
|
+
}
|
|
36
|
+
/** The discs a disc of `seat`'s in `cell` would turn over: empty when the move isn't allowed. */
|
|
37
|
+
export function flipsFor(cells, n, cell, seat) {
|
|
38
|
+
if (cells[cell] !== null)
|
|
39
|
+
return [];
|
|
40
|
+
const out = [];
|
|
41
|
+
for (const ray of raysOf(n)[cell]) {
|
|
42
|
+
let i = 0;
|
|
43
|
+
while (i < ray.length && cells[ray[i]] === other(seat))
|
|
44
|
+
i++;
|
|
45
|
+
// A run of theirs with one of mine at the far end.
|
|
46
|
+
if (i > 0 && i < ray.length && cells[ray[i]] === seat)
|
|
47
|
+
for (let k = 0; k < i; k++)
|
|
48
|
+
out.push(ray[k]);
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
/** Every cell `seat` could play in. */
|
|
53
|
+
export function legalMoves(cells, n, seat) {
|
|
54
|
+
const out = [];
|
|
55
|
+
for (let cell = 0; cell < cells.length; cell++)
|
|
56
|
+
if (cells[cell] === null && flipsFor(cells, n, cell, seat).length)
|
|
57
|
+
out.push(cell);
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
/** How many discs each seat has on the board. */
|
|
61
|
+
export function discCount(cells) {
|
|
62
|
+
const count = [0, 0];
|
|
63
|
+
for (const d of cells)
|
|
64
|
+
if (d !== null)
|
|
65
|
+
count[d] += 1;
|
|
66
|
+
return count;
|
|
67
|
+
}
|
|
68
|
+
function startRound(s) {
|
|
69
|
+
const n = s.rules.size;
|
|
70
|
+
s.cells = Array(n * n).fill(null);
|
|
71
|
+
// The four in the middle: light on the slant from the top left, dark on the other.
|
|
72
|
+
const a = n / 2 - 1;
|
|
73
|
+
const b = n / 2;
|
|
74
|
+
s.cells[a * n + a] = s.cells[b * n + b] = other(s.first);
|
|
75
|
+
s.cells[a * n + b] = s.cells[b * n + a] = s.first;
|
|
76
|
+
s.turn = s.first;
|
|
77
|
+
s.last = null;
|
|
78
|
+
s.flipped = [];
|
|
79
|
+
s.passed = null;
|
|
80
|
+
s.roundWinner = null;
|
|
81
|
+
s.phase = "playing";
|
|
82
|
+
s.ready = Array(s.seats).fill(false);
|
|
83
|
+
s.narration = null;
|
|
84
|
+
}
|
|
85
|
+
export function newReversi(rules, seats, seed) {
|
|
86
|
+
const s = { game: "reversi", rules, seats: 2, rng: seed >>> 0, round: 1, wins: [0, 0], draws: 0 };
|
|
87
|
+
s.first = rules.first === "seat1" ? 0 : rules.first === "seat2" ? 1 : nextRandom(s)() < 0.5 ? 0 : 1;
|
|
88
|
+
startRound(s);
|
|
89
|
+
return s;
|
|
90
|
+
}
|
|
91
|
+
// ---- Moves --------------------------------------------------------------------------------------
|
|
92
|
+
/** How a match stands once this game is in: finished when the games run out or one side can't be caught. */
|
|
93
|
+
function matchOver(s) {
|
|
94
|
+
const left = s.rules.games - s.round;
|
|
95
|
+
return left <= 0 || Math.abs(s.wins[0] - s.wins[1]) > left;
|
|
96
|
+
}
|
|
97
|
+
const colourOf = (s, seat) => (seat === s.first ? "dark" : "light");
|
|
98
|
+
function apply(state, seat, move) {
|
|
99
|
+
if (move?.type === "next") {
|
|
100
|
+
if (state.phase !== "scored")
|
|
101
|
+
throw new GameError("There's a game going on.");
|
|
102
|
+
const s = clone(state);
|
|
103
|
+
if (markReady(s.ready, seat)) {
|
|
104
|
+
// Take turns playing dark.
|
|
105
|
+
s.round += 1;
|
|
106
|
+
s.first = other(s.first);
|
|
107
|
+
startRound(s);
|
|
108
|
+
}
|
|
109
|
+
return s;
|
|
110
|
+
}
|
|
111
|
+
if (move?.type !== "place")
|
|
112
|
+
throw new GameError("That's not a move in Reversi.");
|
|
113
|
+
if (state.phase !== "playing")
|
|
114
|
+
throw new GameError("This game is over.");
|
|
115
|
+
if (state.turn !== seat)
|
|
116
|
+
throw new GameError("It's not your turn.");
|
|
117
|
+
const cell = Number(move.cell);
|
|
118
|
+
if (!Number.isInteger(cell) || cell < 0 || cell >= state.cells.length)
|
|
119
|
+
throw new GameError("That's not on the board.");
|
|
120
|
+
if (state.cells[cell] !== null)
|
|
121
|
+
throw new GameError("There's a disc there already.");
|
|
122
|
+
const n = state.rules.size;
|
|
123
|
+
const flips = flipsFor(state.cells, n, cell, seat);
|
|
124
|
+
if (!flips.length)
|
|
125
|
+
throw new GameError("A disc there wouldn't flip anything: it has to trap at least one of theirs in a line.");
|
|
126
|
+
const s = clone(state);
|
|
127
|
+
s.cells[cell] = seat;
|
|
128
|
+
for (const f of flips)
|
|
129
|
+
s.cells[f] = seat;
|
|
130
|
+
s.last = cell;
|
|
131
|
+
s.flipped = flips;
|
|
132
|
+
s.passed = null;
|
|
133
|
+
// (The table turns "{0} plays" into "You play" for the player it names; one verb each keeps that right.)
|
|
134
|
+
const played = `${who(seat)} plays ${cellName(gridOf(n), cell)}, flipping ${flips.length}`;
|
|
135
|
+
if (legalMoves(s.cells, n, other(seat)).length) {
|
|
136
|
+
s.turn = other(seat);
|
|
137
|
+
s.narration = played;
|
|
138
|
+
return s;
|
|
139
|
+
}
|
|
140
|
+
if (legalMoves(s.cells, n, seat).length) {
|
|
141
|
+
// Nowhere for the other player to go: they sit this turn out, and the same player moves again.
|
|
142
|
+
s.passed = other(seat);
|
|
143
|
+
s.narration = `${played}. ${who(other(seat))} has no move and must pass, so ${who(seat)} goes again`;
|
|
144
|
+
return s;
|
|
145
|
+
}
|
|
146
|
+
// Neither can move: count up.
|
|
147
|
+
const [a, b] = discCount(s.cells);
|
|
148
|
+
const many = s.rules.games > 1;
|
|
149
|
+
const full = s.cells.every((d) => d !== null);
|
|
150
|
+
const why = full ? "The board is full" : "Nobody can move";
|
|
151
|
+
if (a === b) {
|
|
152
|
+
s.draws += 1;
|
|
153
|
+
s.narration = `${why}. ${many ? `Game ${s.round} is a draw` : "It's a draw"}, ${a} all`;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
const winner = a > b ? 0 : 1;
|
|
157
|
+
s.wins[winner] += 1;
|
|
158
|
+
s.roundWinner = winner;
|
|
159
|
+
s.narration = `${why}. ${who(winner)} wins${many ? ` game ${s.round}` : ""} ${Math.max(a, b)} to ${Math.min(a, b)}`;
|
|
160
|
+
}
|
|
161
|
+
s.phase = matchOver(s) ? "finished" : "scored";
|
|
162
|
+
return s;
|
|
163
|
+
}
|
|
164
|
+
/** Best first. A drawn match lists the player who went second in the last game first, as Tic-Tac-Toe does. */
|
|
165
|
+
function order(s) {
|
|
166
|
+
const [a, b] = s.wins;
|
|
167
|
+
if (a !== b)
|
|
168
|
+
return a > b ? [0, 1] : [1, 0];
|
|
169
|
+
return [other(s.first), s.first];
|
|
170
|
+
}
|
|
171
|
+
const winners = (s) => (s.wins[0] === s.wins[1] ? [0, 1] : [s.wins[0] > s.wins[1] ? 0 : 1]);
|
|
172
|
+
// ---- What a seat sees ---------------------------------------------------------------------------
|
|
173
|
+
const DARK = { kind: "disc", glyph: "●", label: "dark", tone: "dark" };
|
|
174
|
+
const LIGHT = { kind: "disc", glyph: "●", label: "light", tone: "light" };
|
|
175
|
+
const discOf = (s, seat) => ({ ...(seat === s.first ? DARK : LIGHT), owner: seat });
|
|
176
|
+
/** The board without its discs: enough to name a cell. Columns a, b, c…; rows 1, 2, 3… from the top, the way Reversi is written down. */
|
|
177
|
+
function gridOf(n) {
|
|
178
|
+
return { cols: n, coords: { cols: Array.from({ length: n }, (_, c) => String.fromCharCode(97 + c)), rows: Array.from({ length: n }, (_, r) => String(r + 1)) } };
|
|
179
|
+
}
|
|
180
|
+
const plural = (n, word) => `${n} ${word}${n === 1 ? "" : "s"}`;
|
|
181
|
+
function view(s, seat) {
|
|
182
|
+
const over = s.phase === "finished";
|
|
183
|
+
const mine = s.phase === "playing" && s.turn === seat;
|
|
184
|
+
const many = s.rules.games > 1;
|
|
185
|
+
const n = s.rules.size;
|
|
186
|
+
const w = over ? winners(s) : [];
|
|
187
|
+
const discs = discCount(s.cells);
|
|
188
|
+
const legal = mine ? legalMoves(s.cells, n, seat) : [];
|
|
189
|
+
const marks = [];
|
|
190
|
+
if (s.last !== null)
|
|
191
|
+
marks.push({ cell: s.last, mark: "last" });
|
|
192
|
+
for (const cell of s.flipped)
|
|
193
|
+
marks.push({ cell, mark: "flipped" });
|
|
194
|
+
// Where you can go is only pointed out when the table plays that way.
|
|
195
|
+
if (s.rules.hints)
|
|
196
|
+
for (const cell of legal)
|
|
197
|
+
marks.push({ cell, mark: "hint" });
|
|
198
|
+
const grid = {
|
|
199
|
+
id: "board",
|
|
200
|
+
label: "Board",
|
|
201
|
+
rows: n,
|
|
202
|
+
...gridOf(n),
|
|
203
|
+
cells: s.cells.map((d) => (d === null ? null : discOf(s, d))),
|
|
204
|
+
marks,
|
|
205
|
+
// The purist's game: any empty cell can be tried, and the rules refuse the ones that flip nothing.
|
|
206
|
+
tap: mine ? { type: "place", cells: s.rules.hints ? legal : s.cells.flatMap((d, i) => (d === null ? [i] : [])) } : null,
|
|
207
|
+
};
|
|
208
|
+
const [a, b] = discs;
|
|
209
|
+
const scoreTitle = s.roundWinner === null ? `Game ${s.round} is a draw` : `${who(s.roundWinner)} wins game ${s.round}`;
|
|
210
|
+
const title = () => {
|
|
211
|
+
// (A game that was agreed drawn or resigned didn't end on the count, so the count isn't quoted.)
|
|
212
|
+
if (w.length > 1)
|
|
213
|
+
return many || a !== b ? "It's a draw!" : `It's a draw: ${a} all!`;
|
|
214
|
+
const tally = many ? s.wins : discs;
|
|
215
|
+
if (tally[w[0]] <= tally[other(w[0])])
|
|
216
|
+
return `${who(w[0])} wins!`;
|
|
217
|
+
return `${who(w[0])} wins ${tally[w[0]]} to ${tally[other(w[0])]}!`;
|
|
218
|
+
};
|
|
219
|
+
return {
|
|
220
|
+
game: "reversi",
|
|
221
|
+
seats: s.seats,
|
|
222
|
+
me: seat,
|
|
223
|
+
teams: false,
|
|
224
|
+
phase: s.phase,
|
|
225
|
+
turn: s.phase === "playing" ? s.turn : null,
|
|
226
|
+
grids: [grid],
|
|
227
|
+
reserves: [],
|
|
228
|
+
choices: s.phase === "scored" ? nextHandChoices(s.ready, seat, false, "Next game") : null,
|
|
229
|
+
players: discs.map((count, i) => ({
|
|
230
|
+
line: `${plural(count, "disc")}${many ? ` · ${plural(s.wins[i], "win")}` : ""}`,
|
|
231
|
+
piece: discOf(s, i),
|
|
232
|
+
badge: s.phase !== "playing" ? undefined : s.passed === i ? "No move" : s.last === null && i === s.first ? "Goes first" : undefined,
|
|
233
|
+
})),
|
|
234
|
+
info: ["Most discs wins", ...(many ? [`Game ${s.round} of ${s.rules.games}`] : []), ...(s.rules.hints ? [] : ["Find your own moves: a disc must flip at least one"])],
|
|
235
|
+
narration: s.narration ?? (mine ? "You're dark: you go first" : null),
|
|
236
|
+
// One game is scored in discs; a match in games won, with the discs under each name.
|
|
237
|
+
scores: (many ? s.wins : discs).map((value, i) => ({ seats: [i], value })),
|
|
238
|
+
result: many && s.phase !== "playing"
|
|
239
|
+
? {
|
|
240
|
+
key: `game-${s.round}`,
|
|
241
|
+
title: scoreTitle,
|
|
242
|
+
sides: [[0], [1]],
|
|
243
|
+
rows: [{ label: "Discs", values: discs.map(String), tone: "score" }, { label: "Wins", values: s.wins.map(String), tone: "total" }, ...(s.draws ? [{ label: "Draws", values: [String(s.draws), String(s.draws)] }] : [])],
|
|
244
|
+
}
|
|
245
|
+
: null,
|
|
246
|
+
over: over ? { winners: w, title: title() } : null,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const GEOMETRY = new Map();
|
|
250
|
+
function geometryOf(n) {
|
|
251
|
+
let g = GEOMETRY.get(n);
|
|
252
|
+
if (g)
|
|
253
|
+
return g;
|
|
254
|
+
const worth = [];
|
|
255
|
+
const rank = [];
|
|
256
|
+
for (let r = 0; r < n; r++) {
|
|
257
|
+
for (let c = 0; c < n; c++) {
|
|
258
|
+
// How far in from the nearest edges.
|
|
259
|
+
const dr = Math.min(r, n - 1 - r);
|
|
260
|
+
const dc = Math.min(c, n - 1 - c);
|
|
261
|
+
const [near, far] = dr < dc ? [dr, dc] : [dc, dr];
|
|
262
|
+
const corner = far === 0;
|
|
263
|
+
const beside = near <= 1 && far === 1;
|
|
264
|
+
worth.push(corner ? 120 : beside ? 0 : near === 0 ? (far === 2 ? 12 : 8) : near === 1 ? -4 : near === 2 && far === 2 ? 4 : 1);
|
|
265
|
+
rank.push(corner ? 1000 : beside ? (near === 1 ? -100 : -50) : worth[worth.length - 1]);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const at = (r, c) => r * n + c;
|
|
269
|
+
const m = n - 1;
|
|
270
|
+
g = {
|
|
271
|
+
n,
|
|
272
|
+
rays: raysOf(n),
|
|
273
|
+
worth,
|
|
274
|
+
order: worth.map((_, i) => i).sort((x, y) => rank[y] - rank[x]),
|
|
275
|
+
corners: [
|
|
276
|
+
{ corner: at(0, 0), slant: at(1, 1), sides: [at(0, 1), at(1, 0)] },
|
|
277
|
+
{ corner: at(0, m), slant: at(1, m - 1), sides: [at(0, m - 1), at(1, m)] },
|
|
278
|
+
{ corner: at(m, 0), slant: at(m - 1, 1), sides: [at(m, 1), at(m - 1, 0)] },
|
|
279
|
+
{ corner: at(m, m), slant: at(m - 1, m - 1), sides: [at(m, m - 1), at(m - 1, m)] },
|
|
280
|
+
],
|
|
281
|
+
};
|
|
282
|
+
GEOMETRY.set(n, g);
|
|
283
|
+
return g;
|
|
284
|
+
}
|
|
285
|
+
/** Whether `me` could play in an empty `cell`. */
|
|
286
|
+
function canPlay(g, b, cell, me) {
|
|
287
|
+
for (const ray of g.rays[cell]) {
|
|
288
|
+
if (b[ray[0]] !== -me)
|
|
289
|
+
continue;
|
|
290
|
+
let i = 1;
|
|
291
|
+
while (i < ray.length && b[ray[i]] === -me)
|
|
292
|
+
i++;
|
|
293
|
+
if (i < ray.length && b[ray[i]] === me)
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
/** Put `me` in `cell`: turns the trapped discs over and returns them, or nothing when the move isn't allowed (and nothing changed). */
|
|
299
|
+
function playAt(g, b, cell, me) {
|
|
300
|
+
let flips = null;
|
|
301
|
+
for (const ray of g.rays[cell]) {
|
|
302
|
+
if (b[ray[0]] !== -me)
|
|
303
|
+
continue;
|
|
304
|
+
let i = 1;
|
|
305
|
+
while (i < ray.length && b[ray[i]] === -me)
|
|
306
|
+
i++;
|
|
307
|
+
if (i < ray.length && b[ray[i]] === me) {
|
|
308
|
+
flips ??= [];
|
|
309
|
+
for (let k = 0; k < i; k++)
|
|
310
|
+
flips.push(ray[k]);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (!flips)
|
|
314
|
+
return null;
|
|
315
|
+
b[cell] = me;
|
|
316
|
+
for (const f of flips)
|
|
317
|
+
b[f] = me;
|
|
318
|
+
return flips;
|
|
319
|
+
}
|
|
320
|
+
function takeBack(b, cell, me, flips) {
|
|
321
|
+
b[cell] = 0;
|
|
322
|
+
for (const f of flips)
|
|
323
|
+
b[f] = -me;
|
|
324
|
+
}
|
|
325
|
+
function mobility(g, b, me) {
|
|
326
|
+
let count = 0;
|
|
327
|
+
for (let cell = 0; cell < b.length; cell++)
|
|
328
|
+
if (b[cell] === 0 && canPlay(g, b, cell, me))
|
|
329
|
+
count++;
|
|
330
|
+
return count;
|
|
331
|
+
}
|
|
332
|
+
/** A finished game is worth more than anything a judgement can say, and a bigger win more than a smaller one. */
|
|
333
|
+
const DECIDED = 10000;
|
|
334
|
+
function finalValue(b, me) {
|
|
335
|
+
let diff = 0;
|
|
336
|
+
for (let i = 0; i < b.length; i++)
|
|
337
|
+
diff += b[i];
|
|
338
|
+
return diff * me * DECIDED;
|
|
339
|
+
}
|
|
340
|
+
/** How good the position looks for `me`. */
|
|
341
|
+
function judge(g, b, me) {
|
|
342
|
+
let place = 0;
|
|
343
|
+
let discs = 0;
|
|
344
|
+
let empty = 0;
|
|
345
|
+
for (let i = 0; i < b.length; i++) {
|
|
346
|
+
const d = b[i];
|
|
347
|
+
if (d === 0)
|
|
348
|
+
empty++;
|
|
349
|
+
else {
|
|
350
|
+
place += d * g.worth[i];
|
|
351
|
+
discs += d;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
for (const { corner, slant, sides } of g.corners) {
|
|
355
|
+
const held = b[corner];
|
|
356
|
+
// Beside an empty corner is a gift to whoever isn't there; beside a corner you hold is as safe as the corner.
|
|
357
|
+
if (held === 0)
|
|
358
|
+
place -= b[slant] * 45 + (b[sides[0]] + b[sides[1]]) * 18;
|
|
359
|
+
else
|
|
360
|
+
place += ((b[sides[0]] === held ? held : 0) + (b[sides[1]] === held ? held : 0)) * 14;
|
|
361
|
+
}
|
|
362
|
+
const moves = mobility(g, b, 1) - mobility(g, b, -1);
|
|
363
|
+
// Discs only start to count as the board fills up.
|
|
364
|
+
const late = empty * 4 <= b.length;
|
|
365
|
+
return me * (place + moves * 11 + discs * (late ? 6 : 0));
|
|
366
|
+
}
|
|
367
|
+
/** The value of the position for `me`, who is about to move, looking `depth` moves ahead. `passed`: the other player just had no move. */
|
|
368
|
+
function search(x, me, depth, alpha, beta, passed) {
|
|
369
|
+
if (++x.nodes > x.limit) {
|
|
370
|
+
x.stopped = true;
|
|
371
|
+
return 0;
|
|
372
|
+
}
|
|
373
|
+
const { g, b } = x;
|
|
374
|
+
if (depth <= 0)
|
|
375
|
+
return judge(g, b, me);
|
|
376
|
+
let best = -Infinity;
|
|
377
|
+
if (depth >= 3) {
|
|
378
|
+
// Worth a moment to try the most promising moves first: the ones that leave the other player the fewest answers.
|
|
379
|
+
const options = [];
|
|
380
|
+
for (const cell of g.order) {
|
|
381
|
+
if (b[cell] !== 0)
|
|
382
|
+
continue;
|
|
383
|
+
const flips = playAt(g, b, cell, me);
|
|
384
|
+
if (!flips)
|
|
385
|
+
continue;
|
|
386
|
+
options.push({ cell, key: mobility(g, b, -me) * 8 - g.worth[cell] });
|
|
387
|
+
takeBack(b, cell, me, flips);
|
|
388
|
+
}
|
|
389
|
+
options.sort((p, q) => p.key - q.key);
|
|
390
|
+
// Sorting them was work too.
|
|
391
|
+
x.nodes += options.length;
|
|
392
|
+
for (const { cell } of options) {
|
|
393
|
+
const flips = playAt(g, b, cell, me);
|
|
394
|
+
const value = -search(x, -me, depth - 1, -beta, -alpha, false);
|
|
395
|
+
takeBack(b, cell, me, flips);
|
|
396
|
+
if (x.stopped)
|
|
397
|
+
return 0;
|
|
398
|
+
if (value > best)
|
|
399
|
+
best = value;
|
|
400
|
+
if (best > alpha)
|
|
401
|
+
alpha = best;
|
|
402
|
+
if (alpha >= beta)
|
|
403
|
+
return best;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
for (const cell of g.order) {
|
|
408
|
+
if (b[cell] !== 0)
|
|
409
|
+
continue;
|
|
410
|
+
const flips = playAt(g, b, cell, me);
|
|
411
|
+
if (!flips)
|
|
412
|
+
continue;
|
|
413
|
+
const value = -search(x, -me, depth - 1, -beta, -alpha, false);
|
|
414
|
+
takeBack(b, cell, me, flips);
|
|
415
|
+
if (x.stopped)
|
|
416
|
+
return 0;
|
|
417
|
+
if (value > best)
|
|
418
|
+
best = value;
|
|
419
|
+
if (best > alpha)
|
|
420
|
+
alpha = best;
|
|
421
|
+
if (alpha >= beta)
|
|
422
|
+
return best;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
if (best > -Infinity)
|
|
426
|
+
return best;
|
|
427
|
+
// No move: the game is over if the other player had none either; otherwise it's their turn again.
|
|
428
|
+
if (passed)
|
|
429
|
+
return finalValue(b, me);
|
|
430
|
+
return -search(x, -me, depth, -beta, -alpha, true);
|
|
431
|
+
}
|
|
432
|
+
/** In the opening, moves judged within this much of the best are all good enough to play. */
|
|
433
|
+
const OPENING_SLACK = 12;
|
|
434
|
+
/**
|
|
435
|
+
* The most work for one move. A unit costs about a microsecond on a 6×6 board and three on a 10×10
|
|
436
|
+
* (there is more board to look over), so this keeps the slowest move to a few dozen milliseconds at
|
|
437
|
+
* every size: the server thinks for every table on one thread.
|
|
438
|
+
*/
|
|
439
|
+
const workLimit = (n) => Math.round(800_000 / (n * n));
|
|
440
|
+
function effortFor(n, skill) {
|
|
441
|
+
const limit = workLimit(n);
|
|
442
|
+
if (skill >= 0.85)
|
|
443
|
+
return { depth: n <= 6 ? 7 : n <= 8 ? 5 : 4, exact: n <= 6 ? 12 : n <= 8 ? 11 : 10, limit };
|
|
444
|
+
if (skill >= 0.5)
|
|
445
|
+
return { depth: 3, exact: 6, limit };
|
|
446
|
+
return { depth: 1, exact: 0, limit };
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* The move the search likes best for `seat`. It looks one move further each time round, trying the
|
|
450
|
+
* best move so far first, so if the work runs out the last finished look still stands.
|
|
451
|
+
*/
|
|
452
|
+
export function bestReversiMove(cells, n, seat, effort, rand = Math.random) {
|
|
453
|
+
const g = geometryOf(n);
|
|
454
|
+
const b = Int8Array.from(cells, (d) => (d === null ? 0 : d === seat ? 1 : -1));
|
|
455
|
+
// Moves that look equally good are tried in a different order each time, so it doesn't always play the same game.
|
|
456
|
+
const keyed = legalMoves(cells, n, seat).map((cell) => ({ cell, key: g.order.indexOf(cell) + rand() * 3 }));
|
|
457
|
+
let moves = keyed.sort((p, q) => p.key - q.key).map((o) => o.cell);
|
|
458
|
+
if (moves.length <= 1)
|
|
459
|
+
return moves[0] ?? null;
|
|
460
|
+
const x = { g, b, nodes: 0, limit: effort.limit, stopped: false };
|
|
461
|
+
const empty = b.reduce((count, d) => count + (d === 0 ? 1 : 0), 0);
|
|
462
|
+
// In the first few moves there is little to choose between the good ones, so it picks any of
|
|
463
|
+
// them: otherwise two computer players would play the same game every time.
|
|
464
|
+
const opening = b.length - empty - 4 < n;
|
|
465
|
+
const look = (depth, loose = false) => {
|
|
466
|
+
let best = moves[0];
|
|
467
|
+
let alpha = -Infinity;
|
|
468
|
+
const close = [];
|
|
469
|
+
for (const cell of moves) {
|
|
470
|
+
const flips = playAt(g, b, cell, 1);
|
|
471
|
+
// Picking among near-equals needs each move's real value, not just "no better than the best".
|
|
472
|
+
const value = -search(x, -1, depth - 1, -Infinity, loose ? Infinity : -alpha, false);
|
|
473
|
+
takeBack(b, cell, 1, flips);
|
|
474
|
+
if (x.stopped)
|
|
475
|
+
return null;
|
|
476
|
+
if (loose)
|
|
477
|
+
close.push({ cell, value });
|
|
478
|
+
if (value > alpha)
|
|
479
|
+
[best, alpha] = [cell, value];
|
|
480
|
+
}
|
|
481
|
+
return loose ? pickRandom(close.filter((o) => o.value >= alpha - OPENING_SLACK), rand).cell : best;
|
|
482
|
+
};
|
|
483
|
+
let best = moves[0];
|
|
484
|
+
// (And it needn't look far to do that.)
|
|
485
|
+
const deepest = Math.min(opening ? Math.min(effort.depth, 3) : effort.depth, empty);
|
|
486
|
+
for (let depth = 1; depth <= deepest; depth++) {
|
|
487
|
+
const found = look(depth, opening && depth === deepest);
|
|
488
|
+
if (found === null)
|
|
489
|
+
return best;
|
|
490
|
+
best = found;
|
|
491
|
+
moves = [best, ...moves.filter((cell) => cell !== best)];
|
|
492
|
+
}
|
|
493
|
+
// Near the end, play it out to the last disc.
|
|
494
|
+
if (empty <= effort.exact && empty > effort.depth)
|
|
495
|
+
best = look(empty + 1) ?? best;
|
|
496
|
+
return best;
|
|
497
|
+
}
|
|
498
|
+
function bot(s, seat, style, rand = Math.random) {
|
|
499
|
+
if (s.phase === "scored")
|
|
500
|
+
return s.ready[seat] ? null : { type: "next" };
|
|
501
|
+
if (s.phase !== "playing" || s.turn !== seat)
|
|
502
|
+
return null;
|
|
503
|
+
const n = s.rules.size;
|
|
504
|
+
if (careless(style, rand))
|
|
505
|
+
return { type: "place", cell: pickRandom(legalMoves(s.cells, n, seat), rand) };
|
|
506
|
+
return { type: "place", cell: bestReversiMove(s.cells, n, seat, effortFor(n, style.skill ?? 1), rand) };
|
|
507
|
+
}
|
|
508
|
+
// ---- The game -----------------------------------------------------------------------------------
|
|
509
|
+
function normalize(rules) {
|
|
510
|
+
const given = (rules && typeof rules === "object" ? rules : {});
|
|
511
|
+
const base = PRESETS.find((p) => p.id === given.id) ?? classicReversi;
|
|
512
|
+
const r = { ...base, ...given };
|
|
513
|
+
return {
|
|
514
|
+
id: String(r.id),
|
|
515
|
+
name: String(r.name),
|
|
516
|
+
size: SIZES.includes(Number(r.size)) ? Number(r.size) : 8,
|
|
517
|
+
first: r.first === "seat1" || r.first === "seat2" ? r.first : "random",
|
|
518
|
+
hints: r.hints !== false,
|
|
519
|
+
games: [1, 3, 5, 7].includes(Number(r.games)) ? Number(r.games) : 1,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
const rules = {
|
|
523
|
+
id: "reversi",
|
|
524
|
+
name: "Reversi",
|
|
525
|
+
emoji: "⚫",
|
|
526
|
+
blurb: "Trap their discs and flip them to yours",
|
|
527
|
+
tagline: "Dark against light: trap a line of their discs between two of yours and they all turn over. Most discs at the end wins.",
|
|
528
|
+
seats: { min: 2, max: 2, default: 2 },
|
|
529
|
+
teams: false,
|
|
530
|
+
presets: PRESETS,
|
|
531
|
+
fields: [
|
|
532
|
+
{ key: "size", label: "Board size", kind: "choice", options: SIZES.map((n) => [n, `${n}×${n}`]) },
|
|
533
|
+
{ key: "first", label: "Who plays dark and goes first", kind: "choice", options: [["random", "Luck of the draw"], ["seat1", "The first seat"], ["seat2", "The second seat"]] },
|
|
534
|
+
{ key: "hints", label: "Show where you can move", hint: "Off is the purist's game: tap any empty square, and a move that flips nothing is refused.", kind: "toggle" },
|
|
535
|
+
{ key: "games", label: "Games in a match", kind: "choice", options: [[1, "Just one"], [3, "Three"], [5, "Five"], [7, "Seven"]] },
|
|
536
|
+
],
|
|
537
|
+
normalize,
|
|
538
|
+
validate: () => [],
|
|
539
|
+
describe(r) {
|
|
540
|
+
return [
|
|
541
|
+
`Dark and light take turns putting a disc on a ${r.size}×${r.size} board, starting from four in the middle.`,
|
|
542
|
+
"Your disc has to trap a straight line of their discs between it and another of yours: across, down or on a slant. Every disc trapped flips to your colour, in every direction at once.",
|
|
543
|
+
"If you have no move, your turn is passed. When neither of you can move, whoever has the most discs wins; the same number is a draw.",
|
|
544
|
+
r.first === "random" ? "Dark goes first; who gets to be dark is the luck of the draw." : `Dark goes first, and the ${r.first === "seat1" ? "first" : "second"} seat is dark.`,
|
|
545
|
+
r.hints ? "The squares you can move to are marked." : "The squares you can move to aren't marked: you find them yourself.",
|
|
546
|
+
...(r.games > 1 ? [`A match is ${r.games} games; most wins takes it. Players take turns playing dark.`] : []),
|
|
547
|
+
];
|
|
548
|
+
},
|
|
549
|
+
newGame: newReversi,
|
|
550
|
+
apply,
|
|
551
|
+
view,
|
|
552
|
+
bot,
|
|
553
|
+
// A search: off the table's main thread (see TableGame.heavy).
|
|
554
|
+
heavy: (s, seat) => s.phase === "playing" && s.turn === seat,
|
|
555
|
+
thinkingTime: (s) => thinkFor(Math.min(s.phase === "playing" ? legalMoves(s.cells, s.rules.size, s.turn).length : 0, 6), s.last === null ? 0.7 : 1),
|
|
556
|
+
summary(s) {
|
|
557
|
+
const over = s.phase === "finished";
|
|
558
|
+
const [a, b] = discCount(s.cells);
|
|
559
|
+
return {
|
|
560
|
+
game: "reversi",
|
|
561
|
+
rules: s.rules.name,
|
|
562
|
+
phase: s.phase,
|
|
563
|
+
over,
|
|
564
|
+
hand: s.round,
|
|
565
|
+
// One game is told in discs, a match in games won.
|
|
566
|
+
scoreLine: s.rules.games > 1 ? `${s.wins[0]} to ${s.wins[1]}${s.draws ? ` · ${s.draws} drawn` : ""}` : `${a} to ${b}`,
|
|
567
|
+
order: over ? order(s) : null,
|
|
568
|
+
winners: over ? winners(s) : null,
|
|
569
|
+
teams: false,
|
|
570
|
+
seats: s.seats,
|
|
571
|
+
};
|
|
572
|
+
},
|
|
573
|
+
};
|
|
574
|
+
/** Reversi, with resigning, draw offers and taking a move back (see offers.ts). */
|
|
575
|
+
export const reversi = withOffers(rules, {
|
|
576
|
+
takeBack: true,
|
|
577
|
+
settle: settleMatch,
|
|
578
|
+
// Discs on the board. (Early on that says little, but a computer player that is behind on discs late is behind.)
|
|
579
|
+
standing(s, seat) {
|
|
580
|
+
const discs = discCount(s.cells);
|
|
581
|
+
return discs[seat] - discs[other(seat)];
|
|
582
|
+
},
|
|
583
|
+
});
|
|
584
|
+
//# sourceMappingURL=reversi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reversi.js","sourceRoot":"","sources":["../src/reversi.ts"],"names":[],"mappings":"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"}
|