@oathompsonjones/mini-games 1.0.14 → 1.0.16
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/build/base/board.d.ts +11 -8
- package/build/base/board.js +27 -52
- package/build/base/controller.d.ts +4 -16
- package/build/base/controller.js +12 -44
- package/build/bitBoard/intBitBoard.js +4 -7
- package/build/bitBoard/longInt.js +89 -59
- package/build/bitBoard/longIntBitBoard.js +4 -11
- package/build/games/connect4/board.d.ts +14 -1
- package/build/games/connect4/board.js +100 -35
- package/build/games/connect4/controller.d.ts +5 -8
- package/build/games/connect4/controller.js +10 -14
- package/build/games/tictactoe/board.js +3 -3
- package/build/games/tictactoe/controller.d.ts +4 -7
- package/build/games/tictactoe/controller.js +7 -10
- package/build/index.d.ts +1 -1
- package/build/index.js +1 -1
- package/package.json +1 -1
|
@@ -4,6 +4,12 @@ import LongIntBitBoard from "../../bitBoard/longIntBitBoard.js";
|
|
|
4
4
|
/** Represents a Connect 4 board. */
|
|
5
5
|
export default class Board extends Base {
|
|
6
6
|
winningStates = [];
|
|
7
|
+
/**
|
|
8
|
+
* Tracks the next available row index per column (row 5 = bottom, row 0 = top).
|
|
9
|
+
* A value of -1 means the column is full.
|
|
10
|
+
* Maintained incrementally so makeMove and emptyCells are O(1).
|
|
11
|
+
*/
|
|
12
|
+
heights = [5, 5, 5, 5, 5, 5, 5];
|
|
7
13
|
FULL_BOARD = new LongInt([0b1111_1111111_1111111_1111111_1111111, 0b1111111_111]);
|
|
8
14
|
HORIZONTAL = new LongInt([0b0000_0000000_0000000_0000000_0001111, 0b0000000_000]);
|
|
9
15
|
VERTICAL = new LongInt([0b0000_0000001_0000001_0000001_0000001, 0b0000000_000]);
|
|
@@ -45,59 +51,118 @@ export default class Board extends Base {
|
|
|
45
51
|
* Calculates the heuristic score for the current board state.
|
|
46
52
|
* @returns The heuristic score.
|
|
47
53
|
*/
|
|
54
|
+
// eslint-disable-next-line max-statements
|
|
48
55
|
get heuristic() {
|
|
49
56
|
const { winner } = this;
|
|
50
57
|
if (winner === 0)
|
|
51
|
-
return
|
|
58
|
+
return 10000 - this.moves.length;
|
|
52
59
|
if (winner === 1)
|
|
53
|
-
return -
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
60
|
+
return -(10000 - this.moves.length);
|
|
61
|
+
let p0Score = 0;
|
|
62
|
+
let p1Score = 0;
|
|
63
|
+
// Horizontal →
|
|
64
|
+
for (let y = 0; y < this.height; y++) {
|
|
65
|
+
for (let x = 0; x < this.width - 3; x++) {
|
|
66
|
+
const window = [
|
|
67
|
+
this.cellOccupier({ x, y }),
|
|
68
|
+
this.cellOccupier({ x: x + 1, y }),
|
|
69
|
+
this.cellOccupier({ x: x + 2, y }),
|
|
70
|
+
this.cellOccupier({ x: x + 3, y }),
|
|
71
|
+
];
|
|
72
|
+
const p0Count = window.filter((occupier) => occupier === 0).length;
|
|
73
|
+
const p1Count = window.filter((occupier) => occupier === 1).length;
|
|
74
|
+
if (p0Count > 0 && p1Count === 0)
|
|
75
|
+
p0Score += [0, 1, 10, 100][p0Count];
|
|
76
|
+
else if (p1Count > 0 && p0Count === 0)
|
|
77
|
+
p1Score += [0, 1, 10, 100][p1Count];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Vertical ↓
|
|
81
|
+
for (let x = 0; x < this.width; x++) {
|
|
82
|
+
for (let y = 0; y < this.height - 3; y++) {
|
|
83
|
+
const window = [
|
|
84
|
+
this.cellOccupier({ x, y }),
|
|
85
|
+
this.cellOccupier({ x, y: y + 1 }),
|
|
86
|
+
this.cellOccupier({ x, y: y + 2 }),
|
|
87
|
+
this.cellOccupier({ x, y: y + 3 }),
|
|
88
|
+
];
|
|
89
|
+
const p0Count = window.filter((occupier) => occupier === 0).length;
|
|
90
|
+
const p1Count = window.filter((occupier) => occupier === 1).length;
|
|
91
|
+
if (p0Count > 0 && p1Count === 0)
|
|
92
|
+
p0Score += [0, 1, 10, 100][p0Count];
|
|
93
|
+
else if (p1Count > 0 && p0Count === 0)
|
|
94
|
+
p1Score += [0, 1, 10, 100][p1Count];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Diagonal ↘
|
|
98
|
+
for (let x = 0; x < this.width - 3; x++) {
|
|
99
|
+
for (let y = 0; y < this.height - 3; y++) {
|
|
100
|
+
const window = [
|
|
101
|
+
this.cellOccupier({ x, y }),
|
|
102
|
+
this.cellOccupier({ x: x + 1, y: y + 1 }),
|
|
103
|
+
this.cellOccupier({ x: x + 2, y: y + 2 }),
|
|
104
|
+
this.cellOccupier({ x: x + 3, y: y + 3 }),
|
|
105
|
+
];
|
|
106
|
+
const p0Count = window.filter((occupier) => occupier === 0).length;
|
|
107
|
+
const p1Count = window.filter((occupier) => occupier === 1).length;
|
|
108
|
+
if (p0Count > 0 && p1Count === 0)
|
|
109
|
+
p0Score += [0, 1, 10, 100][p0Count];
|
|
110
|
+
else if (p1Count > 0 && p0Count === 0)
|
|
111
|
+
p1Score += [0, 1, 10, 100][p1Count];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Diagonal ↗
|
|
115
|
+
for (let x = 0; x < this.width - 3; x++) {
|
|
116
|
+
for (let y = 3; y < this.height; y++) {
|
|
117
|
+
const window = [
|
|
118
|
+
this.cellOccupier({ x, y }),
|
|
119
|
+
this.cellOccupier({ x: x + 1, y: y - 1 }),
|
|
120
|
+
this.cellOccupier({ x: x + 2, y: y - 2 }),
|
|
121
|
+
this.cellOccupier({ x: x + 3, y: y - 3 }),
|
|
122
|
+
];
|
|
123
|
+
const p0Count = window.filter((occupier) => occupier === 0).length;
|
|
124
|
+
const p1Count = window.filter((occupier) => occupier === 1).length;
|
|
125
|
+
if (p0Count > 0 && p1Count === 0)
|
|
126
|
+
p0Score += [0, 1, 10, 100][p0Count];
|
|
127
|
+
else if (p1Count > 0 && p0Count === 0)
|
|
128
|
+
p1Score += [0, 1, 10, 100][p1Count];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return p1Score - p0Score;
|
|
73
132
|
}
|
|
74
133
|
/**
|
|
75
|
-
* Generates a list of
|
|
134
|
+
* Generates a list of available column moves ordered centre-first so that
|
|
135
|
+
* alpha-beta pruning encounters the strongest moves earliest.
|
|
136
|
+
* Uses the incremental heights array — O(width), no bitboard reads.
|
|
76
137
|
* @returns The list of empty cells.
|
|
77
138
|
*/
|
|
78
139
|
get emptyCells() {
|
|
79
140
|
const emptyCells = [];
|
|
80
|
-
for (
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
emptyCells.push(cell);
|
|
141
|
+
for (const x of [3, 2, 4, 1, 5, 0, 6]) {
|
|
142
|
+
if (this.heights[x] >= 0)
|
|
143
|
+
emptyCells.push({ x, y: 0 });
|
|
84
144
|
}
|
|
85
145
|
return emptyCells;
|
|
86
146
|
}
|
|
87
147
|
/**
|
|
88
148
|
* Makes a move on the board.
|
|
149
|
+
* Uses the heights array for O(1) row resolution instead of scanning the column.
|
|
89
150
|
* @param move - The move to make.
|
|
90
151
|
* @param playerId - The player making the move.
|
|
91
152
|
*/
|
|
92
153
|
makeMove(move, playerId) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
154
|
+
move.y = this.heights[move.x];
|
|
155
|
+
this.heights[move.x]--;
|
|
156
|
+
super.makeMove(move, playerId);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Reverses the last move and restores the column height.
|
|
160
|
+
*/
|
|
161
|
+
undoLastMove() {
|
|
162
|
+
// X-coordinate is recoverable from the bit index: bit % width = x.
|
|
163
|
+
const x = this.moves[this.moves.length - 1] % this.width;
|
|
164
|
+
super.undoLastMove();
|
|
165
|
+
this.heights[x]++;
|
|
101
166
|
}
|
|
102
167
|
}
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLElBQWE7SUFDbEMsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFL0IsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWxGLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFaEYsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRXhGLG9CQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUU3RyxvQ0FBb0M7SUFDcEM7UUFDSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFl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RCxPQUFPLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQW9CLFVBQVU7UUFDMUIsTUFBTSxVQUFVLEdBQWUsRUFBRSxDQUFDO1FBRWxDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBRW5DLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJO2dCQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNhLFFBQVEsQ0FBQyxJQUFjLEVBQUUsUUFBZ0I7UUFDckQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ1gsTUFBTTtZQUNWLENBQUM7UUFDTCxDQUFDO1FBQ0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcbmltcG9ydCBMb25nSW50IGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgTG9uZ0ludEJpdEJvYXJkIGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKiogUmVwcmVzZW50cyBhIENvbm5lY3QgNCBib2FyZC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvYXJkIGV4dGVuZHMgQmFzZTxMb25nSW50PiB7XG4gICAgcHJvdGVjdGVkIHdpbm5pbmdTdGF0ZXM6IExvbmdJbnRCaXRCb2FyZFtdID0gW107XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IEZVTExfQk9BUkQgPSBuZXcgTG9uZ0ludChbMGIxMTExXzExMTExMTFfMTExMTExMV8xMTExMTExXzExMTExMTEsIDBiMTExMTExMV8xMTFdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgSE9SSVpPTlRBTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMDAwMF8wMDAwMDAwXzAwMDAwMDBfMDAwMTExMSwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBWRVJUSUNBTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMDAwMV8wMDAwMDAxXzAwMDAwMDFfMDAwMDAwMSwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBMRUFESU5HX0RJQUdPTkFMID0gbmV3IExvbmdJbnQoWzBiMDAwMF8wMDAxMDAwXzAwMDAxMDBfMDAwMDAxMF8wMDAwMDAxLCAwYjAwMDAwMDBfMDAwXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IE5PTl9MRUFESU5HX0RJQUdPTkFMID0gbmV3IExvbmdJbnQoWzBiMDAwMF8wMDAwMDAxXzAwMDAwMTBfMDAwMDEwMF8wMDAxMDAwLCAwYjAwMDAwMDBfMDAwXSk7XG5cbiAgICAvKiogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCb2FyZC4gKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDcsIDYpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA2OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbm5pbmdTdGF0ZXMucHVzaChuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnRcbiAgICAgICAgICAgICAgICAgICAgLmxlZnRTaGlmdCh0aGlzLkhPUklaT05UQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5WRVJUSUNBTCwgaSArIDcgKiBqKVxuICAgICAgICAgICAgICAgICAgICAuYW5kKHRoaXMuRlVMTF9CT0FSRCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbm5pbmdTdGF0ZXMucHVzaChuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnRcbiAgICAgICAgICAgICAgICAgICAgLmxlZnRTaGlmdCh0aGlzLkxFQURJTkdfRElBR09OQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5OT05fTEVBRElOR19ESUFHT05BTCwgaSArIDcgKiBqKVxuICAgICAgICAgICAgICAgICAgICAuYW5kKHRoaXMuRlVMTF9CT0FSRCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuXG4gICAgICogQHJldHVybnMgVGhlIGhldXJpc3RpYyBzY29yZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhldXJpc3RpYygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcztcblxuICAgICAgICBpZiAod2lubmVyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDEwMDA7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiAtMTAwMDtcblxuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlTm9HYXBzID0gdGhpcy5oYXNMaW5lKDAsIDMpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlTm9HYXBzID0gdGhpcy5oYXNMaW5lKDEsIDMpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlT25lR2FwID0gdGhpcy5oYXNMaW5lKDAsIDMsIDEpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlT25lR2FwID0gdGhpcy5oYXNMaW5lKDEsIDMsIDEpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlVHdvR2FwcyA9IHRoaXMuaGFzTGluZSgwLCAzLCAyKTtcbiAgICAgICAgY29uc3QgcDFMaW5lT2ZUaHJlZVR3b0dhcHMgPSB0aGlzLmhhc0xpbmUoMSwgMywgMik7XG4gICAgICAgIGNvbnN0IHAwTGluZU9mVHdvTm9HYXBzID0gdGhpcy5oYXNMaW5lKDAsIDIpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlR3b05vR2FwcyA9IHRoaXMuaGFzTGluZSgxLCAyKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUd29PbmVHYXAgPSB0aGlzLmhhc0xpbmUoMCwgMiwgMSk7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvT25lR2FwID0gdGhpcy5oYXNMaW5lKDEsIDIsIDEpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlR3b1R3b0dhcHMgPSB0aGlzLmhhc0xpbmUoMCwgMiwgMik7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvVHdvR2FwcyA9IHRoaXMuaGFzTGluZSgxLCAyLCAyKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUaHJlZVNjb3JlID0gMyAqIHAwTGluZU9mVGhyZWVOb0dhcHMgKyAyICogcDBMaW5lT2ZUaHJlZU9uZUdhcCArIHAwTGluZU9mVGhyZWVUd29HYXBzO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlU2NvcmUgPSAzICogcDFMaW5lT2ZUaHJlZU5vR2FwcyArIDIgKiBwMUxpbmVPZlRocmVlT25lR2FwICsgcDFMaW5lT2ZUaHJlZVR3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAwTGluZU9mVHdvU2NvcmUgPSAzICogcDBMaW5lT2ZUd29Ob0dhcHMgKyAyICogcDBMaW5lT2ZUd29PbmVHYXAgKyBwMExpbmVPZlR3b1R3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvU2NvcmUgPSAzICogcDFMaW5lT2ZUd29Ob0dhcHMgKyAyICogcDFMaW5lT2ZUd29PbmVHYXAgKyBwMUxpbmVPZlR3b1R3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAwU2NvcmUgPSAxMCAqIHAwTGluZU9mVGhyZWVTY29yZSArIHAwTGluZU9mVHdvU2NvcmU7XG4gICAgICAgIGNvbnN0IHAxU2NvcmUgPSAxMCAqIHAxTGluZU9mVGhyZWVTY29yZSArIHAxTGluZU9mVHdvU2NvcmU7XG5cbiAgICAgICAgcmV0dXJuIHAwU2NvcmUgLSBwMVNjb3JlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGxpc3Qgb2YgZW1wdHkgY2VsbHMuXG4gICAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgZW1wdHkgY2VsbHMuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBlbXB0eUNlbGxzKCk6IFBvc2l0aW9uW10ge1xuICAgICAgICBjb25zdCBlbXB0eUNlbGxzOiBQb3NpdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGw6IFBvc2l0aW9uID0geyB4LCB5OiAwIH07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNlbGxPY2N1cGllcihjZWxsKSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goY2VsbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW1wdHlDZWxscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIG1vdmUgb24gdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSBtb3ZlIC0gVGhlIG1vdmUgdG8gbWFrZS5cbiAgICAgKiBAcGFyYW0gcGxheWVySWQgLSBUaGUgcGxheWVyIG1ha2luZyB0aGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbWFrZU1vdmUobW92ZTogUG9zaXRpb24sIHBsYXllcklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZE1vdmUgPSBtb3ZlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSA1OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogbW92ZS54LCB5OiBpIH0pID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbW92ZS55ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdXBlci5tYWtlTW92ZSh1cGRhdGVkTW92ZSwgcGxheWVySWQpO1xuICAgIH1cbn1cbiJdfQ==
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLElBQWE7SUFDbEMsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFaEQ7Ozs7T0FJRztJQUNjLE9BQU8sR0FBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFbEYsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWhGLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUV4RixvQkFBb0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0csb0NBQW9DO0lBQ3BDO1FBQ0ksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QixLQUFLLElB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LFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ2EsWUFBWTtRQUN4QixtRUFBbUU7UUFDbkUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTFELEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBRSxFQUFFLENBQUM7SUFDdkIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcbmltcG9ydCBMb25nSW50IGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgTG9uZ0ludEJpdEJvYXJkIGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKiogUmVwcmVzZW50cyBhIENvbm5lY3QgNCBib2FyZC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvYXJkIGV4dGVuZHMgQmFzZTxMb25nSW50PiB7XG4gICAgcHJvdGVjdGVkIHdpbm5pbmdTdGF0ZXM6IExvbmdJbnRCaXRCb2FyZFtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBUcmFja3MgdGhlIG5leHQgYXZhaWxhYmxlIHJvdyBpbmRleCBwZXIgY29sdW1uIChyb3cgNSA9IGJvdHRvbSwgcm93IDAgPSB0b3ApLlxuICAgICAqIEEgdmFsdWUgb2YgLTEgbWVhbnMgdGhlIGNvbHVtbiBpcyBmdWxsLlxuICAgICAqIE1haW50YWluZWQgaW5jcmVtZW50YWxseSBzbyBtYWtlTW92ZSBhbmQgZW1wdHlDZWxscyBhcmUgTygxKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlaWdodHM6IG51bWJlcltdID0gWzUsIDUsIDUsIDUsIDUsIDUsIDVdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBGVUxMX0JPQVJEID0gbmV3IExvbmdJbnQoWzBiMTExMV8xMTExMTExXzExMTExMTFfMTExMTExMV8xMTExMTExLCAwYjExMTExMTFfMTExXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IEhPUklaT05UQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDBfMDAwMDAwMF8wMDAwMDAwXzAwMDExMTEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgVkVSVElDQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDFfMDAwMDAwMV8wMDAwMDAxXzAwMDAwMDEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMTAwMF8wMDAwMTAwXzAwMDAwMTBfMDAwMDAwMSwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBOT05fTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMDAwMV8wMDAwMDEwXzAwMDAxMDBfMDAwMTAwMCwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgLyoqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcig3LCA2KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNjsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5IT1JJWk9OVEFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuVkVSVElDQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5MRUFESU5HX0RJQUdPTkFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuTk9OX0xFQURJTkdfRElBR09OQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBoZXVyaXN0aWMgc2NvcmUgZm9yIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBoZXVyaXN0aWMgc2NvcmUuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gICAgcHVibGljIGdldCBoZXVyaXN0aWMoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgeyB3aW5uZXIgfSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAxMDAwMCAtIHRoaXMubW92ZXMubGVuZ3RoO1xuXG4gICAgICAgIGlmICh3aW5uZXIgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gLSgxMDAwMCAtIHRoaXMubW92ZXMubGVuZ3RoKTtcblxuICAgICAgICBsZXQgcDBTY29yZSA9IDA7XG4gICAgICAgIGxldCBwMVNjb3JlID0gMDtcblxuICAgICAgICAvLyBIb3Jpem9udGFsIOKGklxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aCAtIDM7IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAxLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAyLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAzLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwMENvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcDFDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHAwQ291bnQgPiAwICYmIHAxQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAwU2NvcmUgKz0gWzAsIDEsIDEwLCAxMDBdW3AwQ291bnRdITtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwMUNvdW50ID4gMCAmJiBwMENvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMVNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMUNvdW50XSE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJ0aWNhbCDihpNcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQgLSAzOyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMiB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMyB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBbMCwgMSwgMTAsIDEwMF1bcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlhZ29uYWwg4oaYXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aCAtIDM7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLmhlaWdodCAtIDM7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAxLCB5OiB5ICsgMSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMiwgeTogeSArIDIgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDMsIHk6IHkgKyAzIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwMENvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcDFDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHAwQ291bnQgPiAwICYmIHAxQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAwU2NvcmUgKz0gWzAsIDEsIDEwLCAxMDBdW3AwQ291bnRdITtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwMUNvdW50ID4gMCAmJiBwMENvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMVNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMUNvdW50XSE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaWFnb25hbCDihpdcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoIC0gMzsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMzsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMSwgeTogeSAtIDEgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDIsIHk6IHkgLSAyIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAzLCB5OiB5IC0gMyB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBbMCwgMSwgMTAsIDEwMF1bcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHAxU2NvcmUgLSBwMFNjb3JlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbHVtbiBtb3ZlcyBvcmRlcmVkIGNlbnRyZS1maXJzdCBzbyB0aGF0XG4gICAgICogYWxwaGEtYmV0YSBwcnVuaW5nIGVuY291bnRlcnMgdGhlIHN0cm9uZ2VzdCBtb3ZlcyBlYXJsaWVzdC5cbiAgICAgKiBVc2VzIHRoZSBpbmNyZW1lbnRhbCBoZWlnaHRzIGFycmF5IOKAlCBPKHdpZHRoKSwgbm8gYml0Ym9hcmQgcmVhZHMuXG4gICAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgZW1wdHkgY2VsbHMuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBlbXB0eUNlbGxzKCk6IFBvc2l0aW9uW10ge1xuICAgICAgICBjb25zdCBlbXB0eUNlbGxzOiBQb3NpdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB4IG9mIFszLCAyLCA0LCAxLCA1LCAwLCA2XSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVpZ2h0c1t4XSEgPj0gMClcbiAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goeyB4LCB5OiAwIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlIG9uIHRoZSBib2FyZC5cbiAgICAgKiBVc2VzIHRoZSBoZWlnaHRzIGFycmF5IGZvciBPKDEpIHJvdyByZXNvbHV0aW9uIGluc3RlYWQgb2Ygc2Nhbm5pbmcgdGhlIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0gbW92ZSAtIFRoZSBtb3ZlIHRvIG1ha2UuXG4gICAgICogQHBhcmFtIHBsYXllcklkIC0gVGhlIHBsYXllciBtYWtpbmcgdGhlIG1vdmUuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIG1ha2VNb3ZlKG1vdmU6IFBvc2l0aW9uLCBwbGF5ZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIG1vdmUueSA9IHRoaXMuaGVpZ2h0c1ttb3ZlLnhdITtcbiAgICAgICAgdGhpcy5oZWlnaHRzW21vdmUueF0hLS07XG4gICAgICAgIHN1cGVyLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyB0aGUgbGFzdCBtb3ZlIGFuZCByZXN0b3JlcyB0aGUgY29sdW1uIGhlaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgdW5kb0xhc3RNb3ZlKCk6IHZvaWQge1xuICAgICAgICAvLyBYLWNvb3JkaW5hdGUgaXMgcmVjb3ZlcmFibGUgZnJvbSB0aGUgYml0IGluZGV4OiBiaXQgJSB3aWR0aCA9IHguXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLm1vdmVzW3RoaXMubW92ZXMubGVuZ3RoIC0gMV0hICUgdGhpcy53aWR0aDtcblxuICAgICAgICBzdXBlci51bmRvTGFzdE1vdmUoKTtcbiAgICAgICAgdGhpcy5oZWlnaHRzW3hdISsrO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import Base from "../../base/controller.js";
|
|
2
|
+
import type { GameConstructorOptions, PlayerType } from "../../base/controller.js";
|
|
3
3
|
import Board from "./board.js";
|
|
4
4
|
import type { Position } from "../../base/board.js";
|
|
5
5
|
/** Represents the controller for connect 4. */
|
|
@@ -14,21 +14,18 @@ export default class Connect4 extends Base<Board> {
|
|
|
14
14
|
/**
|
|
15
15
|
* Calculates the CPU's move.
|
|
16
16
|
* @param difficulty - The difficulty of the CPU.
|
|
17
|
-
* @param algorithm - The algorithm to use.
|
|
18
17
|
* @returns The CPU's move.
|
|
19
18
|
* @throws {Error} An error if the difficulty is invalid.
|
|
20
19
|
*/
|
|
21
|
-
determineCPUMove(difficulty: Omit<PlayerType, "human"
|
|
20
|
+
determineCPUMove(difficulty: Omit<PlayerType, "human">): Position;
|
|
22
21
|
/**
|
|
23
22
|
* Finds the optimal move for the current board state.
|
|
24
23
|
* @param options - The options for the algorithm.
|
|
25
|
-
* @param options.algorithm - The algorithm to use.
|
|
26
24
|
* @param options.maxDepth - The maximum depth to search.
|
|
27
25
|
* @returns The optimal move for the current board state.
|
|
28
26
|
* @throws {Error} An error if the algorithm is invalid.
|
|
29
27
|
*/
|
|
30
|
-
findOptimalMove(
|
|
31
|
-
|
|
32
|
-
maxDepth?: number;
|
|
28
|
+
findOptimalMove({ maxDepth }?: {
|
|
29
|
+
maxDepth: number;
|
|
33
30
|
}): Position;
|
|
34
31
|
}
|
|
@@ -13,7 +13,7 @@ import Board from "./board.js";
|
|
|
13
13
|
function defaultRender(controller) {
|
|
14
14
|
/* eslint-disable no-console */
|
|
15
15
|
console.clear();
|
|
16
|
-
console.log(controller.board.toString(true, true, false, ["⬤", "⬤"]));
|
|
16
|
+
console.log(controller.board.toString(true, true, false, ["⬤ ", "⬤ "]));
|
|
17
17
|
const { winner } = controller.board;
|
|
18
18
|
if (winner !== false)
|
|
19
19
|
console.log(winner === null ? "It's a tie!" : `Player ${winner + 1} wins!`);
|
|
@@ -33,20 +33,19 @@ let Connect4 = class Connect4 extends Base {
|
|
|
33
33
|
/**
|
|
34
34
|
* Calculates the CPU's move.
|
|
35
35
|
* @param difficulty - The difficulty of the CPU.
|
|
36
|
-
* @param algorithm - The algorithm to use.
|
|
37
36
|
* @returns The CPU's move.
|
|
38
37
|
* @throws {Error} An error if the difficulty is invalid.
|
|
39
38
|
*/
|
|
40
|
-
determineCPUMove(difficulty
|
|
39
|
+
determineCPUMove(difficulty) {
|
|
41
40
|
const { emptyCells } = this.board;
|
|
42
41
|
const randomMove = emptyCells[Math.floor(Math.random() * emptyCells.length)];
|
|
43
42
|
switch (difficulty) {
|
|
44
43
|
case "impossibleCPU":
|
|
45
|
-
return this.findOptimalMove({
|
|
44
|
+
return this.findOptimalMove({ maxDepth: 10 });
|
|
46
45
|
case "hardCPU":
|
|
47
|
-
return this.findOptimalMove({
|
|
46
|
+
return this.findOptimalMove({ maxDepth: 7 });
|
|
48
47
|
case "mediumCPU":
|
|
49
|
-
return this.findOptimalMove({
|
|
48
|
+
return this.findOptimalMove({ maxDepth: 5 });
|
|
50
49
|
case "easyCPU":
|
|
51
50
|
return randomMove;
|
|
52
51
|
default:
|
|
@@ -56,21 +55,18 @@ let Connect4 = class Connect4 extends Base {
|
|
|
56
55
|
/**
|
|
57
56
|
* Finds the optimal move for the current board state.
|
|
58
57
|
* @param options - The options for the algorithm.
|
|
59
|
-
* @param options.algorithm - The algorithm to use.
|
|
60
58
|
* @param options.maxDepth - The maximum depth to search.
|
|
61
59
|
* @returns The optimal move for the current board state.
|
|
62
60
|
* @throws {Error} An error if the algorithm is invalid.
|
|
63
61
|
*/
|
|
64
|
-
findOptimalMove(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const minimax = this[algorithm](maxDepth);
|
|
69
|
-
return minimax.move;
|
|
62
|
+
findOptimalMove({ maxDepth } = { maxDepth: Infinity }) {
|
|
63
|
+
return this.board.isEmpty
|
|
64
|
+
? { x: 3, y: 5 }
|
|
65
|
+
: this.alphabeta(maxDepth).move;
|
|
70
66
|
}
|
|
71
67
|
};
|
|
72
68
|
Connect4 = __decorate([
|
|
73
69
|
Game
|
|
74
70
|
], Connect4);
|
|
75
71
|
export default Connect4;
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdEQsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRy9COzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLFVBQW9CO0lBQ3ZDLCtCQUErQjtJQUMvQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFFcEMsSUFBSSxNQUFNLEtBQUssS0FBSztRQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRiw4QkFBOEI7QUFDbEMsQ0FBQztBQUVELCtDQUErQztBQUVoQyxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxJQUFXO0lBQzdDOzs7OztPQUtHO0lBQ0gsWUFDSSxhQUF5QixFQUN6QixhQUF5QixFQUN6QixPQUF1QztRQUV2QyxLQUFLLENBQ0QsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQzlCLElBQUksS0FBSyxFQUFFLEVBQ1gsT0FBTyxFQUFFLFFBQVEsSUFBSSxhQUFhLEVBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQ2QsT0FBTyxFQUFFLGNBQWMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdCQUFnQixDQUFDLFVBQXFDO1FBQ3pELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQztRQUU5RSxRQUFRLFVBQVUsRUFBRSxDQUFDO1lBQ2pCLEtBQUssZUFBZTtnQkFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEQsS0FBSyxTQUFTO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRCxLQUFLLFNBQVM7Z0JBQ1YsT0FBTyxVQUFVLENBQUM7WUFDdEI7Z0JBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZSxDQUFDLEVBQUUsUUFBUSxLQUE0QixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7UUFDL0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4QyxDQUFDO0NBQ0osQ0FBQTtBQXpEb0IsUUFBUTtJQUQ1QixJQUFJO0dBQ2dCLFFBQVEsQ0F5RDVCO2VBekRvQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UsIHsgR2FtZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcmVuZGVyZXIgZm9yIGNvbm5lY3QgNC5cbiAqIEBwYXJhbSBjb250cm9sbGVyIC0gVGhlIGNvbnRyb2xsZXIgdG8gcmVuZGVyLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyKGNvbnRyb2xsZXI6IENvbm5lY3Q0KTogdm9pZCB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUuY2xlYXIoKTtcbiAgICBjb25zb2xlLmxvZyhjb250cm9sbGVyLmJvYXJkLnRvU3RyaW5nKHRydWUsIHRydWUsIGZhbHNlLCBbXCLirKQgXCIsIFwi4qykIFwiXSkpO1xuICAgIGNvbnN0IHsgd2lubmVyIH0gPSBjb250cm9sbGVyLmJvYXJkO1xuXG4gICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpXG4gICAgICAgIGNvbnNvbGUubG9nKHdpbm5lciA9PT0gbnVsbCA/IFwiSXQncyBhIHRpZSFcIiA6IGBQbGF5ZXIgJHt3aW5uZXIgKyAxfSB3aW5zIWApO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xufVxuXG4vKiogUmVwcmVzZW50cyB0aGUgY29udHJvbGxlciBmb3IgY29ubmVjdCA0LiAqL1xuQEdhbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbm5lY3Q0IGV4dGVuZHMgQmFzZTxCb2FyZD4ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29ubmVjdDQuXG4gICAgICogQHBhcmFtIHBsYXllck9uZVR5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgb25lIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUd29UeXBlIC0gVGhlIHR5cGUgb2YgcGxheWVyIHR3byAoaHVtYW4gb3IgQ1BVKS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ2FtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPEJvYXJkPixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBbcGxheWVyT25lVHlwZSwgcGxheWVyVHdvVHlwZV0sXG4gICAgICAgICAgICBuZXcgQm9hcmQoKSxcbiAgICAgICAgICAgIG9wdGlvbnM/LnJlbmRlcmVyID8/IGRlZmF1bHRSZW5kZXIsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkVuZCxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uSW52YWxpZElucHV0LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIENQVSdzIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgLSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQ1BVLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPik6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBjb25zdCByYW5kb21Nb3ZlID0gZW1wdHlDZWxsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlbXB0eUNlbGxzLmxlbmd0aCldITtcblxuICAgICAgICBzd2l0Y2ggKGRpZmZpY3VsdHkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJpbXBvc3NpYmxlQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgbWF4RGVwdGg6IDEwIH0pO1xuICAgICAgICAgICAgY2FzZSBcImhhcmRDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBtYXhEZXB0aDogNyB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJtZWRpdW1DUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBtYXhEZXB0aDogNSB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJlYXN5Q1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGlmZmljdWx0eS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLm1heERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgYWxnb3JpdGhtIGlzIGludmFsaWQuXG4gICAgICovXG4gICAgcHVibGljIGZpbmRPcHRpbWFsTW92ZSh7IG1heERlcHRoIH06IHsgbWF4RGVwdGg6IG51bWJlcjsgfSA9IHsgbWF4RGVwdGg6IEluZmluaXR5IH0pOiBQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvYXJkLmlzRW1wdHlcbiAgICAgICAgICAgID8geyB4OiAzLCB5OiA1IH1cbiAgICAgICAgICAgIDogdGhpcy5hbHBoYWJldGEobWF4RGVwdGgpLm1vdmU7XG4gICAgfVxufVxuIl19
|
|
@@ -15,10 +15,10 @@ export default class Board extends Base {
|
|
|
15
15
|
get heuristic() {
|
|
16
16
|
const { winner } = this;
|
|
17
17
|
if (winner === 0)
|
|
18
|
-
return
|
|
18
|
+
return 10 - this.moves.length;
|
|
19
19
|
if (winner === 1)
|
|
20
|
-
return -
|
|
20
|
+
return -(10 - this.moves.length);
|
|
21
21
|
return 0;
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvdGljdGFjdG9lL2JvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZDLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBRXhELHNDQUFzQztBQUN0QyxNQUFNLENBQUMsT0FBTyxPQUFPLEtBQU0sU0FBUSxJQUFZO0lBQ2pDLGFBQWEsR0FBa0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQzVGLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUxQyxvQ0FBb0M7SUFDcEM7UUFDSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFNBQVM7UUFDaEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztRQUV4QixJQUFJLE1BQU0sS0FBSyxDQUFDO1lBQ1osT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFbEMsSUFBSSxNQUFNLEtBQUssQ0FBQztZQUNaLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJDLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcbmltcG9ydCBJbnRCaXRCb2FyZCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvaW50Qml0Qm9hcmQuanNcIjtcblxuLyoqIFJlcHJlc2VudHMgYSBUaWMgVGFjIFRvZSBib2FyZC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvYXJkIGV4dGVuZHMgQmFzZTxudW1iZXI+IHtcbiAgICBwcm90ZWN0ZWQgd2lubmluZ1N0YXRlczogSW50Qml0Qm9hcmRbXSA9IFsweDAwNywgMHgwMzgsIDB4MUMwLCAweDA0OSwgMHgwOTIsIDB4MTI0LCAweDExMSwgMHgwNTRdXG4gICAgICAgIC5tYXAoKGRhdGEpID0+IG5ldyBJbnRCaXRCb2FyZChkYXRhKSk7XG5cbiAgICAvKiogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCb2FyZC4gKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDMsIDMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuXG4gICAgICogQHJldHVybnMgVGhlIGhldXJpc3RpYyBzY29yZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhldXJpc3RpYygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcztcblxuICAgICAgICBpZiAod2lubmVyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDEwIC0gdGhpcy5tb3Zlcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiAtKDEwIC0gdGhpcy5tb3Zlcy5sZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import Base from "../../base/controller.js";
|
|
2
|
+
import type { GameConstructorOptions, PlayerType } from "../../base/controller.js";
|
|
3
3
|
import Board from "./board.js";
|
|
4
4
|
import type { Position } from "../../base/board.js";
|
|
5
5
|
/** A game of TicTacToe. */
|
|
@@ -14,21 +14,18 @@ export default class TicTacToe extends Base<Board> {
|
|
|
14
14
|
/**
|
|
15
15
|
* Calculates the CPU's move.
|
|
16
16
|
* @param difficulty - The difficulty of the CPU.
|
|
17
|
-
* @param algorithm - The algorithm to use.
|
|
18
17
|
* @returns The CPU's move.
|
|
19
18
|
* @throws {Error} An error if the difficulty is invalid.
|
|
20
19
|
*/
|
|
21
|
-
determineCPUMove(difficulty: Omit<PlayerType, "human"
|
|
20
|
+
determineCPUMove(difficulty: Omit<PlayerType, "human">): Position;
|
|
22
21
|
/**
|
|
23
22
|
* Finds the optimal move for the current player.
|
|
24
23
|
* @param algorithm - The algorithm to use.
|
|
25
|
-
* @param algorithm.algorithm - The algorithm to use.
|
|
26
24
|
* @param algorithm.randomMove - The move to return if the board is empty.
|
|
27
25
|
* @returns The optimal move for the current player.
|
|
28
26
|
* @throws {Error} An error if the algorithm is invalid.
|
|
29
27
|
*/
|
|
30
|
-
findOptimalMove({
|
|
31
|
-
algorithm: Algorithm;
|
|
28
|
+
findOptimalMove({ randomMove }?: {
|
|
32
29
|
randomMove: Position;
|
|
33
30
|
}): Position;
|
|
34
31
|
}
|
|
@@ -33,14 +33,13 @@ let TicTacToe = class TicTacToe extends Base {
|
|
|
33
33
|
/**
|
|
34
34
|
* Calculates the CPU's move.
|
|
35
35
|
* @param difficulty - The difficulty of the CPU.
|
|
36
|
-
* @param algorithm - The algorithm to use.
|
|
37
36
|
* @returns The CPU's move.
|
|
38
37
|
* @throws {Error} An error if the difficulty is invalid.
|
|
39
38
|
*/
|
|
40
|
-
determineCPUMove(difficulty
|
|
39
|
+
determineCPUMove(difficulty) {
|
|
41
40
|
const { emptyCells } = this.board;
|
|
42
41
|
const randomMove = emptyCells[Math.floor(Math.random() * emptyCells.length)];
|
|
43
|
-
const optimalMove = this.findOptimalMove({
|
|
42
|
+
const optimalMove = this.findOptimalMove({ randomMove });
|
|
44
43
|
switch (difficulty) {
|
|
45
44
|
case "impossibleCPU":
|
|
46
45
|
return optimalMove;
|
|
@@ -57,20 +56,18 @@ let TicTacToe = class TicTacToe extends Base {
|
|
|
57
56
|
/**
|
|
58
57
|
* Finds the optimal move for the current player.
|
|
59
58
|
* @param algorithm - The algorithm to use.
|
|
60
|
-
* @param algorithm.algorithm - The algorithm to use.
|
|
61
59
|
* @param algorithm.randomMove - The move to return if the board is empty.
|
|
62
60
|
* @returns The optimal move for the current player.
|
|
63
61
|
* @throws {Error} An error if the algorithm is invalid.
|
|
64
62
|
*/
|
|
65
|
-
findOptimalMove({
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return minimax.move;
|
|
63
|
+
findOptimalMove({ randomMove } = { randomMove: { x: 2, y: 2 } }) {
|
|
64
|
+
return this.board.isEmpty
|
|
65
|
+
? randomMove
|
|
66
|
+
: this.alphabeta().move;
|
|
70
67
|
}
|
|
71
68
|
};
|
|
72
69
|
TicTacToe = __decorate([
|
|
73
70
|
Game
|
|
74
71
|
], TicTacToe);
|
|
75
72
|
export default TicTacToe;
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy90aWN0YWN0b2UvY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXRELE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUcvQjs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFxQjtJQUN4QywrQkFBK0I7SUFDL0IsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUVwQyxJQUFJLE1BQU0sS0FBSyxLQUFLO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hGLDhCQUE4QjtBQUNsQyxDQUFDO0FBRUQsMkJBQTJCO0FBRVosSUFBTSxTQUFTLEdBQWYsTUFBTSxTQUFVLFNBQVEsSUFBVztJQUM5Qzs7Ozs7T0FLRztJQUNILFlBQ0ksYUFBeUIsRUFDekIsYUFBeUIsRUFDekIsT0FBdUM7UUFFdkMsS0FBSyxDQUNELENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM5QixJQUFJLEtBQUssRUFBRSxFQUNYLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUNsQyxPQUFPLEVBQUUsS0FBSyxFQUNkLE9BQU8sRUFBRSxjQUFjLENBQzFCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxnQkFBZ0IsQ0FBQyxVQUFxQztRQUN6RCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFFLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFekQsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNqQixLQUFLLGVBQWU7Z0JBQ2hCLE9BQU8sV0FBVyxDQUFDO1lBQ3ZCLEtBQUssU0FBUztnQkFDVixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxlQUFlLENBQUMsRUFBRSxVQUFVLEtBRS9CLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDckIsQ0FBQyxDQUFDLFVBQVU7WUFDWixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0NBQ0osQ0FBQTtBQTVEb0IsU0FBUztJQUQ3QixJQUFJO0dBQ2dCLFNBQVMsQ0E0RDdCO2VBNURvQixTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UsIHsgR2FtZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcmVuZGVyaW5nIGZ1bmN0aW9uIGZvciBUaWNUYWNUb2UuXG4gKiBAcGFyYW0gY29udHJvbGxlciAtIFRoZSBjb250cm9sbGVyIHRvIHJlbmRlci5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFJlbmRlcihjb250cm9sbGVyOiBUaWNUYWNUb2UpOiB2b2lkIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgY29uc29sZS5jbGVhcigpO1xuICAgIGNvbnNvbGUubG9nKGNvbnRyb2xsZXIuYm9hcmQudG9TdHJpbmcoZmFsc2UpKTtcbiAgICBjb25zdCB7IHdpbm5lciB9ID0gY29udHJvbGxlci5ib2FyZDtcblxuICAgIGlmICh3aW5uZXIgIT09IGZhbHNlKVxuICAgICAgICBjb25zb2xlLmxvZyh3aW5uZXIgPT09IG51bGwgPyBcIkl0J3MgYSB0aWUhXCIgOiBgUGxheWVyICR7d2lubmVyICsgMX0gd2lucyFgKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbn1cblxuLyoqIEEgZ2FtZSBvZiBUaWNUYWNUb2UuICovXG5AR2FtZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGljVGFjVG9lIGV4dGVuZHMgQmFzZTxCb2FyZD4ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGljVGFjVG9lIGdhbWUuXG4gICAgICogQHBhcmFtIHBsYXllck9uZVR5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgb25lIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUd29UeXBlIC0gVGhlIHR5cGUgb2YgcGxheWVyIHR3byAoaHVtYW4gb3IgQ1BVKS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ2FtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPEJvYXJkPixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBbcGxheWVyT25lVHlwZSwgcGxheWVyVHdvVHlwZV0sXG4gICAgICAgICAgICBuZXcgQm9hcmQoKSxcbiAgICAgICAgICAgIG9wdGlvbnM/LnJlbmRlcmVyID8/IGRlZmF1bHRSZW5kZXIsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkVuZCxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uSW52YWxpZElucHV0LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIENQVSdzIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgLSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQ1BVLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPik6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBjb25zdCByYW5kb21Nb3ZlID0gZW1wdHlDZWxsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlbXB0eUNlbGxzLmxlbmd0aCldITtcbiAgICAgICAgY29uc3Qgb3B0aW1hbE1vdmUgPSB0aGlzLmZpbmRPcHRpbWFsTW92ZSh7IHJhbmRvbU1vdmUgfSk7XG5cbiAgICAgICAgc3dpdGNoIChkaWZmaWN1bHR5KSB7XG4gICAgICAgICAgICBjYXNlIFwiaW1wb3NzaWJsZUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpbWFsTW92ZTtcbiAgICAgICAgICAgIGNhc2UgXCJoYXJkQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgPCAwLjggPyBvcHRpbWFsTW92ZSA6IHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBjYXNlIFwibWVkaXVtQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgPCAwLjUgPyBvcHRpbWFsTW92ZSA6IHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBjYXNlIFwiZWFzeUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRpZmZpY3VsdHkuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZSBmb3IgdGhlIGN1cnJlbnQgcGxheWVyLlxuICAgICAqIEBwYXJhbSBhbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtLnJhbmRvbU1vdmUgLSBUaGUgbW92ZSB0byByZXR1cm4gaWYgdGhlIGJvYXJkIGlzIGVtcHR5LlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IHBsYXllci5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gQW4gZXJyb3IgaWYgdGhlIGFsZ29yaXRobSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kT3B0aW1hbE1vdmUoeyByYW5kb21Nb3ZlIH06IHtcbiAgICAgICAgcmFuZG9tTW92ZTogUG9zaXRpb247XG4gICAgfSA9IHsgcmFuZG9tTW92ZTogeyB4OiAyLCB5OiAyIH0gfSk6IFBvc2l0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9hcmQuaXNFbXB0eVxuICAgICAgICAgICAgPyByYW5kb21Nb3ZlXG4gICAgICAgICAgICA6IHRoaXMuYWxwaGFiZXRhKCkubW92ZTtcbiAgICB9XG59XG4iXX0=
|
package/build/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
export type { default as TicTacToeBoard } from "./games/tictactoe/board.js";
|
|
3
3
|
export { default as Connect4Controller } from "./games/connect4/controller.js";
|
|
4
4
|
export type { default as Connect4Board } from "./games/connect4/board.js";
|
|
5
|
-
export type { default as Controller, PlayerType,
|
|
5
|
+
export type { default as Controller, PlayerType, GameConstructorOptions, GameConstructor, } from "./base/controller.js";
|
|
6
6
|
export type { default as Board, Position, GridLines, } from "./base/board.js";
|
|
7
7
|
export type { default as BitBoard } from "./bitBoard/bitBoard.js";
|
|
8
8
|
export type { default as IntBitBoard } from "./bitBoard/intBitBoard.js";
|
package/build/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { default as TicTacToeController } from "./games/tictactoe/controller.js";
|
|
2
2
|
export { default as Connect4Controller } from "./games/connect4/controller.js";
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2pGLE9BQU8sRUFBRSxPQUFPLElBQUksa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgVGljVGFjVG9lQ29udHJvbGxlciB9IGZyb20gXCIuL2dhbWVzL3RpY3RhY3RvZS9jb250cm9sbGVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgVGljVGFjVG9lQm9hcmQgfSBmcm9tIFwiLi9nYW1lcy90aWN0YWN0b2UvYm9hcmQuanNcIjtcblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBDb25uZWN0NENvbnRyb2xsZXIgfSBmcm9tIFwiLi9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29ubmVjdDRCb2FyZCB9IGZyb20gXCIuL2dhbWVzL2Nvbm5lY3Q0L2JvYXJkLmpzXCI7XG5cbmV4cG9ydCB0eXBlIHtcbiAgICBkZWZhdWx0IGFzIENvbnRyb2xsZXIsXG4gICAgUGxheWVyVHlwZSxcbiAgICBHYW1lQ29uc3RydWN0b3JPcHRpb25zLFxuICAgIEdhbWVDb25zdHJ1Y3Rvcixcbn0gZnJvbSBcIi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5leHBvcnQgdHlwZSB7XG4gICAgZGVmYXVsdCBhcyBCb2FyZCxcbiAgICBQb3NpdGlvbixcbiAgICBHcmlkTGluZXMsXG59IGZyb20gXCIuL2Jhc2UvYm9hcmQuanNcIjtcblxuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEJpdEJvYXJkIH0gZnJvbSBcIi4vYml0Qm9hcmQvYml0Qm9hcmQuanNcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBJbnRCaXRCb2FyZCB9IGZyb20gXCIuL2JpdEJvYXJkL2ludEJpdEJvYXJkLmpzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgTG9uZ0ludCB9IGZyb20gXCIuL2JpdEJvYXJkL2xvbmdJbnQuanNcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBMb25nSW50Qml0Qm9hcmQgfSBmcm9tIFwiLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oathompsonjones/mini-games",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"description": "A selection of MiniGames. You will soon be able to play these games on [my website](https://oathompsonjones.co.uk/arcade).",
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "https://github.com/oathompsonjones/MiniGames.git"
|