@oathompsonjones/mini-games 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,85 @@
1
+ import BitBoard from "./bitBoard.js";
2
+ import LongInt from "./longInt.js";
3
+ /**
4
+ * A BitBoard which uses an array of 32-bit numbers.
5
+ */
6
+ export default class LongIntBitBoard extends BitBoard {
7
+ constructor(args) {
8
+ switch (true) {
9
+ case args === undefined:
10
+ super(new LongInt(Array(2).fill(0)));
11
+ break;
12
+ case args instanceof LongInt:
13
+ super(args);
14
+ break;
15
+ case args instanceof Uint32Array || args instanceof Array:
16
+ super(new LongInt(args));
17
+ break;
18
+ case typeof args === "number":
19
+ super(new LongInt(Array(args).fill(0)));
20
+ break;
21
+ }
22
+ }
23
+ getBit(bit) {
24
+ return LongInt.rightShift(this._data, bit).and(1).data[0];
25
+ }
26
+ setBit(bit) {
27
+ const mask = LongInt.getMatchingLongInt(this._data, 1)
28
+ .leftShift(bit);
29
+ this._data.or(mask);
30
+ }
31
+ clearBit(bit) {
32
+ const mask = LongInt.getMatchingLongInt(this._data, 1)
33
+ .leftShift(bit)
34
+ .not();
35
+ this._data.and(mask);
36
+ }
37
+ toggleBit(bit) {
38
+ const mask = LongInt.getMatchingLongInt(this._data, 1)
39
+ .leftShift(bit);
40
+ this._data.xor(mask);
41
+ }
42
+ clearAll() {
43
+ for (let i = 0; i < this._data.data.length; i++)
44
+ this._data.data[i] = 0;
45
+ }
46
+ setAll() {
47
+ for (let i = 0; i < this._data.data.length; i++)
48
+ this._data.data[i] = ~0 >>> 0;
49
+ }
50
+ getBits(LSB, numberOfBits) {
51
+ const arr = [];
52
+ const arrLength = Math.ceil(numberOfBits / 32);
53
+ for (let i = 0; i < arrLength - 1; i++)
54
+ arr[i] = ~0 >>> 0;
55
+ arr[arrLength - 1] = 2 ** (numberOfBits - (arrLength - 1) * 32) - 1;
56
+ const mask = LongInt.getMatchingLongInt(this._data, arr).leftShift(LSB);
57
+ const bits = LongInt.rightShift(LongInt.and(this._data, mask), LSB);
58
+ return bits;
59
+ }
60
+ and(right) {
61
+ return new LongIntBitBoard(LongInt.and(this._data, right instanceof LongIntBitBoard ? right.data : right));
62
+ }
63
+ or(right) {
64
+ return new LongIntBitBoard(LongInt.or(this._data, right instanceof LongIntBitBoard ? right.data : right));
65
+ }
66
+ xor(right) {
67
+ return new LongIntBitBoard(LongInt.xor(this._data, right instanceof LongIntBitBoard ? right.data : right));
68
+ }
69
+ not() {
70
+ return new LongIntBitBoard(LongInt.not(this._data));
71
+ }
72
+ leftShift(shiftAmount) {
73
+ return new LongIntBitBoard(LongInt.leftShift(this._data, shiftAmount));
74
+ }
75
+ rightShift(shiftAmount) {
76
+ return new LongIntBitBoard(LongInt.rightShift(this._data, shiftAmount));
77
+ }
78
+ arithmeticRightShift(shiftAmount) {
79
+ return new LongIntBitBoard(LongInt.arithmeticRightShift(this._data, shiftAmount));
80
+ }
81
+ equals(value) {
82
+ return this._data.equals(value instanceof LongIntBitBoard ? value._data : value);
83
+ }
84
+ }
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9uZ0ludEJpdEJvYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2JpdEJvYXJkL2xvbmdJbnRCaXRCb2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRW5DOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxlQUFnQixTQUFRLFFBQWlCO0lBeUIxRCxZQUFtQixJQUFnRDtRQUMvRCxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ1gsS0FBSyxJQUFJLEtBQUssU0FBUztnQkFDbkIsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNO1lBQ1YsS0FBSyxJQUFJLFlBQVksT0FBTztnQkFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNaLE1BQU07WUFDVixLQUFLLElBQUksWUFBWSxXQUFXLElBQUksSUFBSSxZQUFZLEtBQUs7Z0JBQ3JELEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixNQUFNO1lBQ1YsS0FBSyxPQUFPLElBQUksS0FBSyxRQUFRO2dCQUN6QixLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLE1BQU07UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVNLE1BQU0sQ0FBQyxHQUFXO1FBQ3JCLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFVLENBQUM7SUFDdkUsQ0FBQztJ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QUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRCb2FyZCBmcm9tIFwiLi9iaXRCb2FyZC5qc1wiO1xuaW1wb3J0IExvbmdJbnQgZnJvbSBcIi4vbG9uZ0ludC5qc1wiO1xuXG4vKipcbiAqIEEgQml0Qm9hcmQgd2hpY2ggdXNlcyBhbiBhcnJheSBvZiAzMi1iaXQgbnVtYmVycy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ0ludEJpdEJvYXJkIGV4dGVuZHMgQml0Qm9hcmQ8TG9uZ0ludD4ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTG9uZ0ludEJpdEJvYXJkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvbmdJbnQgVGhlIGRhdGEgdG8gZmlsbCB0aGUgQml0Qm9hcmQgd2l0aC5cbiAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihsb25nSW50OiBMb25nSW50KTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIExvbmdJbnRCaXRCb2FyZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1aW50MzJBcnJheSBUaGUgZGF0YSB0byBmaWxsIHRoZSBCaXRCb2FyZCB3aXRoLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih1aW50MzJBcnJheTogVWludDMyQXJyYXkpO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTG9uZ0ludEJpdEJvYXJkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG51bWJlckFycmF5IFRoZSBkYXRhIHRvIGZpbGwgdGhlIEJpdEJvYXJkIHdpdGguXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG51bWJlckFycmF5OiBudW1iZXJbXSk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBMb25nSW50Qml0Qm9hcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIExvbmdJbnQuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGxlbmd0aDogbnVtYmVyKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoYXJncz86IExvbmdJbnQgfCBudW1iZXJbXSB8IFVpbnQzMkFycmF5IHwgbnVtYmVyKSB7XG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgY2FzZSBhcmdzID09PSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAgICAgc3VwZXIobmV3IExvbmdJbnQoQXJyYXkoMikuZmlsbCgwKSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBhcmdzIGluc3RhbmNlb2YgTG9uZ0ludDpcbiAgICAgICAgICAgICAgICBzdXBlcihhcmdzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgYXJncyBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8IGFyZ3MgaW5zdGFuY2VvZiBBcnJheTpcbiAgICAgICAgICAgICAgICBzdXBlcihuZXcgTG9uZ0ludChhcmdzKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHR5cGVvZiBhcmdzID09PSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgIHN1cGVyKG5ldyBMb25nSW50KEFycmF5KGFyZ3MpLmZpbGwoMCkpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCaXQoYml0OiBudW1iZXIpOiAwIHwgMSB7XG4gICAgICAgIHJldHVybiBMb25nSW50LnJpZ2h0U2hpZnQodGhpcy5fZGF0YSwgYml0KS5hbmQoMSkuZGF0YVswXSBhcyAwIHwgMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Qml0KGJpdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBMb25nSW50LmdldE1hdGNoaW5nTG9uZ0ludCh0aGlzLl9kYXRhLCAxKVxuICAgICAgICAgICAgLmxlZnRTaGlmdChiaXQpO1xuICAgICAgICB0aGlzLl9kYXRhLm9yKG1hc2spO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhckJpdChiaXQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXNrID0gTG9uZ0ludC5nZXRNYXRjaGluZ0xvbmdJbnQodGhpcy5fZGF0YSwgMSlcbiAgICAgICAgICAgIC5sZWZ0U2hpZnQoYml0KVxuICAgICAgICAgICAgLm5vdCgpO1xuICAgICAgICB0aGlzLl9kYXRhLmFuZChtYXNrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlQml0KGJpdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBMb25nSW50LmdldE1hdGNoaW5nTG9uZ0ludCh0aGlzLl9kYXRhLCAxKVxuICAgICAgICAgICAgLmxlZnRTaGlmdChiaXQpO1xuICAgICAgICB0aGlzLl9kYXRhLnhvcihtYXNrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGF0YS5kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5fZGF0YS5kYXRhW2ldID0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWxsKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEuZGF0YS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuX2RhdGEuZGF0YVtpXSA9IH4wID4+PiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCaXRzKExTQjogbnVtYmVyLCBudW1iZXJPZkJpdHM6IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICBjb25zdCBhcnI6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IGFyckxlbmd0aCA9IE1hdGguY2VpbChudW1iZXJPZkJpdHMgLyAzMik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyTGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgICAgICAgYXJyW2ldID0gfjAgPj4+IDA7XG4gICAgICAgIGFyclthcnJMZW5ndGggLSAxXSA9IDIgKiogKG51bWJlck9mQml0cyAtIChhcnJMZW5ndGggLSAxKSAqIDMyKSAtIDE7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBMb25nSW50LmdldE1hdGNoaW5nTG9uZ0ludCh0aGlzLl9kYXRhLCBhcnIpLmxlZnRTaGlmdChMU0IpO1xuICAgICAgICBjb25zdCBiaXRzID0gTG9uZ0ludC5yaWdodFNoaWZ0KExvbmdJbnQuYW5kKHRoaXMuX2RhdGEsIG1hc2spLCBMU0IpO1xuICAgICAgICByZXR1cm4gYml0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgYW5kKHJpZ2h0OiBMb25nSW50Qml0Qm9hcmQgfCBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludC5hbmQodGhpcy5fZGF0YSwgcmlnaHQgaW5zdGFuY2VvZiBMb25nSW50Qml0Qm9hcmQgPyByaWdodC5kYXRhIDogcmlnaHQpKSBhcyB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcihyaWdodDogTG9uZ0ludEJpdEJvYXJkIHwgbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnQub3IodGhpcy5fZGF0YSwgcmlnaHQgaW5zdGFuY2VvZiBMb25nSW50Qml0Qm9hcmQgPyByaWdodC5kYXRhIDogcmlnaHQpKSBhcyB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB4b3IocmlnaHQ6IExvbmdJbnRCaXRCb2FyZCB8IG51bWJlcik6IHRoaXMge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50Lnhvcih0aGlzLl9kYXRhLCByaWdodCBpbnN0YW5jZW9mIExvbmdJbnRCaXRCb2FyZCA/IHJpZ2h0LmRhdGEgOiByaWdodCkpIGFzIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG5vdCgpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludC5ub3QodGhpcy5fZGF0YSkpIGFzIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGxlZnRTaGlmdChzaGlmdEFtb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnQubGVmdFNoaWZ0KHRoaXMuX2RhdGEsIHNoaWZ0QW1vdW50KSkgYXMgdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgcmlnaHRTaGlmdChzaGlmdEFtb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnQucmlnaHRTaGlmdCh0aGlzLl9kYXRhLCBzaGlmdEFtb3VudCkpIGFzIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFyaXRobWV0aWNSaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludC5hcml0aG1ldGljUmlnaHRTaGlmdCh0aGlzLl9kYXRhLCBzaGlmdEFtb3VudCkpIGFzIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGVxdWFscyh2YWx1ZTogTG9uZ0ludCB8IExvbmdJbnRCaXRCb2FyZCB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5lcXVhbHModmFsdWUgaW5zdGFuY2VvZiBMb25nSW50Qml0Qm9hcmQgPyB2YWx1ZS5fZGF0YSA6IHZhbHVlKTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Reads from the console.
3
+ *
4
+ * @param prompt The question to get the answer to.
5
+ * @returns The value read.
6
+ */
7
+ declare function readLine(prompt?: string): Promise<string>;
8
+ /**
9
+ * Writes to the console.
10
+ *
11
+ * @param text The text to write.
12
+ */
13
+ declare function writeLine(...text: string[]): void;
14
+ /**
15
+ * Clears the console.
16
+ */
17
+ declare function clear(): void;
18
+ declare const _default: {
19
+ clear: typeof clear;
20
+ readLine: typeof readLine;
21
+ writeLine: typeof writeLine;
22
+ };
23
+ export default _default;
@@ -0,0 +1,30 @@
1
+ /* eslint-disable no-console */
2
+ import readline from "readline/promises";
3
+ /**
4
+ * Reads from the console.
5
+ *
6
+ * @param prompt The question to get the answer to.
7
+ * @returns The value read.
8
+ */
9
+ async function readLine(prompt = "") {
10
+ const reader = readline.createInterface(process.stdin, process.stdout);
11
+ const input = await reader.question(prompt);
12
+ reader.close();
13
+ return input;
14
+ }
15
+ /**
16
+ * Writes to the console.
17
+ *
18
+ * @param text The text to write.
19
+ */
20
+ function writeLine(...text) {
21
+ return console.log(...text);
22
+ }
23
+ /**
24
+ * Clears the console.
25
+ */
26
+ function clear() {
27
+ return console.clear();
28
+ }
29
+ export default { clear, readLine, writeLine };
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUV6Qzs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxRQUFRLENBQUMsU0FBaUIsRUFBRTtJQUN2QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsU0FBUyxDQUFDLEdBQUcsSUFBYztJQUNoQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLEtBQUs7SUFDVixPQUFPLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUMzQixDQUFDO0FBRUQsZUFBZSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgcmVhZGxpbmUgZnJvbSBcInJlYWRsaW5lL3Byb21pc2VzXCI7XG5cbi8qKlxuICogUmVhZHMgZnJvbSB0aGUgY29uc29sZS5cbiAqXG4gKiBAcGFyYW0gcHJvbXB0IFRoZSBxdWVzdGlvbiB0byBnZXQgdGhlIGFuc3dlciB0by5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSByZWFkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkTGluZShwcm9tcHQ6IHN0cmluZyA9IFwiXCIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlYWRlciA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCk7XG4gICAgY29uc3QgaW5wdXQgPSBhd2FpdCByZWFkZXIucXVlc3Rpb24ocHJvbXB0KTtcbiAgICByZWFkZXIuY2xvc2UoKTtcbiAgICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogV3JpdGVzIHRvIHRoZSBjb25zb2xlLlxuICpcbiAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIHdyaXRlLlxuICovXG5mdW5jdGlvbiB3cml0ZUxpbmUoLi4udGV4dDogc3RyaW5nW10pOiB2b2lkIHtcbiAgICByZXR1cm4gY29uc29sZS5sb2coLi4udGV4dCk7XG59XG5cbi8qKlxuICogQ2xlYXJzIHRoZSBjb25zb2xlLlxuICovXG5mdW5jdGlvbiBjbGVhcigpOiB2b2lkIHtcbiAgICByZXR1cm4gY29uc29sZS5jbGVhcigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7IGNsZWFyLCByZWFkTGluZSwgd3JpdGVMaW5lIH07XG4iXX0=
@@ -0,0 +1,15 @@
1
+ import Base from "../../base/board.js";
2
+ import LongIntBitBoard from "../../bitBoard/longIntBitBoard.js";
3
+ import type { Position } from "../../base/board.js";
4
+ export default class Board extends Base<LongIntBitBoard> {
5
+ protected winningStates: LongIntBitBoard[];
6
+ private readonly FULL_BOARD;
7
+ private readonly HORIZONTAL;
8
+ private readonly VERTICAL;
9
+ private readonly LEADING_DIAGONAL;
10
+ private readonly NON_LEADING_DIAGONAL;
11
+ constructor();
12
+ get heuristic(): number;
13
+ get emptyCells(): Position[];
14
+ makeMove(move: Position, playerId: number): void;
15
+ }
@@ -0,0 +1,88 @@
1
+ import Base from "../../base/board.js";
2
+ import LongInt from "../../bitBoard/longInt.js";
3
+ import LongIntBitBoard from "../../bitBoard/longIntBitBoard.js";
4
+ export default class Board extends Base {
5
+ winningStates = [];
6
+ FULL_BOARD = new LongInt([0b1111_1111111_1111111_1111111_1111111, 0b1111111_111]);
7
+ HORIZONTAL = new LongInt([0b0000_0000000_0000000_0000000_0001111, 0b0000000_000]);
8
+ VERTICAL = new LongInt([0b0000_0000001_0000001_0000001_0000001, 0b0000000_000]);
9
+ LEADING_DIAGONAL = new LongInt([0b0000_0001000_0000100_0000010_0000001, 0b0000000_000]);
10
+ NON_LEADING_DIAGONAL = new LongInt([0b0000_0000001_0000010_0000100_0001000, 0b0000000_000]);
11
+ constructor() {
12
+ super(7, 6);
13
+ for (let i = 0; i < 4; i++) {
14
+ for (let j = 0; j < 6; j++) {
15
+ this.winningStates.push(new LongIntBitBoard(LongInt
16
+ .leftShift(this.HORIZONTAL, i + 7 * j)
17
+ .and(this.FULL_BOARD)));
18
+ }
19
+ }
20
+ for (let i = 0; i < 7; i++) {
21
+ for (let j = 0; j < 3; j++) {
22
+ this.winningStates.push(new LongIntBitBoard(LongInt
23
+ .leftShift(this.VERTICAL, i + 7 * j)
24
+ .and(this.FULL_BOARD)));
25
+ }
26
+ }
27
+ for (let i = 0; i < 4; i++) {
28
+ for (let j = 0; j < 3; j++) {
29
+ this.winningStates.push(new LongIntBitBoard(LongInt
30
+ .leftShift(this.LEADING_DIAGONAL, i + 7 * j)
31
+ .and(this.FULL_BOARD)));
32
+ }
33
+ }
34
+ for (let i = 0; i < 4; i++) {
35
+ for (let j = 0; j < 3; j++) {
36
+ this.winningStates.push(new LongIntBitBoard(LongInt
37
+ .leftShift(this.NON_LEADING_DIAGONAL, i + 7 * j)
38
+ .and(this.FULL_BOARD)));
39
+ }
40
+ }
41
+ }
42
+ get heuristic() {
43
+ const { winner } = this;
44
+ if (winner === 0)
45
+ return 1000;
46
+ if (winner === 1)
47
+ return -1000;
48
+ const p0LineOfThreeNoGaps = this.hasLine(0, 3);
49
+ const p1LineOfThreeNoGaps = this.hasLine(1, 3);
50
+ const p0LineOfThreeOneGap = this.hasLine(0, 3, 1);
51
+ const p1LineOfThreeOneGap = this.hasLine(1, 3, 1);
52
+ const p0LineOfThreeTwoGaps = this.hasLine(0, 3, 2);
53
+ const p1LineOfThreeTwoGaps = this.hasLine(1, 3, 2);
54
+ const p0LineOfTwoNoGaps = this.hasLine(0, 2);
55
+ const p1LineOfTwoNoGaps = this.hasLine(1, 2);
56
+ const p0LineOfTwoOneGap = this.hasLine(0, 2, 1);
57
+ const p1LineOfTwoOneGap = this.hasLine(1, 2, 1);
58
+ const p0LineOfTwoTwoGaps = this.hasLine(0, 2, 2);
59
+ const p1LineOfTwoTwoGaps = this.hasLine(1, 2, 2);
60
+ const p0LineOfThreeScore = 3 * p0LineOfThreeNoGaps + 2 * p0LineOfThreeOneGap + p0LineOfThreeTwoGaps;
61
+ const p1LineOfThreeScore = 3 * p1LineOfThreeNoGaps + 2 * p1LineOfThreeOneGap + p1LineOfThreeTwoGaps;
62
+ const p0LineOfTwoScore = 3 * p0LineOfTwoNoGaps + 2 * p0LineOfTwoOneGap + p0LineOfTwoTwoGaps;
63
+ const p1LineOfTwoScore = 3 * p1LineOfTwoNoGaps + 2 * p1LineOfTwoOneGap + p1LineOfTwoTwoGaps;
64
+ const p0Score = 10 * p0LineOfThreeScore + p0LineOfTwoScore;
65
+ const p1Score = 10 * p1LineOfThreeScore + p1LineOfTwoScore;
66
+ return p0Score - p1Score;
67
+ }
68
+ get emptyCells() {
69
+ const emptyCells = [];
70
+ for (let x = 0; x < this.boardWidth; x++) {
71
+ const cell = { x, y: 0 };
72
+ if (this.cellOccupier(cell) === null)
73
+ emptyCells.push(cell);
74
+ }
75
+ return emptyCells;
76
+ }
77
+ makeMove(move, playerId) {
78
+ const updatedMove = move;
79
+ for (let i = 5; i >= 0; i--) {
80
+ if (this.cellOccupier({ x: move.x, y: i }) === null) {
81
+ move.y = i;
82
+ break;
83
+ }
84
+ }
85
+ super.makeMove(updatedMove, playerId);
86
+ }
87
+ }
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsTUFBTSxDQUFDLE9BQU8sT0FBTyxLQUFNLFNBQVEsSUFBcUI7SUFDMUMsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFL0IsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWxGLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFaEYsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRXhGLG9CQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUU3RztRQUNJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxPQUFPO3FCQUM5QyxTQUFTLENB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O0lBRUQsSUFBb0IsVUFBVTtRQUMxQixNQUFNLFVBQVUsR0FBZSxFQUFFLENBQUM7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksR0FBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUk7Z0JBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFZSxRQUFRLENBQUMsSUFBYyxFQUFFLFFBQWdCO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNYLE1BQU07WUFDVixDQUFDO1FBQ0wsQ0FBQztRQUNELEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlIGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5pbXBvcnQgTG9uZ0ludCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvbG9uZ0ludC5qc1wiO1xuaW1wb3J0IExvbmdJbnRCaXRCb2FyZCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvbG9uZ0ludEJpdEJvYXJkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9hcmQgZXh0ZW5kcyBCYXNlPExvbmdJbnRCaXRCb2FyZD4ge1xuICAgIHByb3RlY3RlZCB3aW5uaW5nU3RhdGVzOiBMb25nSW50Qml0Qm9hcmRbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBGVUxMX0JPQVJEID0gbmV3IExvbmdJbnQoWzBiMTExMV8xMTExMTExXzExMTExMTFfMTExMTExMV8xMTExMTExLCAwYjExMTExMTFfMTExXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IEhPUklaT05UQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDBfMDAwMDAwMF8wMDAwMDAwXzAwMDExMTEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgVkVSVElDQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDFfMDAwMDAwMV8wMDAwMDAxXzAwMDAwMDEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMTAwMF8wMDAwMTAwXzAwMDAwMTBfMDAwMDAwMSwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBOT05fTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMDAwMV8wMDAwMDEwXzAwMDAxMDBfMDAwMTAwMCwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcig3LCA2KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNjsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5IT1JJWk9OVEFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuVkVSVElDQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5MRUFESU5HX0RJQUdPTkFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuTk9OX0xFQURJTkdfRElBR09OQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhldXJpc3RpYygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcztcbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAxMDAwO1xuICAgICAgICBpZiAod2lubmVyID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIC0xMDAwO1xuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlTm9HYXBzID0gdGhpcy5oYXNMaW5lKDAsIDMpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlTm9HYXBzID0gdGhpcy5oYXNMaW5lKDEsIDMpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlT25lR2FwID0gdGhpcy5oYXNMaW5lKDAsIDMsIDEpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlT25lR2FwID0gdGhpcy5oYXNMaW5lKDEsIDMsIDEpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlVHdvR2FwcyA9IHRoaXMuaGFzTGluZSgwLCAzLCAyKTtcbiAgICAgICAgY29uc3QgcDFMaW5lT2ZUaHJlZVR3b0dhcHMgPSB0aGlzLmhhc0xpbmUoMSwgMywgMik7XG4gICAgICAgIGNvbnN0IHAwTGluZU9mVHdvTm9HYXBzID0gdGhpcy5oYXNMaW5lKDAsIDIpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlR3b05vR2FwcyA9IHRoaXMuaGFzTGluZSgxLCAyKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUd29PbmVHYXAgPSB0aGlzLmhhc0xpbmUoMCwgMiwgMSk7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvT25lR2FwID0gdGhpcy5oYXNMaW5lKDEsIDIsIDEpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlR3b1R3b0dhcHMgPSB0aGlzLmhhc0xpbmUoMCwgMiwgMik7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvVHdvR2FwcyA9IHRoaXMuaGFzTGluZSgxLCAyLCAyKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUaHJlZVNjb3JlID0gMyAqIHAwTGluZU9mVGhyZWVOb0dhcHMgKyAyICogcDBMaW5lT2ZUaHJlZU9uZUdhcCArIHAwTGluZU9mVGhyZWVUd29HYXBzO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlU2NvcmUgPSAzICogcDFMaW5lT2ZUaHJlZU5vR2FwcyArIDIgKiBwMUxpbmVPZlRocmVlT25lR2FwICsgcDFMaW5lT2ZUaHJlZVR3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAwTGluZU9mVHdvU2NvcmUgPSAzICogcDBMaW5lT2ZUd29Ob0dhcHMgKyAyICogcDBMaW5lT2ZUd29PbmVHYXAgKyBwMExpbmVPZlR3b1R3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvU2NvcmUgPSAzICogcDFMaW5lT2ZUd29Ob0dhcHMgKyAyICogcDFMaW5lT2ZUd29PbmVHYXAgKyBwMUxpbmVPZlR3b1R3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAwU2NvcmUgPSAxMCAqIHAwTGluZU9mVGhyZWVTY29yZSArIHAwTGluZU9mVHdvU2NvcmU7XG4gICAgICAgIGNvbnN0IHAxU2NvcmUgPSAxMCAqIHAxTGluZU9mVGhyZWVTY29yZSArIHAxTGluZU9mVHdvU2NvcmU7XG4gICAgICAgIHJldHVybiBwMFNjb3JlIC0gcDFTY29yZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGVtcHR5Q2VsbHMoKTogUG9zaXRpb25bXSB7XG4gICAgICAgIGNvbnN0IGVtcHR5Q2VsbHM6IFBvc2l0aW9uW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLmJvYXJkV2lkdGg7IHgrKykge1xuICAgICAgICAgICAgY29uc3QgY2VsbDogUG9zaXRpb24gPSB7IHgsIHk6IDAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNlbGxPY2N1cGllcihjZWxsKSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goY2VsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIG1ha2VNb3ZlKG1vdmU6IFBvc2l0aW9uLCBwbGF5ZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRNb3ZlID0gbW92ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDU7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsT2NjdXBpZXIoeyB4OiBtb3ZlLngsIHk6IGkgfSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtb3ZlLnkgPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm1ha2VNb3ZlKHVwZGF0ZWRNb3ZlLCBwbGF5ZXJJZCk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,11 @@
1
+ import type { Algorithm, GameConstructorOptions, PlayerType } from "../../base/controller.js";
2
+ import Base from "../../base/controller.js";
3
+ import type { Position } from "../../base/board.js";
4
+ export default class Connect4 extends Base {
5
+ constructor(playerOneType: PlayerType, playerTwoType: PlayerType, options?: GameConstructorOptions);
6
+ determineCPUMove(difficulty: Omit<PlayerType, "human">, algorithm?: Algorithm): Position;
7
+ findOptimalMove(options?: {
8
+ algorithm?: Algorithm;
9
+ maxDepth?: number;
10
+ }): Position;
11
+ }
@@ -0,0 +1,49 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import Base, { Game } from "../../base/controller.js";
8
+ import Board from "./board.js";
9
+ import Console from "../../console.js";
10
+ function defaultRender(controller) {
11
+ Console.clear();
12
+ Console.writeLine(controller.board.toString(true, true, false, ["⬤ ", "⬤ "]));
13
+ const { winner } = controller.board;
14
+ if (winner !== false)
15
+ Console.writeLine(winner === null ? "It's a tie!" : `Player ${winner + 1} wins!`);
16
+ }
17
+ let Connect4 = class Connect4 extends Base {
18
+ constructor(playerOneType, playerTwoType, options) {
19
+ super([playerOneType, playerTwoType], new Board(), options?.renderer ?? defaultRender, options?.id, options?.onEnd, options?.onInvalidInput);
20
+ }
21
+ determineCPUMove(difficulty, algorithm = "alphabeta") {
22
+ const { emptyCells } = this.board;
23
+ const randomMove = emptyCells[Math.floor(Math.random() * emptyCells.length)];
24
+ switch (difficulty) {
25
+ case "impossibleCPU":
26
+ return this.findOptimalMove({ algorithm, maxDepth: 10 });
27
+ case "hardCPU":
28
+ return this.findOptimalMove({ algorithm, maxDepth: 5 });
29
+ case "mediumCPU":
30
+ return this.findOptimalMove({ algorithm, maxDepth: 3 });
31
+ case "easyCPU":
32
+ return randomMove;
33
+ default:
34
+ throw new Error("Invalid difficulty.");
35
+ }
36
+ }
37
+ findOptimalMove(options) {
38
+ const { maxDepth = Infinity, algorithm = "alphabeta" } = options ?? {};
39
+ if (this.board.isEmpty)
40
+ return { x: 3, y: 5 };
41
+ const minimax = this[algorithm](maxDepth);
42
+ return minimax.move;
43
+ }
44
+ };
45
+ Connect4 = __decorate([
46
+ Game
47
+ ], Connect4);
48
+ export default Connect4;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBR3ZDLFNBQVMsYUFBYSxDQUFDLFVBQW9CO0lBQ3ZDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQixPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sS0FBSyxLQUFLO1FBQ2hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFGLENBQUM7QUFHYyxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxJQUFJO0lBQ3RDLFlBQW1CLGFBQXlCLEVBQUUsYUFBeUIsRUFBRSxPQUFnQztRQUNyRyxLQUFLLENBQ0QsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQzlCLElBQUksS0FBSyxFQUFFLEVBQ1gsT0FBTyxFQUFFLFFBQVEsSUFBSSxhQUFhLEVBQ2xDLE9BQU8sRUFBRSxFQUFFLEVBQ1gsT0FBTyxFQUFFLEtBQUssRUFDZCxPQUFPLEVBQUUsY0FBYyxDQUMxQixDQUFDO0lBQ04sQ0FBQztJQUVNLGdCQUFnQixDQUFDLFVBQXFDLEVBQUUsWUFBdUIsV0FBVztRQUM3RixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFFLENBQUM7UUFDOUUsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNqQixLQUFLLGVBQWU7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3RCxLQUFLLFNBQVM7Z0JBQ1YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUQsS0FBSyxTQUFTO2dCQUNWLE9BQU8sVUFBVSxDQUFDO1lBQ3RCO2dCQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGVBQWUsQ0FBQyxPQUd0QjtRQUNHLE1BQU0sRUFBRSxRQUFRLEdBQUcsUUFBUSxFQUFFLFNBQVMsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3ZFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ2xCLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7Q0FDSixDQUFBO0FBdkNvQixRQUFRO0lBRDVCLElBQUk7R0FDZ0IsUUFBUSxDQXVDNUI7ZUF2Q29CLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFsZ29yaXRobSwgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCYXNlLCB7IEdhbWUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCBDb25zb2xlIGZyb20gXCIuLi8uLi9jb25zb2xlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcblxuZnVuY3Rpb24gZGVmYXVsdFJlbmRlcihjb250cm9sbGVyOiBDb25uZWN0NCk6IHZvaWQge1xuICAgIENvbnNvbGUuY2xlYXIoKTtcbiAgICBDb25zb2xlLndyaXRlTGluZShjb250cm9sbGVyLmJvYXJkLnRvU3RyaW5nKHRydWUsIHRydWUsIGZhbHNlLCBbXCLirKQgXCIsIFwi4qykIFwiXSkpO1xuICAgIGNvbnN0IHsgd2lubmVyIH0gPSBjb250cm9sbGVyLmJvYXJkO1xuICAgIGlmICh3aW5uZXIgIT09IGZhbHNlKVxuICAgICAgICBDb25zb2xlLndyaXRlTGluZSh3aW5uZXIgPT09IG51bGwgPyBcIkl0J3MgYSB0aWUhXCIgOiBgUGxheWVyICR7d2lubmVyICsgMX0gd2lucyFgKTtcbn1cblxuQEdhbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbm5lY3Q0IGV4dGVuZHMgQmFzZSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgW3BsYXllck9uZVR5cGUsIHBsYXllclR3b1R5cGVdLFxuICAgICAgICAgICAgbmV3IEJvYXJkKCksXG4gICAgICAgICAgICBvcHRpb25zPy5yZW5kZXJlciA/PyBkZWZhdWx0UmVuZGVyLFxuICAgICAgICAgICAgb3B0aW9ucz8uaWQsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkVuZCxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uSW52YWxpZElucHV0XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGRldGVybWluZUNQVU1vdmUoZGlmZmljdWx0eTogT21pdDxQbGF5ZXJUeXBlLCBcImh1bWFuXCI+LCBhbGdvcml0aG06IEFsZ29yaXRobSA9IFwiYWxwaGFiZXRhXCIpOiBQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IHsgZW1wdHlDZWxscyB9ID0gdGhpcy5ib2FyZDtcbiAgICAgICAgY29uc3QgcmFuZG9tTW92ZSA9IGVtcHR5Q2VsbHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZW1wdHlDZWxscy5sZW5ndGgpXSE7XG4gICAgICAgIHN3aXRjaCAoZGlmZmljdWx0eSkge1xuICAgICAgICAgICAgY2FzZSBcImltcG9zc2libGVDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBhbGdvcml0aG0sIG1heERlcHRoOiAxMCB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJoYXJkQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgYWxnb3JpdGhtLCBtYXhEZXB0aDogNSB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJtZWRpdW1DUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBhbGdvcml0aG0sIG1heERlcHRoOiAzIH0pO1xuICAgICAgICAgICAgY2FzZSBcImVhc3lDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZG9tTW92ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkaWZmaWN1bHR5LlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kT3B0aW1hbE1vdmUob3B0aW9ucz86IHtcbiAgICAgICAgYWxnb3JpdGhtPzogQWxnb3JpdGhtO1xuICAgICAgICBtYXhEZXB0aD86IG51bWJlcjtcbiAgICB9KTogUG9zaXRpb24ge1xuICAgICAgICBjb25zdCB7IG1heERlcHRoID0gSW5maW5pdHksIGFsZ29yaXRobSA9IFwiYWxwaGFiZXRhXCIgfSA9IG9wdGlvbnMgPz8ge307XG4gICAgICAgIGlmICh0aGlzLmJvYXJkLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4geyB4OiAzLCB5OiA1IH07XG4gICAgICAgIGNvbnN0IG1pbmltYXggPSB0aGlzW2FsZ29yaXRobV0obWF4RGVwdGgpO1xuICAgICAgICByZXR1cm4gbWluaW1heC5tb3ZlO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import Base from "../../base/board.js";
2
+ import IntBitBoard from "../../bitBoard/intBitBoard.js";
3
+ export default class Board extends Base<IntBitBoard> {
4
+ protected winningStates: IntBitBoard[];
5
+ constructor();
6
+ get heuristic(): number;
7
+ }
@@ -0,0 +1,18 @@
1
+ import Base from "../../base/board.js";
2
+ import IntBitBoard from "../../bitBoard/intBitBoard.js";
3
+ export default class Board extends Base {
4
+ winningStates = [0x007, 0x038, 0x1C0, 0x049, 0x092, 0x124, 0x111, 0x054]
5
+ .map((data) => new IntBitBoard(data));
6
+ constructor() {
7
+ super(3, 3);
8
+ }
9
+ get heuristic() {
10
+ const { winner } = this;
11
+ if (winner === 0)
12
+ return 1;
13
+ if (winner === 1)
14
+ return -1;
15
+ return 0;
16
+ }
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvdGljdGFjdG9lL2JvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZDLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBRXhELE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLElBQWlCO0lBQ3RDLGFBQWEsR0FBa0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQzVGLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUxQztRQUNJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNoQixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksTUFBTSxLQUFLLENBQUM7WUFDWixPQUFPLENBQUMsQ0FBQztRQUNiLElBQUksTUFBTSxLQUFLLENBQUM7WUFDWixPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2QsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuaW1wb3J0IEludEJpdEJvYXJkIGZyb20gXCIuLi8uLi9iaXRCb2FyZC9pbnRCaXRCb2FyZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb2FyZCBleHRlbmRzIEJhc2U8SW50Qml0Qm9hcmQ+IHtcbiAgICBwcm90ZWN0ZWQgd2lubmluZ1N0YXRlczogSW50Qml0Qm9hcmRbXSA9IFsweDAwNywgMHgwMzgsIDB4MUMwLCAweDA0OSwgMHgwOTIsIDB4MTI0LCAweDExMSwgMHgwNTRdXG4gICAgICAgIC5tYXAoKGRhdGEpID0+IG5ldyBJbnRCaXRCb2FyZChkYXRhKSk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDMsIDMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGV1cmlzdGljKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHsgd2lubmVyIH0gPSB0aGlzO1xuICAgICAgICBpZiAod2lubmVyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIGlmICh3aW5uZXIgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import type { Algorithm, GameConstructorOptions, PlayerType } from "../../base/controller.js";
2
+ import Base from "../../base/controller.js";
3
+ import type { Position } from "../../base/board.js";
4
+ export default class TicTacToe extends Base {
5
+ constructor(playerOneType: PlayerType, playerTwoType: PlayerType, options?: GameConstructorOptions);
6
+ determineCPUMove(difficulty: Omit<PlayerType, "human">, algorithm?: Algorithm): Position;
7
+ findOptimalMove({ algorithm, randomMove }?: {
8
+ algorithm: Algorithm;
9
+ randomMove: Position;
10
+ }): Position;
11
+ }
@@ -0,0 +1,49 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import Base, { Game } from "../../base/controller.js";
8
+ import Board from "./board.js";
9
+ import Console from "../../console.js";
10
+ function defaultRender(controller) {
11
+ Console.clear();
12
+ Console.writeLine(controller.board.toString(false));
13
+ const { winner } = controller.board;
14
+ if (winner !== false)
15
+ Console.writeLine(winner === null ? "It's a tie!" : `Player ${winner + 1} wins!`);
16
+ }
17
+ let TicTacToe = class TicTacToe extends Base {
18
+ constructor(playerOneType, playerTwoType, options) {
19
+ super([playerOneType, playerTwoType], new Board(), options?.renderer ?? defaultRender, options?.id, options?.onEnd, options?.onInvalidInput);
20
+ }
21
+ determineCPUMove(difficulty, algorithm = "alphabeta") {
22
+ const { emptyCells } = this.board;
23
+ const randomMove = emptyCells[Math.floor(Math.random() * emptyCells.length)];
24
+ const optimalMove = this.findOptimalMove({ algorithm, randomMove });
25
+ switch (difficulty) {
26
+ case "impossibleCPU":
27
+ return optimalMove;
28
+ case "hardCPU":
29
+ return Math.random() < 0.8 ? optimalMove : randomMove;
30
+ case "mediumCPU":
31
+ return Math.random() < 0.5 ? optimalMove : randomMove;
32
+ case "easyCPU":
33
+ return randomMove;
34
+ default:
35
+ throw new Error("Invalid difficulty.");
36
+ }
37
+ }
38
+ findOptimalMove({ algorithm, randomMove } = { algorithm: "alphabeta", randomMove: { x: 2, y: 2 } }) {
39
+ if (this.board.isEmpty)
40
+ return randomMove;
41
+ const minimax = this[algorithm]();
42
+ return minimax.move;
43
+ }
44
+ };
45
+ TicTacToe = __decorate([
46
+ Game
47
+ ], TicTacToe);
48
+ export default TicTacToe;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy90aWN0YWN0b2UvY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUd2QyxTQUFTLGFBQWEsQ0FBQyxVQUFxQjtJQUN4QyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ3BDLElBQUksTUFBTSxLQUFLLEtBQUs7UUFDaEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsTUFBTSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUYsQ0FBQztBQUdjLElBQU0sU0FBUyxHQUFmLE1BQU0sU0FBVSxTQUFRLElBQUk7SUFDdkMsWUFBbUIsYUFBeUIsRUFBRSxhQUF5QixFQUFFLE9BQWdDO1FBQ3JHLEtBQUssQ0FDRCxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsRUFDOUIsSUFBSSxLQUFLLEVBQUUsRUFDWCxPQUFPLEVBQUUsUUFBUSxJQUFJLGFBQWEsRUFDbEMsT0FBTyxFQUFFLEVBQUUsRUFDWCxPQUFPLEVBQUUsS0FBSyxFQUNkLE9BQU8sRUFBRSxjQUFjLENBQzFCLENBQUM7SUFDTixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsVUFBcUMsRUFBRSxZQUF1QixXQUFXO1FBQzdGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQztRQUM5RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDcEUsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNqQixLQUFLLGVBQWU7Z0JBQ2hCLE9BQU8sV0FBVyxDQUFDO1lBQ3ZCLEtBQUssU0FBUztnQkFDVixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFTSxlQUFlLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxLQUcxQyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDbEIsT0FBTyxVQUFVLENBQUM7UUFDdEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7Q0FDSixDQUFBO0FBdkNvQixTQUFTO0lBRDdCLElBQUk7R0FDZ0IsU0FBUyxDQXVDN0I7ZUF2Q29CLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFsZ29yaXRobSwgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCYXNlLCB7IEdhbWUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCBDb25zb2xlIGZyb20gXCIuLi8uLi9jb25zb2xlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcblxuZnVuY3Rpb24gZGVmYXVsdFJlbmRlcihjb250cm9sbGVyOiBUaWNUYWNUb2UpOiB2b2lkIHtcbiAgICBDb25zb2xlLmNsZWFyKCk7XG4gICAgQ29uc29sZS53cml0ZUxpbmUoY29udHJvbGxlci5ib2FyZC50b1N0cmluZyhmYWxzZSkpO1xuICAgIGNvbnN0IHsgd2lubmVyIH0gPSBjb250cm9sbGVyLmJvYXJkO1xuICAgIGlmICh3aW5uZXIgIT09IGZhbHNlKVxuICAgICAgICBDb25zb2xlLndyaXRlTGluZSh3aW5uZXIgPT09IG51bGwgPyBcIkl0J3MgYSB0aWUhXCIgOiBgUGxheWVyICR7d2lubmVyICsgMX0gd2lucyFgKTtcbn1cblxuQEdhbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpY1RhY1RvZSBleHRlbmRzIEJhc2Uge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwbGF5ZXJPbmVUeXBlOiBQbGF5ZXJUeXBlLCBwbGF5ZXJUd29UeXBlOiBQbGF5ZXJUeXBlLCBvcHRpb25zPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIFtwbGF5ZXJPbmVUeXBlLCBwbGF5ZXJUd29UeXBlXSxcbiAgICAgICAgICAgIG5ldyBCb2FyZCgpLFxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyZXIgPz8gZGVmYXVsdFJlbmRlcixcbiAgICAgICAgICAgIG9wdGlvbnM/LmlkLFxuICAgICAgICAgICAgb3B0aW9ucz8ub25FbmQsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkludmFsaWRJbnB1dFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPiwgYWxnb3JpdGhtOiBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiKTogUG9zaXRpb24ge1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIGNvbnN0IHJhbmRvbU1vdmUgPSBlbXB0eUNlbGxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGVtcHR5Q2VsbHMubGVuZ3RoKV0hO1xuICAgICAgICBjb25zdCBvcHRpbWFsTW92ZSA9IHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgYWxnb3JpdGhtLCByYW5kb21Nb3ZlIH0pO1xuICAgICAgICBzd2l0Y2ggKGRpZmZpY3VsdHkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJpbXBvc3NpYmxlQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGltYWxNb3ZlO1xuICAgICAgICAgICAgY2FzZSBcImhhcmRDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSA8IDAuOCA/IG9wdGltYWxNb3ZlIDogcmFuZG9tTW92ZTtcbiAgICAgICAgICAgIGNhc2UgXCJtZWRpdW1DUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSA8IDAuNSA/IG9wdGltYWxNb3ZlIDogcmFuZG9tTW92ZTtcbiAgICAgICAgICAgIGNhc2UgXCJlYXN5Q1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGlmZmljdWx0eS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZE9wdGltYWxNb3ZlKHsgYWxnb3JpdGhtLCByYW5kb21Nb3ZlIH06IHtcbiAgICAgICAgYWxnb3JpdGhtOiBBbGdvcml0aG07XG4gICAgICAgIHJhbmRvbU1vdmU6IFBvc2l0aW9uO1xuICAgIH0gPSB7IGFsZ29yaXRobTogXCJhbHBoYWJldGFcIiwgcmFuZG9tTW92ZTogeyB4OiAyLCB5OiAyIH0gfSk6IFBvc2l0aW9uIHtcbiAgICAgICAgaWYgKHRoaXMuYm9hcmQuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybiByYW5kb21Nb3ZlO1xuICAgICAgICBjb25zdCBtaW5pbWF4ID0gdGhpc1thbGdvcml0aG1dKCk7XG4gICAgICAgIHJldHVybiBtaW5pbWF4Lm1vdmU7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export * from "./games/tictactoe/controller.js";
2
+ export * from "./games/connect4/controller.js";
package/build/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./games/tictactoe/controller.js";
2
+ export * from "./games/connect4/controller.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGdDQUFnQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZ2FtZXMvdGljdGFjdG9lL2NvbnRyb2xsZXIuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dhbWVzL2Nvbm5lY3Q0L2NvbnRyb2xsZXIuanNcIjtcbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@oathompsonjones/mini-games",
3
+ "version": "1.0.0",
4
+ "description": "A selection of MiniGames. You will soon be able to play these games on [my website](https://oathompsonjones.co.uk/arcade).",
5
+ "repository": {
6
+ "url": "https://github.com/oathompsonjones/MiniGames.git"
7
+ },
8
+ "main": "./build/index.js",
9
+ "types": "./build/index.d.ts",
10
+ "exports": "./build/index.js",
11
+ "type": "module",
12
+ "author": "oathompsonjones",
13
+ "license": "MIT",
14
+ "devDependencies": {
15
+ "@oathompsonjones/eslint-config": "^0.0.72",
16
+ "@oathompsonjones/ts-config": "^0.0.27",
17
+ "@types/node": "^20.10.5",
18
+ "typescript": "^5.3.3",
19
+ "vitest": "^1.1.0"
20
+ },
21
+ "dependencies": {
22
+ "@milahu/patch-package": "^6.4.14",
23
+ "eventemitter3": "^5.0.1"
24
+ },
25
+ "scripts": {
26
+ "lint": "eslint .",
27
+ "test": "vitest run",
28
+ "build": "tsc --project tsconfig.build.json",
29
+ "start": "node .",
30
+ "postinstall": "patch-package"
31
+ }
32
+ }
@@ -0,0 +1,49 @@
1
+ # generated by patch-package 6.4.14
2
+ #
3
+ # declared package:
4
+ # eventemitter3: ^5.0.1
5
+ #
6
+ diff --git a/node_modules/eventemitter3/index.d.ts b/node_modules/eventemitter3/index.d.ts
7
+ index fab37fd..f020700 100644
8
+ --- a/node_modules/eventemitter3/index.d.ts
9
+ +++ b/node_modules/eventemitter3/index.d.ts
10
+ @@ -81,7 +81,7 @@ declare class EventEmitter<
11
+
12
+ declare namespace EventEmitter {
13
+ export interface ListenerFn<Args extends any[] = any[]> {
14
+ - (...args: Args): void;
15
+ + (...args: Args): any;
16
+ }
17
+
18
+ export interface EventEmitterStatic {
19
+ @@ -96,7 +96,7 @@ declare namespace EventEmitter {
20
+ * ```
21
+ * interface EventTypes {
22
+ * 'event-with-parameters': any[]
23
+ - * 'event-with-example-handler': (...args: any[]) => void
24
+ + * 'event-with-example-handler': (...args: any[]) => any
25
+ * }
26
+ * ```
27
+ */
28
+ @@ -107,7 +107,7 @@ declare namespace EventEmitter {
29
+ : keyof T;
30
+
31
+ export type ArgumentMap<T extends object> = {
32
+ - [K in keyof T]: T[K] extends (...args: any[]) => void
33
+ + [K in keyof T]: T[K] extends (...args: any[]) => any
34
+ ? Parameters<T[K]>
35
+ : T[K] extends any[]
36
+ ? T[K]
37
+ @@ -118,10 +118,10 @@ declare namespace EventEmitter {
38
+ T extends ValidEventTypes,
39
+ K extends EventNames<T>
40
+ > = T extends string | symbol
41
+ - ? (...args: any[]) => void
42
+ + ? (...args: any[]) => any
43
+ : (
44
+ ...args: ArgumentMap<Exclude<T, string | symbol>>[Extract<K, keyof T>]
45
+ - ) => void;
46
+ + ) => any;
47
+
48
+ export type EventArgs<
49
+ T extends ValidEventTypes,
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "exclude": [
4
+ "src/tests",
5
+ "src/**/*.test.ts",
6
+ "src/**/*.spec.ts"
7
+ ]
8
+ }