@oathompsonjones/mini-games 1.0.1 → 1.0.3
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/.github/workflows/lint-and-test.yml +52 -0
- package/.github/workflows/publish.yml +36 -0
- package/build/base/board.d.ts +17 -58
- package/build/base/board.js +23 -75
- package/build/base/controller.d.ts +16 -34
- package/build/base/controller.js +27 -39
- package/build/bitBoard/bitBoard.d.ts +8 -33
- package/build/bitBoard/bitBoard.js +7 -12
- package/build/bitBoard/intBitBoard.d.ts +65 -4
- package/build/bitBoard/intBitBoard.js +66 -5
- package/build/bitBoard/longInt.d.ts +2 -32
- package/build/bitBoard/longInt.js +17 -25
- package/build/bitBoard/longIntBitBoard.d.ts +65 -7
- package/build/bitBoard/longIntBitBoard.js +72 -4
- package/build/console.d.ts +1 -4
- package/build/console.js +4 -7
- package/build/games/connect4/board.d.ts +9 -0
- package/build/games/connect4/board.js +10 -1
- package/build/games/connect4/controller.d.ts +18 -0
- package/build/games/connect4/controller.js +23 -1
- package/build/games/tictactoe/board.d.ts +3 -0
- package/build/games/tictactoe/board.js +4 -1
- package/build/games/tictactoe/controller.d.ts +20 -0
- package/build/games/tictactoe/controller.js +25 -1
- package/build/index.d.ts +1 -0
- package/build/index.js +1 -1
- package/eslint.config.js +3 -0
- package/package.json +6 -8
- package/.eslintrc +0 -6
package/build/console.js
CHANGED
|
@@ -14,17 +14,14 @@ async function readLine(prompt = "") {
|
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Writes to the console.
|
|
17
|
-
*
|
|
18
17
|
* @param text The text to write.
|
|
19
18
|
*/
|
|
20
19
|
function writeLine(...text) {
|
|
21
|
-
|
|
20
|
+
console.log(...text);
|
|
22
21
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Clears the console.
|
|
25
|
-
*/
|
|
22
|
+
/** Clears the console. */
|
|
26
23
|
function clear() {
|
|
27
|
-
|
|
24
|
+
console.clear();
|
|
28
25
|
}
|
|
29
26
|
export default { clear, readLine, writeLine };
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUV6Qzs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxRQUFRLENBQUMsU0FBaUIsRUFBRTtJQUN2QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFZixPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQUMsR0FBRyxJQUFjO0lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsMEJBQTBCO0FBQzFCLFNBQVMsS0FBSztJQUNWLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsZUFBZSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgcmVhZGxpbmUgZnJvbSBcInJlYWRsaW5lL3Byb21pc2VzXCI7XG5cbi8qKlxuICogUmVhZHMgZnJvbSB0aGUgY29uc29sZS5cbiAqXG4gKiBAcGFyYW0gcHJvbXB0IFRoZSBxdWVzdGlvbiB0byBnZXQgdGhlIGFuc3dlciB0by5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSByZWFkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkTGluZShwcm9tcHQ6IHN0cmluZyA9IFwiXCIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlYWRlciA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCk7XG4gICAgY29uc3QgaW5wdXQgPSBhd2FpdCByZWFkZXIucXVlc3Rpb24ocHJvbXB0KTtcblxuICAgIHJlYWRlci5jbG9zZSgpO1xuXG4gICAgcmV0dXJuIGlucHV0O1xufVxuXG4vKipcbiAqIFdyaXRlcyB0byB0aGUgY29uc29sZS5cbiAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIHdyaXRlLlxuICovXG5mdW5jdGlvbiB3cml0ZUxpbmUoLi4udGV4dDogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyguLi50ZXh0KTtcbn1cblxuLyoqIENsZWFycyB0aGUgY29uc29sZS4gKi9cbmZ1bmN0aW9uIGNsZWFyKCk6IHZvaWQge1xuICAgIGNvbnNvbGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBjbGVhciwgcmVhZExpbmUsIHdyaXRlTGluZSB9O1xuIl19
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Base from "../../base/board.js";
|
|
2
2
|
import LongIntBitBoard from "../../bitBoard/longIntBitBoard.js";
|
|
3
3
|
import type { Position } from "../../base/board.js";
|
|
4
|
+
/** Represents a Connect 4 board. */
|
|
4
5
|
export default class Board extends Base<LongIntBitBoard> {
|
|
5
6
|
protected winningStates: LongIntBitBoard[];
|
|
6
7
|
private readonly FULL_BOARD;
|
|
@@ -8,8 +9,16 @@ export default class Board extends Base<LongIntBitBoard> {
|
|
|
8
9
|
private readonly VERTICAL;
|
|
9
10
|
private readonly LEADING_DIAGONAL;
|
|
10
11
|
private readonly NON_LEADING_DIAGONAL;
|
|
12
|
+
/** Creates an instance of Board. */
|
|
11
13
|
constructor();
|
|
14
|
+
/** Calculates the heuristic score for the current board state. */
|
|
12
15
|
get heuristic(): number;
|
|
16
|
+
/** Generates a list of empty cells. */
|
|
13
17
|
get emptyCells(): Position[];
|
|
18
|
+
/**
|
|
19
|
+
* Makes a move on the board.
|
|
20
|
+
* @param move The move to make.
|
|
21
|
+
* @param playerId The player making the move.
|
|
22
|
+
*/
|
|
14
23
|
makeMove(move: Position, playerId: number): void;
|
|
15
24
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Base from "../../base/board.js";
|
|
2
2
|
import LongInt from "../../bitBoard/longInt.js";
|
|
3
3
|
import LongIntBitBoard from "../../bitBoard/longIntBitBoard.js";
|
|
4
|
+
/** Represents a Connect 4 board. */
|
|
4
5
|
export default class Board extends Base {
|
|
5
6
|
winningStates = [];
|
|
6
7
|
FULL_BOARD = new LongInt([0b1111_1111111_1111111_1111111_1111111, 0b1111111_111]);
|
|
@@ -8,6 +9,7 @@ export default class Board extends Base {
|
|
|
8
9
|
VERTICAL = new LongInt([0b0000_0000001_0000001_0000001_0000001, 0b0000000_000]);
|
|
9
10
|
LEADING_DIAGONAL = new LongInt([0b0000_0001000_0000100_0000010_0000001, 0b0000000_000]);
|
|
10
11
|
NON_LEADING_DIAGONAL = new LongInt([0b0000_0000001_0000010_0000100_0001000, 0b0000000_000]);
|
|
12
|
+
/** Creates an instance of Board. */
|
|
11
13
|
constructor() {
|
|
12
14
|
super(7, 6);
|
|
13
15
|
for (let i = 0; i < 4; i++) {
|
|
@@ -39,6 +41,7 @@ export default class Board extends Base {
|
|
|
39
41
|
}
|
|
40
42
|
}
|
|
41
43
|
}
|
|
44
|
+
/** Calculates the heuristic score for the current board state. */
|
|
42
45
|
get heuristic() {
|
|
43
46
|
const { winner } = this;
|
|
44
47
|
if (winner === 0)
|
|
@@ -65,6 +68,7 @@ export default class Board extends Base {
|
|
|
65
68
|
const p1Score = 10 * p1LineOfThreeScore + p1LineOfTwoScore;
|
|
66
69
|
return p0Score - p1Score;
|
|
67
70
|
}
|
|
71
|
+
/** Generates a list of empty cells. */
|
|
68
72
|
get emptyCells() {
|
|
69
73
|
const emptyCells = [];
|
|
70
74
|
for (let x = 0; x < this.boardWidth; x++) {
|
|
@@ -74,6 +78,11 @@ export default class Board extends Base {
|
|
|
74
78
|
}
|
|
75
79
|
return emptyCells;
|
|
76
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Makes a move on the board.
|
|
83
|
+
* @param move The move to make.
|
|
84
|
+
* @param playerId The player making the move.
|
|
85
|
+
*/
|
|
77
86
|
makeMove(move, playerId) {
|
|
78
87
|
const updatedMove = move;
|
|
79
88
|
for (let i = 5; i >= 0; i--) {
|
|
@@ -85,4 +94,4 @@ export default class Board extends Base {
|
|
|
85
94
|
super.makeMove(updatedMove, playerId);
|
|
86
95
|
}
|
|
87
96
|
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsTUFBTSxDQUFDLE9BQU8sT0FBTyxLQUFNLFNBQVEsSUFBcUI7SUFDMUMsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFL0IsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWxGLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFaEYsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRXhGLG9CQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUU3RztRQUNJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxPQUFPO3FCQUM5QyxTQUFTLENB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O0lBRUQsSUFBb0IsVUFBVTtRQUMxQixNQUFNLFVBQVUsR0FBZSxFQUFFLENBQUM7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksR0FBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUk7Z0JBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFZSxRQUFRLENBQUMsSUFBYyxFQUFFLFFBQWdCO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNYLE1BQU07WUFDVixDQUFDO1FBQ0wsQ0FBQztRQUNELEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlIGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5pbXBvcnQgTG9uZ0ludCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvbG9uZ0ludC5qc1wiO1xuaW1wb3J0IExvbmdJbnRCaXRCb2FyZCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvbG9uZ0ludEJpdEJvYXJkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9hcmQgZXh0ZW5kcyBCYXNlPExvbmdJbnRCaXRCb2FyZD4ge1xuICAgIHByb3RlY3RlZCB3aW5uaW5nU3RhdGVzOiBMb25nSW50Qml0Qm9hcmRbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBGVUxMX0JPQVJEID0gbmV3IExvbmdJbnQoWzBiMTExMV8xMTExMTExXzExMTExMTFfMTExMTExMV8xMTExMTExLCAwYjExMTExMTFfMTExXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IEhPUklaT05UQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDBfMDAwMDAwMF8wMDAwMDAwXzAwMDExMTEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgVkVSVElDQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDFfMDAwMDAwMV8wMDAwMDAxXzAwMDAwMDEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMTAwMF8wMDAwMTAwXzAwMDAwMTBfMDAwMDAwMSwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBOT05fTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMDAwMV8wMDAwMDEwXzAwMDAxMDBfMDAwMTAwMCwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcig3LCA2KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNjsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5IT1JJWk9OVEFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuVkVSVElDQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5MRUFESU5HX0RJQUdPTkFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuTk9OX0xFQURJTkdfRElBR09OQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhldXJpc3RpYygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcztcbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAxMDAwO1xuICAgICAgICBpZiAod2lubmVyID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIC0xMDAwO1xuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlTm9HYXBzID0gdGhpcy5oYXNMaW5lKDAsIDMpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlTm9HYXBzID0gdGhpcy5oYXNMaW5lKDEsIDMpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlT25lR2FwID0gdGhpcy5oYXNMaW5lKDAsIDMsIDEpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlT25lR2FwID0gdGhpcy5oYXNMaW5lKDEsIDMsIDEpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlVHdvR2FwcyA9IHRoaXMuaGFzTGluZSgwLCAzLCAyKTtcbiAgICAgICAgY29uc3QgcDFMaW5lT2ZUaHJlZVR3b0dhcHMgPSB0aGlzLmhhc0xpbmUoMSwgMywgMik7XG4gICAgICAgIGNvbnN0IHAwTGluZU9mVHdvTm9HYXBzID0gdGhpcy5oYXNMaW5lKDAsIDIpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlR3b05vR2FwcyA9IHRoaXMuaGFzTGluZSgxLCAyKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUd29PbmVHYXAgPSB0aGlzLmhhc0xpbmUoMCwgMiwgMSk7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvT25lR2FwID0gdGhpcy5oYXNMaW5lKDEsIDIsIDEpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlR3b1R3b0dhcHMgPSB0aGlzLmhhc0xpbmUoMCwgMiwgMik7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvVHdvR2FwcyA9IHRoaXMuaGFzTGluZSgxLCAyLCAyKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUaHJlZVNjb3JlID0gMyAqIHAwTGluZU9mVGhyZWVOb0dhcHMgKyAyICogcDBMaW5lT2ZUaHJlZU9uZUdhcCArIHAwTGluZU9mVGhyZWVUd29HYXBzO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlU2NvcmUgPSAzICogcDFMaW5lT2ZUaHJlZU5vR2FwcyArIDIgKiBwMUxpbmVPZlRocmVlT25lR2FwICsgcDFMaW5lT2ZUaHJlZVR3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAwTGluZU9mVHdvU2NvcmUgPSAzICogcDBMaW5lT2ZUd29Ob0dhcHMgKyAyICogcDBMaW5lT2ZUd29PbmVHYXAgKyBwMExpbmVPZlR3b1R3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvU2NvcmUgPSAzICogcDFMaW5lT2ZUd29Ob0dhcHMgKyAyICogcDFMaW5lT2ZUd29PbmVHYXAgKyBwMUxpbmVPZlR3b1R3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAwU2NvcmUgPSAxMCAqIHAwTGluZU9mVGhyZWVTY29yZSArIHAwTGluZU9mVHdvU2NvcmU7XG4gICAgICAgIGNvbnN0IHAxU2NvcmUgPSAxMCAqIHAxTGluZU9mVGhyZWVTY29yZSArIHAxTGluZU9mVHdvU2NvcmU7XG4gICAgICAgIHJldHVybiBwMFNjb3JlIC0gcDFTY29yZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGVtcHR5Q2VsbHMoKTogUG9zaXRpb25bXSB7XG4gICAgICAgIGNvbnN0IGVtcHR5Q2VsbHM6IFBvc2l0aW9uW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLmJvYXJkV2lkdGg7IHgrKykge1xuICAgICAgICAgICAgY29uc3QgY2VsbDogUG9zaXRpb24gPSB7IHgsIHk6IDAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNlbGxPY2N1cGllcihjZWxsKSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goY2VsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIG1ha2VNb3ZlKG1vdmU6IFBvc2l0aW9uLCBwbGF5ZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRNb3ZlID0gbW92ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDU7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsT2NjdXBpZXIoeyB4OiBtb3ZlLngsIHk6IGkgfSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtb3ZlLnkgPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm1ha2VNb3ZlKHVwZGF0ZWRNb3ZlLCBwbGF5ZXJJZCk7XG4gICAgfVxufVxuIl19
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLElBQXFCO0lBQzFDLGFBQWEsR0FBc0IsRUFBRSxDQUFDO0lBRS9CLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFbEYsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWhGLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUV4RixvQkFBb0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0csb0NBQW9DO0lBQ3BDO1FBQ0ksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksZUFB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RTNELE9BQU8sT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUM3QixDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLElBQW9CLFVBQVU7UUFDMUIsTUFBTSxVQUFVLEdBQWUsRUFBRSxDQUFDO1FBRWxDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBRW5DLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJO2dCQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNhLFFBQVEsQ0FBQyxJQUFjLEVBQUUsUUFBZ0I7UUFDckQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ1gsTUFBTTtZQUNWLENBQUM7UUFDTCxDQUFDO1FBQ0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcbmltcG9ydCBMb25nSW50IGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgTG9uZ0ludEJpdEJvYXJkIGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKiogUmVwcmVzZW50cyBhIENvbm5lY3QgNCBib2FyZC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvYXJkIGV4dGVuZHMgQmFzZTxMb25nSW50Qml0Qm9hcmQ+IHtcbiAgICBwcm90ZWN0ZWQgd2lubmluZ1N0YXRlczogTG9uZ0ludEJpdEJvYXJkW10gPSBbXTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgRlVMTF9CT0FSRCA9IG5ldyBMb25nSW50KFswYjExMTFfMTExMTExMV8xMTExMTExXzExMTExMTFfMTExMTExMSwgMGIxMTExMTExXzExMV0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBIT1JJWk9OVEFMID0gbmV3IExvbmdJbnQoWzBiMDAwMF8wMDAwMDAwXzAwMDAwMDBfMDAwMDAwMF8wMDAxMTExLCAwYjAwMDAwMDBfMDAwXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IFZFUlRJQ0FMID0gbmV3IExvbmdJbnQoWzBiMDAwMF8wMDAwMDAxXzAwMDAwMDFfMDAwMDAwMV8wMDAwMDAxLCAwYjAwMDAwMDBfMDAwXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IExFQURJTkdfRElBR09OQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDEwMDBfMDAwMDEwMF8wMDAwMDEwXzAwMDAwMDEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgTk9OX0xFQURJTkdfRElBR09OQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDFfMDAwMDAxMF8wMDAwMTAwXzAwMDEwMDAsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIC8qKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJvYXJkLiAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoNywgNik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDY7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuSE9SSVpPTlRBTCwgaSArIDcgKiBqKVxuICAgICAgICAgICAgICAgICAgICAuYW5kKHRoaXMuRlVMTF9CT0FSRCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbm5pbmdTdGF0ZXMucHVzaChuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnRcbiAgICAgICAgICAgICAgICAgICAgLmxlZnRTaGlmdCh0aGlzLlZFUlRJQ0FMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuTEVBRElOR19ESUFHT05BTCwgaSArIDcgKiBqKVxuICAgICAgICAgICAgICAgICAgICAuYW5kKHRoaXMuRlVMTF9CT0FSRCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbm5pbmdTdGF0ZXMucHVzaChuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnRcbiAgICAgICAgICAgICAgICAgICAgLmxlZnRTaGlmdCh0aGlzLk5PTl9MRUFESU5HX0RJQUdPTkFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuICovXG4gICAgcHVibGljIGdldCBoZXVyaXN0aWMoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgeyB3aW5uZXIgfSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAxMDAwO1xuXG4gICAgICAgIGlmICh3aW5uZXIgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gLTEwMDA7XG5cbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUaHJlZU5vR2FwcyA9IHRoaXMuaGFzTGluZSgwLCAzKTtcbiAgICAgICAgY29uc3QgcDFMaW5lT2ZUaHJlZU5vR2FwcyA9IHRoaXMuaGFzTGluZSgxLCAzKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUaHJlZU9uZUdhcCA9IHRoaXMuaGFzTGluZSgwLCAzLCAxKTtcbiAgICAgICAgY29uc3QgcDFMaW5lT2ZUaHJlZU9uZUdhcCA9IHRoaXMuaGFzTGluZSgxLCAzLCAxKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUaHJlZVR3b0dhcHMgPSB0aGlzLmhhc0xpbmUoMCwgMywgMik7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVGhyZWVUd29HYXBzID0gdGhpcy5oYXNMaW5lKDEsIDMsIDIpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlR3b05vR2FwcyA9IHRoaXMuaGFzTGluZSgwLCAyKTtcbiAgICAgICAgY29uc3QgcDFMaW5lT2ZUd29Ob0dhcHMgPSB0aGlzLmhhc0xpbmUoMSwgMik7XG4gICAgICAgIGNvbnN0IHAwTGluZU9mVHdvT25lR2FwID0gdGhpcy5oYXNMaW5lKDAsIDIsIDEpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlR3b09uZUdhcCA9IHRoaXMuaGFzTGluZSgxLCAyLCAxKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUd29Ud29HYXBzID0gdGhpcy5oYXNMaW5lKDAsIDIsIDIpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlR3b1R3b0dhcHMgPSB0aGlzLmhhc0xpbmUoMSwgMiwgMik7XG4gICAgICAgIGNvbnN0IHAwTGluZU9mVGhyZWVTY29yZSA9IDMgKiBwMExpbmVPZlRocmVlTm9HYXBzICsgMiAqIHAwTGluZU9mVGhyZWVPbmVHYXAgKyBwMExpbmVPZlRocmVlVHdvR2FwcztcbiAgICAgICAgY29uc3QgcDFMaW5lT2ZUaHJlZVNjb3JlID0gMyAqIHAxTGluZU9mVGhyZWVOb0dhcHMgKyAyICogcDFMaW5lT2ZUaHJlZU9uZUdhcCArIHAxTGluZU9mVGhyZWVUd29HYXBzO1xuICAgICAgICBjb25zdCBwMExpbmVPZlR3b1Njb3JlID0gMyAqIHAwTGluZU9mVHdvTm9HYXBzICsgMiAqIHAwTGluZU9mVHdvT25lR2FwICsgcDBMaW5lT2ZUd29Ud29HYXBzO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlR3b1Njb3JlID0gMyAqIHAxTGluZU9mVHdvTm9HYXBzICsgMiAqIHAxTGluZU9mVHdvT25lR2FwICsgcDFMaW5lT2ZUd29Ud29HYXBzO1xuICAgICAgICBjb25zdCBwMFNjb3JlID0gMTAgKiBwMExpbmVPZlRocmVlU2NvcmUgKyBwMExpbmVPZlR3b1Njb3JlO1xuICAgICAgICBjb25zdCBwMVNjb3JlID0gMTAgKiBwMUxpbmVPZlRocmVlU2NvcmUgKyBwMUxpbmVPZlR3b1Njb3JlO1xuXG4gICAgICAgIHJldHVybiBwMFNjb3JlIC0gcDFTY29yZTtcbiAgICB9XG5cbiAgICAvKiogR2VuZXJhdGVzIGEgbGlzdCBvZiBlbXB0eSBjZWxscy4gKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGVtcHR5Q2VsbHMoKTogUG9zaXRpb25bXSB7XG4gICAgICAgIGNvbnN0IGVtcHR5Q2VsbHM6IFBvc2l0aW9uW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMuYm9hcmRXaWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBjb25zdCBjZWxsOiBQb3NpdGlvbiA9IHsgeCwgeTogMCB9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsT2NjdXBpZXIoY2VsbCkgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgZW1wdHlDZWxscy5wdXNoKGNlbGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlIG9uIHRoZSBib2FyZC5cbiAgICAgKiBAcGFyYW0gbW92ZSBUaGUgbW92ZSB0byBtYWtlLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCBUaGUgcGxheWVyIG1ha2luZyB0aGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbWFrZU1vdmUobW92ZTogUG9zaXRpb24sIHBsYXllcklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZE1vdmUgPSBtb3ZlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSA1OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogbW92ZS54LCB5OiBpIH0pID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbW92ZS55ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdXBlci5tYWtlTW92ZSh1cGRhdGVkTW92ZSwgcGxheWVySWQpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
import type { Algorithm, GameConstructorOptions, PlayerType } from "../../base/controller.js";
|
|
2
2
|
import Base from "../../base/controller.js";
|
|
3
3
|
import type { Position } from "../../base/board.js";
|
|
4
|
+
/** Represents the controller for connect 4. */
|
|
4
5
|
export default class Connect4 extends Base {
|
|
6
|
+
/**
|
|
7
|
+
* Creates an instance of Connect4.
|
|
8
|
+
* @param playerOneType The type of player one.
|
|
9
|
+
* @param playerTwoType The type of player two.
|
|
10
|
+
* @param options The options for the game.
|
|
11
|
+
* */
|
|
5
12
|
constructor(playerOneType: PlayerType, playerTwoType: PlayerType, options?: GameConstructorOptions);
|
|
13
|
+
/**
|
|
14
|
+
* Calculates the CPU's move.
|
|
15
|
+
* @param difficulty The difficulty of the CPU.
|
|
16
|
+
* @param algorithm The algorithm to use.
|
|
17
|
+
* @returns The CPU's move.
|
|
18
|
+
*/
|
|
6
19
|
determineCPUMove(difficulty: Omit<PlayerType, "human">, algorithm?: Algorithm): Position;
|
|
20
|
+
/**
|
|
21
|
+
* Finds the optimal move for the current board state.
|
|
22
|
+
* @param options The options for the algorithm.
|
|
23
|
+
* @returns The optimal move.
|
|
24
|
+
*/
|
|
7
25
|
findOptimalMove(options?: {
|
|
8
26
|
algorithm?: Algorithm;
|
|
9
27
|
maxDepth?: number;
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
import Base, { Game } from "../../base/controller.js";
|
|
8
8
|
import Board from "./board.js";
|
|
9
9
|
import Console from "../../console.js";
|
|
10
|
+
/**
|
|
11
|
+
* The default renderer for connect 4.
|
|
12
|
+
* @param controller The controller to render.
|
|
13
|
+
*/
|
|
10
14
|
function defaultRender(controller) {
|
|
11
15
|
Console.clear();
|
|
12
16
|
Console.writeLine(controller.board.toString(true, true, false, ["⬤ ", "⬤ "]));
|
|
@@ -15,9 +19,21 @@ function defaultRender(controller) {
|
|
|
15
19
|
Console.writeLine(winner === null ? "It's a tie!" : `Player ${winner + 1} wins!`);
|
|
16
20
|
}
|
|
17
21
|
let Connect4 = class Connect4 extends Base {
|
|
22
|
+
/**
|
|
23
|
+
* Creates an instance of Connect4.
|
|
24
|
+
* @param playerOneType The type of player one.
|
|
25
|
+
* @param playerTwoType The type of player two.
|
|
26
|
+
* @param options The options for the game.
|
|
27
|
+
* */
|
|
18
28
|
constructor(playerOneType, playerTwoType, options) {
|
|
19
29
|
super([playerOneType, playerTwoType], new Board(), options?.renderer ?? defaultRender, options?.id, options?.onEnd, options?.onInvalidInput);
|
|
20
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculates the CPU's move.
|
|
33
|
+
* @param difficulty The difficulty of the CPU.
|
|
34
|
+
* @param algorithm The algorithm to use.
|
|
35
|
+
* @returns The CPU's move.
|
|
36
|
+
*/
|
|
21
37
|
determineCPUMove(difficulty, algorithm = "alphabeta") {
|
|
22
38
|
const { emptyCells } = this.board;
|
|
23
39
|
const randomMove = emptyCells[Math.floor(Math.random() * emptyCells.length)];
|
|
@@ -34,6 +50,11 @@ let Connect4 = class Connect4 extends Base {
|
|
|
34
50
|
throw new Error("Invalid difficulty.");
|
|
35
51
|
}
|
|
36
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Finds the optimal move for the current board state.
|
|
55
|
+
* @param options The options for the algorithm.
|
|
56
|
+
* @returns The optimal move.
|
|
57
|
+
*/
|
|
37
58
|
findOptimalMove(options) {
|
|
38
59
|
const { maxDepth = Infinity, algorithm = "alphabeta" } = options ?? {};
|
|
39
60
|
if (this.board.isEmpty)
|
|
@@ -44,6 +65,7 @@ let Connect4 = class Connect4 extends Base {
|
|
|
44
65
|
};
|
|
45
66
|
Connect4 = __decorate([
|
|
46
67
|
Game
|
|
68
|
+
/** Represents the controller for connect 4. */
|
|
47
69
|
], Connect4);
|
|
48
70
|
export default Connect4;
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBR3ZDOzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLFVBQW9CO0lBQ3ZDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQixPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUVwQyxJQUFJLE1BQU0sS0FBSyxLQUFLO1FBQ2hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFGLENBQUM7QUFJYyxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxJQUFJO0lBQ3RDOzs7OztTQUtLO0lBQ0wsWUFBbUIsYUFBeUIsRUFBRSxhQUF5QixFQUFFLE9BQWdDO1FBQ3JHLEtBQUssQ0FDRCxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsRUFDOUIsSUFBSSxLQUFLLEVBQUUsRUFDWCxPQUFPLEVBQUUsUUFBUSxJQUFJLGFBQWEsRUFDbEMsT0FBTyxFQUFFLEVBQUUsRUFDWCxPQUFPLEVBQUUsS0FBSyxFQUNkLE9BQU8sRUFBRSxjQUFjLENBQzFCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxnQkFBZ0IsQ0FBQyxVQUFxQyxFQUFFLFlBQXVCLFdBQVc7UUFDN0YsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBRSxDQUFDO1FBRTlFLFFBQVEsVUFBVSxFQUFFLENBQUM7WUFDakIsS0FBSyxlQUFlO2dCQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0QsS0FBSyxTQUFTO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RCxLQUFLLFdBQVc7Z0JBQ1osT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZUFBZSxDQUFDLE9BR3RCO1FBQ0csTUFBTSxFQUFFLFFBQVEsR0FBRyxRQUFRLEVBQUUsU0FBUyxHQUFHLFdBQVcsRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFdkUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDbEIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBRTFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUxQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDeEIsQ0FBQztDQUNKLENBQUE7QUE1RG9CLFFBQVE7SUFGNUIsSUFBSTtJQUNMLCtDQUErQztHQUMxQixRQUFRLENBNEQ1QjtlQTVEb0IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWxnb3JpdGhtLCBHYW1lQ29uc3RydWN0b3JPcHRpb25zLCBQbGF5ZXJUeXBlIH0gZnJvbSBcIi4uLy4uL2Jhc2UvY29udHJvbGxlci5qc1wiO1xuaW1wb3J0IEJhc2UsIHsgR2FtZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IENvbnNvbGUgZnJvbSBcIi4uLy4uL2NvbnNvbGUuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHJlbmRlcmVyIGZvciBjb25uZWN0IDQuXG4gKiBAcGFyYW0gY29udHJvbGxlciBUaGUgY29udHJvbGxlciB0byByZW5kZXIuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRSZW5kZXIoY29udHJvbGxlcjogQ29ubmVjdDQpOiB2b2lkIHtcbiAgICBDb25zb2xlLmNsZWFyKCk7XG4gICAgQ29uc29sZS53cml0ZUxpbmUoY29udHJvbGxlci5ib2FyZC50b1N0cmluZyh0cnVlLCB0cnVlLCBmYWxzZSwgW1wi4qykIFwiLCBcIuKspCBcIl0pKTtcbiAgICBjb25zdCB7IHdpbm5lciB9ID0gY29udHJvbGxlci5ib2FyZDtcblxuICAgIGlmICh3aW5uZXIgIT09IGZhbHNlKVxuICAgICAgICBDb25zb2xlLndyaXRlTGluZSh3aW5uZXIgPT09IG51bGwgPyBcIkl0J3MgYSB0aWUhXCIgOiBgUGxheWVyICR7d2lubmVyICsgMX0gd2lucyFgKTtcbn1cblxuQEdhbWVcbi8qKiBSZXByZXNlbnRzIHRoZSBjb250cm9sbGVyIGZvciBjb25uZWN0IDQuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25uZWN0NCBleHRlbmRzIEJhc2Uge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29ubmVjdDQuXG4gICAgICogQHBhcmFtIHBsYXllck9uZVR5cGUgVGhlIHR5cGUgb2YgcGxheWVyIG9uZS5cbiAgICAgKiBAcGFyYW0gcGxheWVyVHdvVHlwZSBUaGUgdHlwZSBvZiBwbGF5ZXIgdHdvLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciB0aGUgZ2FtZS5cbiAgICAgKiAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwbGF5ZXJPbmVUeXBlOiBQbGF5ZXJUeXBlLCBwbGF5ZXJUd29UeXBlOiBQbGF5ZXJUeXBlLCBvcHRpb25zPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIFtwbGF5ZXJPbmVUeXBlLCBwbGF5ZXJUd29UeXBlXSxcbiAgICAgICAgICAgIG5ldyBCb2FyZCgpLFxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyZXIgPz8gZGVmYXVsdFJlbmRlcixcbiAgICAgICAgICAgIG9wdGlvbnM/LmlkLFxuICAgICAgICAgICAgb3B0aW9ucz8ub25FbmQsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkludmFsaWRJbnB1dCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEBwYXJhbSBkaWZmaWN1bHR5IFRoZSBkaWZmaWN1bHR5IG9mIHRoZSBDUFUuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgQ1BVJ3MgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4sIGFsZ29yaXRobTogQWxnb3JpdGhtID0gXCJhbHBoYWJldGFcIik6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBjb25zdCByYW5kb21Nb3ZlID0gZW1wdHlDZWxsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlbXB0eUNlbGxzLmxlbmd0aCldITtcblxuICAgICAgICBzd2l0Y2ggKGRpZmZpY3VsdHkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJpbXBvc3NpYmxlQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgYWxnb3JpdGhtLCBtYXhEZXB0aDogMTAgfSk7XG4gICAgICAgICAgICBjYXNlIFwiaGFyZENQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRPcHRpbWFsTW92ZSh7IGFsZ29yaXRobSwgbWF4RGVwdGg6IDUgfSk7XG4gICAgICAgICAgICBjYXNlIFwibWVkaXVtQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgYWxnb3JpdGhtLCBtYXhEZXB0aDogMyB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJlYXN5Q1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGlmZmljdWx0eS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kT3B0aW1hbE1vdmUob3B0aW9ucz86IHtcbiAgICAgICAgYWxnb3JpdGhtPzogQWxnb3JpdGhtO1xuICAgICAgICBtYXhEZXB0aD86IG51bWJlcjtcbiAgICB9KTogUG9zaXRpb24ge1xuICAgICAgICBjb25zdCB7IG1heERlcHRoID0gSW5maW5pdHksIGFsZ29yaXRobSA9IFwiYWxwaGFiZXRhXCIgfSA9IG9wdGlvbnMgPz8ge307XG5cbiAgICAgICAgaWYgKHRoaXMuYm9hcmQuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB7IHg6IDMsIHk6IDUgfTtcblxuICAgICAgICBjb25zdCBtaW5pbWF4ID0gdGhpc1thbGdvcml0aG1dKG1heERlcHRoKTtcblxuICAgICAgICByZXR1cm4gbWluaW1heC5tb3ZlO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import Base from "../../base/board.js";
|
|
2
2
|
import IntBitBoard from "../../bitBoard/intBitBoard.js";
|
|
3
|
+
/** Represents a Tic Tac Toe board. */
|
|
3
4
|
export default class Board extends Base<IntBitBoard> {
|
|
4
5
|
protected winningStates: IntBitBoard[];
|
|
6
|
+
/** Creates an instance of Board. */
|
|
5
7
|
constructor();
|
|
8
|
+
/** Calculates the heuristic score for the current board state. */
|
|
6
9
|
get heuristic(): number;
|
|
7
10
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import Base from "../../base/board.js";
|
|
2
2
|
import IntBitBoard from "../../bitBoard/intBitBoard.js";
|
|
3
|
+
/** Represents a Tic Tac Toe board. */
|
|
3
4
|
export default class Board extends Base {
|
|
4
5
|
winningStates = [0x007, 0x038, 0x1C0, 0x049, 0x092, 0x124, 0x111, 0x054]
|
|
5
6
|
.map((data) => new IntBitBoard(data));
|
|
7
|
+
/** Creates an instance of Board. */
|
|
6
8
|
constructor() {
|
|
7
9
|
super(3, 3);
|
|
8
10
|
}
|
|
11
|
+
/** Calculates the heuristic score for the current board state. */
|
|
9
12
|
get heuristic() {
|
|
10
13
|
const { winner } = this;
|
|
11
14
|
if (winner === 0)
|
|
@@ -15,4 +18,4 @@ export default class Board extends Base {
|
|
|
15
18
|
return 0;
|
|
16
19
|
}
|
|
17
20
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvdGljdGFjdG9lL2JvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZDLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBRXhELHNDQUFzQztBQUN0QyxNQUFNLENBQUMsT0FBTyxPQUFPLEtBQU0sU0FBUSxJQUFpQjtJQUN0QyxhQUFhLEdBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztTQUM1RixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFMUMsb0NBQW9DO0lBQ3BDO1FBQ0ksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLElBQVcsU0FBUztRQUNoQixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRXhCLElBQUksTUFBTSxLQUFLLENBQUM7WUFDWixPQUFPLENBQUMsQ0FBQztRQUViLElBQUksTUFBTSxLQUFLLENBQUM7WUFDWixPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRWQsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuaW1wb3J0IEludEJpdEJvYXJkIGZyb20gXCIuLi8uLi9iaXRCb2FyZC9pbnRCaXRCb2FyZC5qc1wiO1xuXG4vKiogUmVwcmVzZW50cyBhIFRpYyBUYWMgVG9lIGJvYXJkLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9hcmQgZXh0ZW5kcyBCYXNlPEludEJpdEJvYXJkPiB7XG4gICAgcHJvdGVjdGVkIHdpbm5pbmdTdGF0ZXM6IEludEJpdEJvYXJkW10gPSBbMHgwMDcsIDB4MDM4LCAweDFDMCwgMHgwNDksIDB4MDkyLCAweDEyNCwgMHgxMTEsIDB4MDU0XVxuICAgICAgICAubWFwKChkYXRhKSA9PiBuZXcgSW50Qml0Qm9hcmQoZGF0YSkpO1xuXG4gICAgLyoqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigzLCAzKTtcbiAgICB9XG5cbiAgICAvKiogQ2FsY3VsYXRlcyB0aGUgaGV1cmlzdGljIHNjb3JlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS4gKi9cbiAgICBwdWJsaWMgZ2V0IGhldXJpc3RpYygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcztcblxuICAgICAgICBpZiAod2lubmVyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDE7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiAtMTtcblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import type { Algorithm, GameConstructorOptions, PlayerType } from "../../base/controller.js";
|
|
2
2
|
import Base from "../../base/controller.js";
|
|
3
3
|
import type { Position } from "../../base/board.js";
|
|
4
|
+
/** A game of TicTacToe. */
|
|
4
5
|
export default class TicTacToe extends Base {
|
|
6
|
+
/**
|
|
7
|
+
* Creates a new TicTacToe game.
|
|
8
|
+
* @param playerOneType The type of player one.
|
|
9
|
+
* @param playerTwoType The type of player two.
|
|
10
|
+
* @param options The options for the game.
|
|
11
|
+
*/
|
|
5
12
|
constructor(playerOneType: PlayerType, playerTwoType: PlayerType, options?: GameConstructorOptions);
|
|
13
|
+
/**
|
|
14
|
+
* Calculates the CPU's move.
|
|
15
|
+
* @param difficulty The difficulty of the CPU.
|
|
16
|
+
* @param algorithm The algorithm to use.
|
|
17
|
+
* @returns The CPU's move.
|
|
18
|
+
*/
|
|
6
19
|
determineCPUMove(difficulty: Omit<PlayerType, "human">, algorithm?: Algorithm): Position;
|
|
20
|
+
/**
|
|
21
|
+
* Finds the optimal move for the current player.
|
|
22
|
+
* @param algorithm The algorithm to use.
|
|
23
|
+
* @param maxDepth The maximum depth to search.
|
|
24
|
+
* @param randomMove The move to return if the board is empty.
|
|
25
|
+
* @returns The optimal move.
|
|
26
|
+
*/
|
|
7
27
|
findOptimalMove({ algorithm, randomMove }?: {
|
|
8
28
|
algorithm: Algorithm;
|
|
9
29
|
randomMove: Position;
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
import Base, { Game } from "../../base/controller.js";
|
|
8
8
|
import Board from "./board.js";
|
|
9
9
|
import Console from "../../console.js";
|
|
10
|
+
/**
|
|
11
|
+
* The default rendering function for TicTacToe.
|
|
12
|
+
* @param controller The controller to render.
|
|
13
|
+
*/
|
|
10
14
|
function defaultRender(controller) {
|
|
11
15
|
Console.clear();
|
|
12
16
|
Console.writeLine(controller.board.toString(false));
|
|
@@ -15,9 +19,21 @@ function defaultRender(controller) {
|
|
|
15
19
|
Console.writeLine(winner === null ? "It's a tie!" : `Player ${winner + 1} wins!`);
|
|
16
20
|
}
|
|
17
21
|
let TicTacToe = class TicTacToe extends Base {
|
|
22
|
+
/**
|
|
23
|
+
* Creates a new TicTacToe game.
|
|
24
|
+
* @param playerOneType The type of player one.
|
|
25
|
+
* @param playerTwoType The type of player two.
|
|
26
|
+
* @param options The options for the game.
|
|
27
|
+
*/
|
|
18
28
|
constructor(playerOneType, playerTwoType, options) {
|
|
19
29
|
super([playerOneType, playerTwoType], new Board(), options?.renderer ?? defaultRender, options?.id, options?.onEnd, options?.onInvalidInput);
|
|
20
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculates the CPU's move.
|
|
33
|
+
* @param difficulty The difficulty of the CPU.
|
|
34
|
+
* @param algorithm The algorithm to use.
|
|
35
|
+
* @returns The CPU's move.
|
|
36
|
+
*/
|
|
21
37
|
determineCPUMove(difficulty, algorithm = "alphabeta") {
|
|
22
38
|
const { emptyCells } = this.board;
|
|
23
39
|
const randomMove = emptyCells[Math.floor(Math.random() * emptyCells.length)];
|
|
@@ -35,6 +51,13 @@ let TicTacToe = class TicTacToe extends Base {
|
|
|
35
51
|
throw new Error("Invalid difficulty.");
|
|
36
52
|
}
|
|
37
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Finds the optimal move for the current player.
|
|
56
|
+
* @param algorithm The algorithm to use.
|
|
57
|
+
* @param maxDepth The maximum depth to search.
|
|
58
|
+
* @param randomMove The move to return if the board is empty.
|
|
59
|
+
* @returns The optimal move.
|
|
60
|
+
*/
|
|
38
61
|
findOptimalMove({ algorithm, randomMove } = { algorithm: "alphabeta", randomMove: { x: 2, y: 2 } }) {
|
|
39
62
|
if (this.board.isEmpty)
|
|
40
63
|
return randomMove;
|
|
@@ -44,6 +67,7 @@ let TicTacToe = class TicTacToe extends Base {
|
|
|
44
67
|
};
|
|
45
68
|
TicTacToe = __decorate([
|
|
46
69
|
Game
|
|
70
|
+
/** A game of TicTacToe. */
|
|
47
71
|
], TicTacToe);
|
|
48
72
|
export default TicTacToe;
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy90aWN0YWN0b2UvY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUd2Qzs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFxQjtJQUN4QyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBRXBDLElBQUksTUFBTSxLQUFLLEtBQUs7UUFDaEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsTUFBTSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUYsQ0FBQztBQUljLElBQU0sU0FBUyxHQUFmLE1BQU0sU0FBVSxTQUFRLElBQUk7SUFDdkM7Ozs7O09BS0c7SUFDSCxZQUFtQixhQUF5QixFQUFFLGFBQXlCLEVBQUUsT0FBZ0M7UUFDckcsS0FBSyxDQUNELENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM5QixJQUFJLEtBQUssRUFBRSxFQUNYLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUNsQyxPQUFPLEVBQUUsRUFBRSxFQUNYLE9BQU8sRUFBRSxLQUFLLEVBQ2QsT0FBTyxFQUFFLGNBQWMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdCQUFnQixDQUFDLFVBQXFDLEVBQUUsWUFBdUIsV0FBVztRQUM3RixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFFLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXBFLFFBQVEsVUFBVSxFQUFFLENBQUM7WUFDakIsS0FBSyxlQUFlO2dCQUNoQixPQUFPLFdBQVcsQ0FBQztZQUN2QixLQUFLLFNBQVM7Z0JBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUMxRCxLQUFLLFdBQVc7Z0JBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUMxRCxLQUFLLFNBQVM7Z0JBQ1YsT0FBTyxVQUFVLENBQUM7WUFDdEI7Z0JBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsS0FHMUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3RELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ2xCLE9BQU8sVUFBVSxDQUFDO1FBRXRCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBRWxDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztJQUN4QixDQUFDO0NBQ0osQ0FBQTtBQTdEb0IsU0FBUztJQUY3QixJQUFJO0lBQ0wsMkJBQTJCO0dBQ04sU0FBUyxDQTZEN0I7ZUE3RG9CLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFsZ29yaXRobSwgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCYXNlLCB7IEdhbWUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCBDb25zb2xlIGZyb20gXCIuLi8uLi9jb25zb2xlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCByZW5kZXJpbmcgZnVuY3Rpb24gZm9yIFRpY1RhY1RvZS5cbiAqIEBwYXJhbSBjb250cm9sbGVyIFRoZSBjb250cm9sbGVyIHRvIHJlbmRlci5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFJlbmRlcihjb250cm9sbGVyOiBUaWNUYWNUb2UpOiB2b2lkIHtcbiAgICBDb25zb2xlLmNsZWFyKCk7XG4gICAgQ29uc29sZS53cml0ZUxpbmUoY29udHJvbGxlci5ib2FyZC50b1N0cmluZyhmYWxzZSkpO1xuICAgIGNvbnN0IHsgd2lubmVyIH0gPSBjb250cm9sbGVyLmJvYXJkO1xuXG4gICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpXG4gICAgICAgIENvbnNvbGUud3JpdGVMaW5lKHdpbm5lciA9PT0gbnVsbCA/IFwiSXQncyBhIHRpZSFcIiA6IGBQbGF5ZXIgJHt3aW5uZXIgKyAxfSB3aW5zIWApO1xufVxuXG5AR2FtZVxuLyoqIEEgZ2FtZSBvZiBUaWNUYWNUb2UuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWNUYWNUb2UgZXh0ZW5kcyBCYXNlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRpY1RhY1RvZSBnYW1lLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJPbmVUeXBlIFRoZSB0eXBlIG9mIHBsYXllciBvbmUuXG4gICAgICogQHBhcmFtIHBsYXllclR3b1R5cGUgVGhlIHR5cGUgb2YgcGxheWVyIHR3by5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgdGhlIGdhbWUuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgW3BsYXllck9uZVR5cGUsIHBsYXllclR3b1R5cGVdLFxuICAgICAgICAgICAgbmV3IEJvYXJkKCksXG4gICAgICAgICAgICBvcHRpb25zPy5yZW5kZXJlciA/PyBkZWZhdWx0UmVuZGVyLFxuICAgICAgICAgICAgb3B0aW9ucz8uaWQsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkVuZCxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uSW52YWxpZElucHV0LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIENQVSdzIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgVGhlIGRpZmZpY3VsdHkgb2YgdGhlIENQVS5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPiwgYWxnb3JpdGhtOiBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiKTogUG9zaXRpb24ge1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIGNvbnN0IHJhbmRvbU1vdmUgPSBlbXB0eUNlbGxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGVtcHR5Q2VsbHMubGVuZ3RoKV0hO1xuICAgICAgICBjb25zdCBvcHRpbWFsTW92ZSA9IHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgYWxnb3JpdGhtLCByYW5kb21Nb3ZlIH0pO1xuXG4gICAgICAgIHN3aXRjaCAoZGlmZmljdWx0eSkge1xuICAgICAgICAgICAgY2FzZSBcImltcG9zc2libGVDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW1hbE1vdmU7XG4gICAgICAgICAgICBjYXNlIFwiaGFyZENQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpIDwgMC44ID8gb3B0aW1hbE1vdmUgOiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgY2FzZSBcIm1lZGl1bUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpIDwgMC41ID8gb3B0aW1hbE1vdmUgOiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgY2FzZSBcImVhc3lDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZG9tTW92ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkaWZmaWN1bHR5LlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IHBsYXllci5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEBwYXJhbSBtYXhEZXB0aCBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHJhbmRvbU1vdmUgVGhlIG1vdmUgdG8gcmV0dXJuIGlmIHRoZSBib2FyZCBpcyBlbXB0eS5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kT3B0aW1hbE1vdmUoeyBhbGdvcml0aG0sIHJhbmRvbU1vdmUgfToge1xuICAgICAgICBhbGdvcml0aG06IEFsZ29yaXRobTtcbiAgICAgICAgcmFuZG9tTW92ZTogUG9zaXRpb247XG4gICAgfSA9IHsgYWxnb3JpdGhtOiBcImFscGhhYmV0YVwiLCByYW5kb21Nb3ZlOiB7IHg6IDIsIHk6IDIgfSB9KTogUG9zaXRpb24ge1xuICAgICAgICBpZiAodGhpcy5ib2FyZC5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHJhbmRvbU1vdmU7XG5cbiAgICAgICAgY29uc3QgbWluaW1heCA9IHRoaXNbYWxnb3JpdGhtXSgpO1xuXG4gICAgICAgIHJldHVybiBtaW5pbWF4Lm1vdmU7XG4gICAgfVxufVxuIl19
|
package/build/index.d.ts
CHANGED
package/build/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { default as TicTacToe } from "./games/tictactoe/controller.js";
|
|
2
2
|
export { default as Connect4 } from "./games/connect4/controller.js";
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsT0FBTyxJQUFJLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBUaWNUYWNUb2UgfSBmcm9tIFwiLi9nYW1lcy90aWN0YWN0b2UvY29udHJvbGxlci5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDb25uZWN0NCB9IGZyb20gXCIuL2dhbWVzL2Nvbm5lY3Q0L2NvbnRyb2xsZXIuanNcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBHYW1lIH0gZnJvbSBcIi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG4iXX0=
|
package/eslint.config.js
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oathompsonjones/mini-games",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
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"
|
|
@@ -12,21 +12,19 @@
|
|
|
12
12
|
"author": "oathompsonjones",
|
|
13
13
|
"license": "MIT",
|
|
14
14
|
"devDependencies": {
|
|
15
|
-
"@oathompsonjones/eslint-config": "^
|
|
16
|
-
"@oathompsonjones/ts-config": "^0.0.
|
|
17
|
-
"@types/node": "^20.
|
|
15
|
+
"@oathompsonjones/eslint-config": "^1.0.9",
|
|
16
|
+
"@oathompsonjones/ts-config": "^0.0.31",
|
|
17
|
+
"@types/node": "^20.11.7",
|
|
18
18
|
"typescript": "^5.3.3",
|
|
19
|
-
"vitest": "^1.
|
|
19
|
+
"vitest": "^1.2.2"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@milahu/patch-package": "^6.4.14",
|
|
23
22
|
"eventemitter3": "^5.0.1"
|
|
24
23
|
},
|
|
25
24
|
"scripts": {
|
|
26
25
|
"lint": "eslint .",
|
|
27
26
|
"test": "vitest run",
|
|
28
27
|
"build": "tsc --project tsconfig.build.json",
|
|
29
|
-
"start": "node ."
|
|
30
|
-
"postinstall": "patch-package"
|
|
28
|
+
"start": "node ."
|
|
31
29
|
}
|
|
32
30
|
}
|