@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.
- package/.eslintrc +6 -0
- package/.gitattributes +1 -0
- package/LICENSE +20 -0
- package/README.md +6 -0
- package/build/base/board.d.ts +171 -0
- package/build/base/board.js +330 -0
- package/build/base/controller.d.ts +124 -0
- package/build/base/controller.js +185 -0
- package/build/bitBoard/bitBoard.d.ts +133 -0
- package/build/bitBoard/bitBoard.js +56 -0
- package/build/bitBoard/intBitBoard.d.ts +27 -0
- package/build/bitBoard/intBitBoard.js +65 -0
- package/build/bitBoard/longInt.d.ts +206 -0
- package/build/bitBoard/longInt.js +310 -0
- package/build/bitBoard/longIntBitBoard.d.ts +46 -0
- package/build/bitBoard/longIntBitBoard.js +85 -0
- package/build/console.d.ts +23 -0
- package/build/console.js +30 -0
- package/build/games/connect4/board.d.ts +15 -0
- package/build/games/connect4/board.js +88 -0
- package/build/games/connect4/controller.d.ts +11 -0
- package/build/games/connect4/controller.js +49 -0
- package/build/games/tictactoe/board.d.ts +7 -0
- package/build/games/tictactoe/board.js +18 -0
- package/build/games/tictactoe/controller.d.ts +11 -0
- package/build/games/tictactoe/controller.js +49 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +3 -0
- package/package.json +32 -0
- package/patches/eventemitter3+^5.0.1.patch +49 -0
- package/tsconfig.build.json +8 -0
|
@@ -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;
|
package/build/console.js
ADDED
|
@@ -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,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
|
package/build/index.d.ts
ADDED
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,
|