js-chess-engine 1.0.2 → 2.0.1-rc.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/README.md +586 -205
- package/dist/adapters/APIAdapter.d.ts +88 -0
- package/dist/adapters/APIAdapter.d.ts.map +1 -0
- package/dist/adapters/APIAdapter.js +225 -0
- package/dist/adapters/APIAdapter.js.map +1 -0
- package/dist/ai/AIEngine.d.ts +42 -0
- package/dist/ai/AIEngine.d.ts.map +1 -0
- package/dist/ai/AIEngine.js +62 -0
- package/dist/ai/AIEngine.js.map +1 -0
- package/dist/ai/Evaluator.d.ts +48 -0
- package/dist/ai/Evaluator.d.ts.map +1 -0
- package/dist/ai/Evaluator.js +248 -0
- package/dist/ai/Evaluator.js.map +1 -0
- package/dist/ai/MoveOrdering.d.ts +60 -0
- package/dist/ai/MoveOrdering.d.ts.map +1 -0
- package/dist/ai/MoveOrdering.js +173 -0
- package/dist/ai/MoveOrdering.js.map +1 -0
- package/dist/ai/Search.d.ts +62 -0
- package/dist/ai/Search.d.ts.map +1 -0
- package/dist/ai/Search.js +340 -0
- package/dist/ai/Search.js.map +1 -0
- package/dist/ai/TranspositionTable.d.ts +100 -0
- package/dist/ai/TranspositionTable.d.ts.map +1 -0
- package/dist/ai/TranspositionTable.js +176 -0
- package/dist/ai/TranspositionTable.js.map +1 -0
- package/dist/core/AttackDetector.d.ts +52 -0
- package/dist/core/AttackDetector.d.ts.map +1 -0
- package/dist/core/AttackDetector.js +387 -0
- package/dist/core/AttackDetector.js.map +1 -0
- package/dist/core/Board.d.ts +109 -0
- package/dist/core/Board.d.ts.map +1 -0
- package/dist/core/Board.js +410 -0
- package/dist/core/Board.js.map +1 -0
- package/dist/core/MoveGenerator.d.ts +48 -0
- package/dist/core/MoveGenerator.d.ts.map +1 -0
- package/dist/core/MoveGenerator.js +678 -0
- package/dist/core/MoveGenerator.js.map +1 -0
- package/dist/core/Position.d.ts +135 -0
- package/dist/core/Position.d.ts.map +1 -0
- package/dist/core/Position.js +351 -0
- package/dist/core/Position.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +25 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/zobrist.d.ts +93 -0
- package/dist/core/zobrist.d.ts.map +1 -0
- package/dist/core/zobrist.js +273 -0
- package/dist/core/zobrist.js.map +1 -0
- package/dist/index.d.ts +154 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +353 -0
- package/dist/index.js.map +1 -0
- package/dist/types/ai.types.d.ts +97 -0
- package/dist/types/ai.types.d.ts.map +1 -0
- package/dist/types/ai.types.js +17 -0
- package/dist/types/ai.types.js.map +1 -0
- package/dist/types/board.types.d.ts +140 -0
- package/dist/types/board.types.d.ts.map +1 -0
- package/dist/types/board.types.js +34 -0
- package/dist/types/board.types.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +26 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/move.types.d.ts +70 -0
- package/dist/types/move.types.d.ts.map +1 -0
- package/dist/types/move.types.js +53 -0
- package/dist/types/move.types.js.map +1 -0
- package/dist/utils/constants.d.ts +123 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +259 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/conversion.d.ts +152 -0
- package/dist/utils/conversion.d.ts.map +1 -0
- package/dist/utils/conversion.js +288 -0
- package/dist/utils/conversion.js.map +1 -0
- package/dist/utils/environment.d.ts +33 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/environment.js +71 -0
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/fen.d.ts +28 -0
- package/dist/utils/fen.d.ts.map +1 -0
- package/dist/utils/fen.js +203 -0
- package/dist/utils/fen.js.map +1 -0
- package/package.json +27 -28
- package/.eslintrc.json +0 -16
- package/.github/workflows/main.yml +0 -20
- package/CHANGELOG.md +0 -587
- package/dist/js-chess-engine.js +0 -1
- package/example/aiMatch.mjs +0 -21
- package/example/console.mjs +0 -37
- package/example/server.mjs +0 -27
- package/lib/Board.mjs +0 -943
- package/lib/const/board.mjs +0 -838
- package/lib/js-chess-engine.mjs +0 -99
- package/lib/utils.mjs +0 -154
- package/test/.eslintrc.json +0 -11
- package/test/ai.test.mjs +0 -132
- package/test/badge.svg +0 -1
- package/test/importExport.mjs +0 -108
- package/test/moves.test.mjs +0 -773
- package/webpack.config.js +0 -12
package/dist/index.js
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* js-chess-engine v2
|
|
4
|
+
*
|
|
5
|
+
* Public API for chess game management
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.Game = void 0;
|
|
23
|
+
exports.moves = moves;
|
|
24
|
+
exports.status = status;
|
|
25
|
+
exports.getFen = getFen;
|
|
26
|
+
exports.move = move;
|
|
27
|
+
exports.aiMove = aiMove;
|
|
28
|
+
exports.ai = ai;
|
|
29
|
+
const Board_1 = require("./core/Board");
|
|
30
|
+
const MoveGenerator_1 = require("./core/MoveGenerator");
|
|
31
|
+
const fen_1 = require("./utils/fen");
|
|
32
|
+
const conversion_1 = require("./utils/conversion");
|
|
33
|
+
const environment_1 = require("./utils/environment");
|
|
34
|
+
const APIAdapter_1 = require("./adapters/APIAdapter");
|
|
35
|
+
const AIEngine_1 = require("./ai/AIEngine");
|
|
36
|
+
// Export types for TypeScript users
|
|
37
|
+
__exportStar(require("./types"), exports);
|
|
38
|
+
/**
|
|
39
|
+
* Main Game class - manages chess game state and moves
|
|
40
|
+
*/
|
|
41
|
+
class Game {
|
|
42
|
+
board;
|
|
43
|
+
history = [];
|
|
44
|
+
aiEngine;
|
|
45
|
+
/**
|
|
46
|
+
* Create a new game
|
|
47
|
+
*
|
|
48
|
+
* @param configuration - Optional board configuration (JSON object, FEN string, or undefined for new game)
|
|
49
|
+
*/
|
|
50
|
+
constructor(configuration) {
|
|
51
|
+
this.aiEngine = new AIEngine_1.AIEngine();
|
|
52
|
+
if (!configuration) {
|
|
53
|
+
// New game with standard starting position
|
|
54
|
+
this.board = (0, Board_1.createStartingBoard)();
|
|
55
|
+
}
|
|
56
|
+
else if (typeof configuration === 'string') {
|
|
57
|
+
// FEN string
|
|
58
|
+
this.board = (0, fen_1.parseFEN)(configuration);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// BoardConfig object
|
|
62
|
+
this.board = (0, APIAdapter_1.configToBoard)(configuration);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Make a move
|
|
67
|
+
*
|
|
68
|
+
* @param from - From square (case-insensitive, e.g., 'E2' or 'e2')
|
|
69
|
+
* @param to - To square (case-insensitive, e.g., 'E4' or 'e4')
|
|
70
|
+
* @returns Board configuration after the move
|
|
71
|
+
*/
|
|
72
|
+
move(from, to) {
|
|
73
|
+
const fromNorm = (0, APIAdapter_1.normalizeSquare)(from);
|
|
74
|
+
const toNorm = (0, APIAdapter_1.normalizeSquare)(to);
|
|
75
|
+
const fromIndex = (0, conversion_1.squareToIndex)(fromNorm);
|
|
76
|
+
const toIndex = (0, conversion_1.squareToIndex)(toNorm);
|
|
77
|
+
// Find the matching legal move
|
|
78
|
+
const legalMoves = (0, MoveGenerator_1.generateLegalMoves)(this.board);
|
|
79
|
+
const move = legalMoves.find(m => m.from === fromIndex && m.to === toIndex);
|
|
80
|
+
if (!move) {
|
|
81
|
+
throw new Error(`Invalid move from ${fromNorm} to ${toNorm}`);
|
|
82
|
+
}
|
|
83
|
+
// Record move in history
|
|
84
|
+
const historyEntry = { [fromNorm]: toNorm };
|
|
85
|
+
this.history.push(historyEntry);
|
|
86
|
+
// Apply the move
|
|
87
|
+
(0, MoveGenerator_1.applyMoveComplete)(this.board, move);
|
|
88
|
+
return (0, APIAdapter_1.boardToConfig)(this.board);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get all legal moves, optionally filtered by from-square
|
|
92
|
+
*
|
|
93
|
+
* @param from - Optional from square to filter moves
|
|
94
|
+
* @returns Map of from-squares to array of to-squares
|
|
95
|
+
*/
|
|
96
|
+
moves(from) {
|
|
97
|
+
if (from) {
|
|
98
|
+
const fromNorm = (0, APIAdapter_1.normalizeSquare)(from);
|
|
99
|
+
const fromIndex = (0, conversion_1.squareToIndex)(fromNorm);
|
|
100
|
+
const pieceMoves = (0, MoveGenerator_1.getMovesForPiece)(this.board, fromIndex);
|
|
101
|
+
const toSquares = (0, APIAdapter_1.movesFromSquare)(pieceMoves, fromIndex);
|
|
102
|
+
return { [fromNorm]: toSquares };
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const allMoves = (0, MoveGenerator_1.generateLegalMoves)(this.board);
|
|
106
|
+
return (0, APIAdapter_1.movesToMap)(allMoves);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Set a piece on a square
|
|
111
|
+
*
|
|
112
|
+
* @param square - Square to place piece (case-insensitive)
|
|
113
|
+
* @param piece - Piece symbol (K, Q, R, B, N, P, k, q, r, b, n, p)
|
|
114
|
+
*/
|
|
115
|
+
setPiece(square, piece) {
|
|
116
|
+
const squareNorm = (0, APIAdapter_1.normalizeSquare)(square);
|
|
117
|
+
const squareIndex = (0, conversion_1.squareToIndex)(squareNorm);
|
|
118
|
+
const pieceEnum = (0, APIAdapter_1.symbolToPiece)(piece);
|
|
119
|
+
(0, Board_1.setPiece)(this.board, squareIndex, pieceEnum);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Remove a piece from a square
|
|
123
|
+
*
|
|
124
|
+
* @param square - Square to remove piece from (case-insensitive)
|
|
125
|
+
*/
|
|
126
|
+
removePiece(square) {
|
|
127
|
+
const squareNorm = (0, APIAdapter_1.normalizeSquare)(square);
|
|
128
|
+
const squareIndex = (0, conversion_1.squareToIndex)(squareNorm);
|
|
129
|
+
(0, Board_1.removePiece)(this.board, squareIndex);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get move history
|
|
133
|
+
*
|
|
134
|
+
* @returns Array of history entries with board state after each move
|
|
135
|
+
*/
|
|
136
|
+
getHistory() {
|
|
137
|
+
const result = [];
|
|
138
|
+
// Replay all moves from the beginning
|
|
139
|
+
const startingBoard = typeof this.board === 'string'
|
|
140
|
+
? (0, fen_1.parseFEN)(this.board)
|
|
141
|
+
: (0, Board_1.createStartingBoard)();
|
|
142
|
+
const tempBoard = (0, Board_1.copyBoard)(startingBoard);
|
|
143
|
+
for (const move of this.history) {
|
|
144
|
+
const [from, to] = Object.entries(move)[0];
|
|
145
|
+
const fromIndex = (0, conversion_1.squareToIndex)(from);
|
|
146
|
+
const toIndex = (0, conversion_1.squareToIndex)(to);
|
|
147
|
+
const legalMoves = (0, MoveGenerator_1.generateLegalMoves)(tempBoard);
|
|
148
|
+
const matchingMove = legalMoves.find(m => m.from === fromIndex && m.to === toIndex);
|
|
149
|
+
if (matchingMove) {
|
|
150
|
+
(0, MoveGenerator_1.applyMoveComplete)(tempBoard, matchingMove);
|
|
151
|
+
const config = (0, APIAdapter_1.boardToConfig)(tempBoard);
|
|
152
|
+
result.push({ ...config, move });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Export current board state as JSON configuration
|
|
159
|
+
*
|
|
160
|
+
* @returns Board configuration object
|
|
161
|
+
*/
|
|
162
|
+
exportJson() {
|
|
163
|
+
return (0, APIAdapter_1.boardToConfig)(this.board);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Export current board state as FEN string
|
|
167
|
+
*
|
|
168
|
+
* @returns FEN string
|
|
169
|
+
*/
|
|
170
|
+
exportFEN() {
|
|
171
|
+
return (0, fen_1.toFEN)(this.board);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Print board to console (Unicode chess pieces)
|
|
175
|
+
*/
|
|
176
|
+
printToConsole() {
|
|
177
|
+
process.stdout.write('\n');
|
|
178
|
+
for (let rank = 7; rank >= 0; rank--) {
|
|
179
|
+
process.stdout.write(`${rank + 1}`);
|
|
180
|
+
for (let file = 0; file < 8; file++) {
|
|
181
|
+
const index = rank * 8 + file;
|
|
182
|
+
const piece = this.board.mailbox[index];
|
|
183
|
+
const isWhiteSquare = (rank + file) % 2 === 0;
|
|
184
|
+
const symbol = pieceToUnicode(piece, isWhiteSquare);
|
|
185
|
+
process.stdout.write(symbol);
|
|
186
|
+
}
|
|
187
|
+
process.stdout.write('\n');
|
|
188
|
+
}
|
|
189
|
+
process.stdout.write(' ABCDEFGH\n');
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Make an AI move (v1 compatible - returns only the move)
|
|
193
|
+
*
|
|
194
|
+
* @param level - AI level (1-5, default 3)
|
|
195
|
+
* @returns The played move object (e.g., {"E2": "E4"})
|
|
196
|
+
*/
|
|
197
|
+
aiMove(level = 3) {
|
|
198
|
+
// Validate level
|
|
199
|
+
if (level < 1 || level > 5) {
|
|
200
|
+
throw new Error('AI level must be between 1 and 5');
|
|
201
|
+
}
|
|
202
|
+
// Find best move
|
|
203
|
+
const bestMove = this.aiEngine.findBestMove(this.board, level);
|
|
204
|
+
if (!bestMove) {
|
|
205
|
+
// No legal moves available - game must be finished (checkmate or stalemate)
|
|
206
|
+
throw new Error('Game is already finished');
|
|
207
|
+
}
|
|
208
|
+
// Record move in history
|
|
209
|
+
const fromSquare = (0, conversion_1.indexToSquare)(bestMove.from);
|
|
210
|
+
const toSquare = (0, conversion_1.indexToSquare)(bestMove.to);
|
|
211
|
+
const historyEntry = { [fromSquare]: toSquare };
|
|
212
|
+
this.history.push(historyEntry);
|
|
213
|
+
// Apply the move
|
|
214
|
+
(0, MoveGenerator_1.applyMoveComplete)(this.board, bestMove);
|
|
215
|
+
return historyEntry;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Make an AI move and return both move and board state
|
|
219
|
+
*
|
|
220
|
+
* @param options - Optional configuration object
|
|
221
|
+
* @param options.level - AI difficulty level (1-5, default: 3)
|
|
222
|
+
* @param options.play - Whether to apply the move to the game (default: true). If false, only returns the move without modifying game state.
|
|
223
|
+
* @param options.ttSizeMB - Transposition table size in MB (0 to disable, 0.25-256). Default: auto-scaled by level (e.g., level 3: 16 MB Node.js, 2 MB browser)
|
|
224
|
+
* @returns Object containing the move and board configuration (current state if play=false, updated state if play=true)
|
|
225
|
+
*/
|
|
226
|
+
ai(options = {}) {
|
|
227
|
+
const level = options.level ?? 3;
|
|
228
|
+
const play = options.play ?? true;
|
|
229
|
+
// Allow 0 to disable TT, or 0.25-256 MB range
|
|
230
|
+
// Default: auto-scaled by AI level (lower levels use less memory, higher levels use more)
|
|
231
|
+
const defaultSize = (0, environment_1.getRecommendedTTSize)(level);
|
|
232
|
+
const ttSizeMB = options.ttSizeMB === 0 ? 0 : Math.max(0.25, Math.min(256, options.ttSizeMB ?? defaultSize));
|
|
233
|
+
// Validate level
|
|
234
|
+
if (level < 1 || level > 5) {
|
|
235
|
+
throw new Error('AI level must be between 1 and 5');
|
|
236
|
+
}
|
|
237
|
+
// Find best move
|
|
238
|
+
const bestMove = this.aiEngine.findBestMove(this.board, level, ttSizeMB);
|
|
239
|
+
if (!bestMove) {
|
|
240
|
+
// No legal moves available - game must be finished (checkmate or stalemate)
|
|
241
|
+
throw new Error('Game is already finished');
|
|
242
|
+
}
|
|
243
|
+
// Create move entry
|
|
244
|
+
const fromSquare = (0, conversion_1.indexToSquare)(bestMove.from);
|
|
245
|
+
const toSquare = (0, conversion_1.indexToSquare)(bestMove.to);
|
|
246
|
+
const historyEntry = { [fromSquare]: toSquare };
|
|
247
|
+
if (!play) {
|
|
248
|
+
// Return move without applying it, with current board state
|
|
249
|
+
return {
|
|
250
|
+
move: historyEntry,
|
|
251
|
+
board: (0, APIAdapter_1.boardToConfig)(this.board),
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// Record move in history and apply it
|
|
255
|
+
this.history.push(historyEntry);
|
|
256
|
+
(0, MoveGenerator_1.applyMoveComplete)(this.board, bestMove);
|
|
257
|
+
return {
|
|
258
|
+
move: historyEntry,
|
|
259
|
+
board: (0, APIAdapter_1.boardToConfig)(this.board),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
exports.Game = Game;
|
|
264
|
+
/**
|
|
265
|
+
* Helper function to convert piece enum to Unicode symbol for printing
|
|
266
|
+
*/
|
|
267
|
+
function pieceToUnicode(piece, isWhiteSquare) {
|
|
268
|
+
const symbols = {
|
|
269
|
+
0: isWhiteSquare ? '\u2588' : '\u2591', // EMPTY - filled/light block
|
|
270
|
+
1: '\u2659', // WHITE_PAWN ♙
|
|
271
|
+
2: '\u2658', // WHITE_KNIGHT ♘
|
|
272
|
+
3: '\u2657', // WHITE_BISHOP ♗
|
|
273
|
+
4: '\u2656', // WHITE_ROOK ♖
|
|
274
|
+
5: '\u2655', // WHITE_QUEEN ♕
|
|
275
|
+
6: '\u2654', // WHITE_KING ♔
|
|
276
|
+
7: '\u265F', // BLACK_PAWN ♟
|
|
277
|
+
8: '\u265E', // BLACK_KNIGHT ♞
|
|
278
|
+
9: '\u265D', // BLACK_BISHOP ♝
|
|
279
|
+
10: '\u265C', // BLACK_ROOK ♜
|
|
280
|
+
11: '\u265B', // BLACK_QUEEN ♛
|
|
281
|
+
12: '\u265A', // BLACK_KING ♚
|
|
282
|
+
};
|
|
283
|
+
return symbols[piece] || (isWhiteSquare ? '\u2588' : '\u2591');
|
|
284
|
+
}
|
|
285
|
+
// ==================== Stateless Functions ====================
|
|
286
|
+
/**
|
|
287
|
+
* Get all legal moves for a position
|
|
288
|
+
*
|
|
289
|
+
* @param config - Board configuration or FEN string
|
|
290
|
+
* @returns Map of from-squares to array of to-squares
|
|
291
|
+
*/
|
|
292
|
+
function moves(config) {
|
|
293
|
+
const game = new Game(config);
|
|
294
|
+
return game.moves();
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Get board status
|
|
298
|
+
*
|
|
299
|
+
* @param config - Board configuration or FEN string
|
|
300
|
+
* @returns Board configuration with current status
|
|
301
|
+
*/
|
|
302
|
+
function status(config) {
|
|
303
|
+
const game = new Game(config);
|
|
304
|
+
return game.exportJson();
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get FEN string for a position
|
|
308
|
+
*
|
|
309
|
+
* @param config - Board configuration or FEN string
|
|
310
|
+
* @returns FEN string
|
|
311
|
+
*/
|
|
312
|
+
function getFen(config) {
|
|
313
|
+
const game = new Game(config);
|
|
314
|
+
return game.exportFEN();
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Make a move on a board
|
|
318
|
+
*
|
|
319
|
+
* @param config - Board configuration or FEN string
|
|
320
|
+
* @param from - From square
|
|
321
|
+
* @param to - To square
|
|
322
|
+
* @returns Board configuration after the move
|
|
323
|
+
*/
|
|
324
|
+
function move(config, from, to) {
|
|
325
|
+
const game = new Game(config);
|
|
326
|
+
return game.move(from, to);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Make an AI move (v1 compatible - returns only the move)
|
|
330
|
+
*
|
|
331
|
+
* @param config - Board configuration or FEN string
|
|
332
|
+
* @param level - AI level (1-5, default 3)
|
|
333
|
+
* @returns The played move object (e.g., {"E2": "E4"})
|
|
334
|
+
*/
|
|
335
|
+
function aiMove(config, level = 3) {
|
|
336
|
+
const game = new Game(config);
|
|
337
|
+
return game.aiMove(level);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Make an AI move and return both move and board state
|
|
341
|
+
*
|
|
342
|
+
* @param config - Board configuration or FEN string
|
|
343
|
+
* @param options - Optional configuration object
|
|
344
|
+
* @param options.level - AI difficulty level (1-5, default: 3)
|
|
345
|
+
* @param options.play - Whether to apply the move to the game (default: true). If false, only returns the move without modifying game state.
|
|
346
|
+
* @param options.ttSizeMB - Transposition table size in MB (0 to disable, 0.25-256). Default: auto-scaled by level (e.g., level 3: 16 MB Node.js, 2 MB browser)
|
|
347
|
+
* @returns Object containing the move and board configuration (current state if play=false, updated state if play=true)
|
|
348
|
+
*/
|
|
349
|
+
function ai(config, options = {}) {
|
|
350
|
+
const game = new Game(config);
|
|
351
|
+
return game.ai(options);
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI and search-related types for js-chess-engine
|
|
3
|
+
*/
|
|
4
|
+
import { InternalMove } from './move.types';
|
|
5
|
+
/**
|
|
6
|
+
* AI difficulty level (1-5)
|
|
7
|
+
*/
|
|
8
|
+
export type AILevel = 1 | 2 | 3 | 4 | 5;
|
|
9
|
+
/**
|
|
10
|
+
* Search depth
|
|
11
|
+
*/
|
|
12
|
+
export type Depth = number;
|
|
13
|
+
/**
|
|
14
|
+
* Evaluation score (centipawns)
|
|
15
|
+
* Positive = good for white, negative = good for black
|
|
16
|
+
*/
|
|
17
|
+
export type Score = number;
|
|
18
|
+
/**
|
|
19
|
+
* Search result
|
|
20
|
+
*/
|
|
21
|
+
export interface SearchResult {
|
|
22
|
+
move: InternalMove;
|
|
23
|
+
score: Score;
|
|
24
|
+
depth: Depth;
|
|
25
|
+
nodesSearched: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Alpha-beta search bounds
|
|
29
|
+
*/
|
|
30
|
+
export interface SearchBounds {
|
|
31
|
+
alpha: Score;
|
|
32
|
+
beta: Score;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Transposition table entry type
|
|
36
|
+
*/
|
|
37
|
+
export declare enum TTEntryType {
|
|
38
|
+
EXACT = 0,// Exact score
|
|
39
|
+
LOWERBOUND = 1,// Beta cutoff (fail-high)
|
|
40
|
+
UPPERBOUND = 2
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Transposition table entry
|
|
44
|
+
*/
|
|
45
|
+
export interface TTEntry {
|
|
46
|
+
zobristHash: bigint;
|
|
47
|
+
depth: Depth;
|
|
48
|
+
score: Score;
|
|
49
|
+
type: TTEntryType;
|
|
50
|
+
bestMove: InternalMove | null;
|
|
51
|
+
age: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Killer move table (indexed by ply)
|
|
55
|
+
*/
|
|
56
|
+
export type KillerMoves = Array<[InternalMove | null, InternalMove | null]>;
|
|
57
|
+
/**
|
|
58
|
+
* History heuristic table
|
|
59
|
+
* [from][to] -> score
|
|
60
|
+
*/
|
|
61
|
+
export type HistoryTable = number[][];
|
|
62
|
+
/**
|
|
63
|
+
* MVV-LVA (Most Valuable Victim - Least Valuable Aggressor) score
|
|
64
|
+
*/
|
|
65
|
+
export interface MVVLVAScore {
|
|
66
|
+
victim: number;
|
|
67
|
+
aggressor: number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Position evaluation components
|
|
71
|
+
*/
|
|
72
|
+
export interface EvaluationComponents {
|
|
73
|
+
material: Score;
|
|
74
|
+
pieceSquareTables: Score;
|
|
75
|
+
pawnStructure: Score;
|
|
76
|
+
kingSafety: Score;
|
|
77
|
+
mobility: Score;
|
|
78
|
+
rookBonus: Score;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Pawn structure analysis
|
|
82
|
+
*/
|
|
83
|
+
export interface PawnStructure {
|
|
84
|
+
doubledPawns: number;
|
|
85
|
+
isolatedPawns: number;
|
|
86
|
+
passedPawns: number;
|
|
87
|
+
pawnChains: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* King safety analysis
|
|
91
|
+
*/
|
|
92
|
+
export interface KingSafety {
|
|
93
|
+
pawnShield: number;
|
|
94
|
+
attackingPieces: number;
|
|
95
|
+
attackZoneControl: number;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=ai.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.types.d.ts","sourceRoot":"","sources":["../../src/types/ai.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI5C;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAExC;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;CACf;AAID;;GAEG;AACH,oBAAY,WAAW;IACnB,KAAK,IAAI,CAAO,cAAc;IAC9B,UAAU,IAAI,CAAE,0BAA0B;IAC1C,UAAU,IAAI;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;CACf;AAID;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;AAE5E;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,EAAE,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACrB;AAID;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,KAAK,CAAC;IAChB,iBAAiB,EAAE,KAAK,CAAC;IACzB,aAAa,EAAE,KAAK,CAAC;IACrB,UAAU,EAAE,KAAK,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC7B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AI and search-related types for js-chess-engine
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TTEntryType = void 0;
|
|
7
|
+
// ==================== Transposition Table Types ====================
|
|
8
|
+
/**
|
|
9
|
+
* Transposition table entry type
|
|
10
|
+
*/
|
|
11
|
+
var TTEntryType;
|
|
12
|
+
(function (TTEntryType) {
|
|
13
|
+
TTEntryType[TTEntryType["EXACT"] = 0] = "EXACT";
|
|
14
|
+
TTEntryType[TTEntryType["LOWERBOUND"] = 1] = "LOWERBOUND";
|
|
15
|
+
TTEntryType[TTEntryType["UPPERBOUND"] = 2] = "UPPERBOUND";
|
|
16
|
+
})(TTEntryType || (exports.TTEntryType = TTEntryType = {}));
|
|
17
|
+
//# sourceMappingURL=ai.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.types.js","sourceRoot":"","sources":["../../src/types/ai.types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAwCH,sEAAsE;AAEtE;;GAEG;AACH,IAAY,WAIX;AAJD,WAAY,WAAW;IACnB,+CAAS,CAAA;IACT,yDAAc,CAAA;IACd,yDAAc,CAAA;AAClB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Board-related types for js-chess-engine
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Color of a piece or player
|
|
6
|
+
*/
|
|
7
|
+
export type Color = 'white' | 'black';
|
|
8
|
+
/**
|
|
9
|
+
* Piece notation using standard chess symbols
|
|
10
|
+
* Uppercase = white, lowercase = black
|
|
11
|
+
*/
|
|
12
|
+
export type PieceSymbol = 'K' | 'Q' | 'R' | 'B' | 'N' | 'P' | 'k' | 'q' | 'r' | 'b' | 'n' | 'p';
|
|
13
|
+
/**
|
|
14
|
+
* Piece type (without color)
|
|
15
|
+
*/
|
|
16
|
+
export type PieceType = 'king' | 'queen' | 'rook' | 'bishop' | 'knight' | 'pawn';
|
|
17
|
+
/**
|
|
18
|
+
* Square notation (A1-H8)
|
|
19
|
+
*/
|
|
20
|
+
export type Square = string;
|
|
21
|
+
/**
|
|
22
|
+
* Column notation (A-H)
|
|
23
|
+
*/
|
|
24
|
+
export type Column = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H';
|
|
25
|
+
/**
|
|
26
|
+
* Row notation (1-8)
|
|
27
|
+
*/
|
|
28
|
+
export type Row = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8';
|
|
29
|
+
/**
|
|
30
|
+
* Castling rights configuration
|
|
31
|
+
*/
|
|
32
|
+
export interface CastlingRights {
|
|
33
|
+
whiteShort: boolean;
|
|
34
|
+
blackShort: boolean;
|
|
35
|
+
whiteLong: boolean;
|
|
36
|
+
blackLong: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Public board configuration (API format)
|
|
40
|
+
* Maps square strings (e.g., "E1", "A8") to piece symbols
|
|
41
|
+
*/
|
|
42
|
+
export interface BoardConfig {
|
|
43
|
+
pieces: Record<Square, PieceSymbol>;
|
|
44
|
+
turn: Color;
|
|
45
|
+
isFinished: boolean;
|
|
46
|
+
check: boolean;
|
|
47
|
+
checkMate: boolean;
|
|
48
|
+
castling: CastlingRights;
|
|
49
|
+
enPassant: Square | null;
|
|
50
|
+
halfMove: number;
|
|
51
|
+
fullMove: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Move history entry
|
|
55
|
+
*/
|
|
56
|
+
export interface HistoryEntry {
|
|
57
|
+
[from: Square]: Square;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Possible moves map (API format)
|
|
61
|
+
* Maps from-square to array of to-squares
|
|
62
|
+
*/
|
|
63
|
+
export type MovesMap = Record<Square, Square[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Square index (0-63)
|
|
66
|
+
* 0 = A1, 7 = H1, 56 = A8, 63 = H8
|
|
67
|
+
*/
|
|
68
|
+
export type SquareIndex = number;
|
|
69
|
+
/**
|
|
70
|
+
* Internal piece representation
|
|
71
|
+
*/
|
|
72
|
+
export declare enum Piece {
|
|
73
|
+
EMPTY = 0,
|
|
74
|
+
WHITE_PAWN = 1,
|
|
75
|
+
WHITE_KNIGHT = 2,
|
|
76
|
+
WHITE_BISHOP = 3,
|
|
77
|
+
WHITE_ROOK = 4,
|
|
78
|
+
WHITE_QUEEN = 5,
|
|
79
|
+
WHITE_KING = 6,
|
|
80
|
+
BLACK_PAWN = 7,
|
|
81
|
+
BLACK_KNIGHT = 8,
|
|
82
|
+
BLACK_BISHOP = 9,
|
|
83
|
+
BLACK_ROOK = 10,
|
|
84
|
+
BLACK_QUEEN = 11,
|
|
85
|
+
BLACK_KING = 12
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Internal color representation
|
|
89
|
+
*/
|
|
90
|
+
export declare enum InternalColor {
|
|
91
|
+
WHITE = 0,
|
|
92
|
+
BLACK = 1
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Bitboard (64-bit integer for piece positions)
|
|
96
|
+
*/
|
|
97
|
+
export type Bitboard = bigint;
|
|
98
|
+
/**
|
|
99
|
+
* Internal board state using bitboards and mailbox
|
|
100
|
+
*/
|
|
101
|
+
export interface InternalBoard {
|
|
102
|
+
mailbox: Int8Array;
|
|
103
|
+
whitePawns: Bitboard;
|
|
104
|
+
whiteKnights: Bitboard;
|
|
105
|
+
whiteBishops: Bitboard;
|
|
106
|
+
whiteRooks: Bitboard;
|
|
107
|
+
whiteQueens: Bitboard;
|
|
108
|
+
whiteKing: Bitboard;
|
|
109
|
+
blackPawns: Bitboard;
|
|
110
|
+
blackKnights: Bitboard;
|
|
111
|
+
blackBishops: Bitboard;
|
|
112
|
+
blackRooks: Bitboard;
|
|
113
|
+
blackQueens: Bitboard;
|
|
114
|
+
blackKing: Bitboard;
|
|
115
|
+
whitePieces: Bitboard;
|
|
116
|
+
blackPieces: Bitboard;
|
|
117
|
+
allPieces: Bitboard;
|
|
118
|
+
turn: InternalColor;
|
|
119
|
+
castlingRights: CastlingRights;
|
|
120
|
+
enPassantSquare: SquareIndex | null;
|
|
121
|
+
halfMoveClock: number;
|
|
122
|
+
fullMoveNumber: number;
|
|
123
|
+
zobristHash: bigint;
|
|
124
|
+
isCheck: boolean;
|
|
125
|
+
isCheckmate: boolean;
|
|
126
|
+
isStalemate: boolean;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Direction offset for piece movement
|
|
130
|
+
*/
|
|
131
|
+
export type Direction = number;
|
|
132
|
+
/**
|
|
133
|
+
* File index (0-7 for A-H)
|
|
134
|
+
*/
|
|
135
|
+
export type FileIndex = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
|
|
136
|
+
/**
|
|
137
|
+
* Rank index (0-7 for 1-8)
|
|
138
|
+
*/
|
|
139
|
+
export type RankIndex = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
|
|
140
|
+
//# sourceMappingURL=board.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.types.d.ts","sourceRoot":"","sources":["../../src/types/board.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Board-related types for js-chess-engine
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.InternalColor = exports.Piece = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Internal piece representation
|
|
9
|
+
*/
|
|
10
|
+
var Piece;
|
|
11
|
+
(function (Piece) {
|
|
12
|
+
Piece[Piece["EMPTY"] = 0] = "EMPTY";
|
|
13
|
+
Piece[Piece["WHITE_PAWN"] = 1] = "WHITE_PAWN";
|
|
14
|
+
Piece[Piece["WHITE_KNIGHT"] = 2] = "WHITE_KNIGHT";
|
|
15
|
+
Piece[Piece["WHITE_BISHOP"] = 3] = "WHITE_BISHOP";
|
|
16
|
+
Piece[Piece["WHITE_ROOK"] = 4] = "WHITE_ROOK";
|
|
17
|
+
Piece[Piece["WHITE_QUEEN"] = 5] = "WHITE_QUEEN";
|
|
18
|
+
Piece[Piece["WHITE_KING"] = 6] = "WHITE_KING";
|
|
19
|
+
Piece[Piece["BLACK_PAWN"] = 7] = "BLACK_PAWN";
|
|
20
|
+
Piece[Piece["BLACK_KNIGHT"] = 8] = "BLACK_KNIGHT";
|
|
21
|
+
Piece[Piece["BLACK_BISHOP"] = 9] = "BLACK_BISHOP";
|
|
22
|
+
Piece[Piece["BLACK_ROOK"] = 10] = "BLACK_ROOK";
|
|
23
|
+
Piece[Piece["BLACK_QUEEN"] = 11] = "BLACK_QUEEN";
|
|
24
|
+
Piece[Piece["BLACK_KING"] = 12] = "BLACK_KING";
|
|
25
|
+
})(Piece || (exports.Piece = Piece = {}));
|
|
26
|
+
/**
|
|
27
|
+
* Internal color representation
|
|
28
|
+
*/
|
|
29
|
+
var InternalColor;
|
|
30
|
+
(function (InternalColor) {
|
|
31
|
+
InternalColor[InternalColor["WHITE"] = 0] = "WHITE";
|
|
32
|
+
InternalColor[InternalColor["BLACK"] = 1] = "BLACK";
|
|
33
|
+
})(InternalColor || (exports.InternalColor = InternalColor = {}));
|
|
34
|
+
//# sourceMappingURL=board.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.types.js","sourceRoot":"","sources":["../../src/types/board.types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAkFH;;GAEG;AACH,IAAY,KAcX;AAdD,WAAY,KAAK;IACb,mCAAS,CAAA;IACT,6CAAc,CAAA;IACd,iDAAgB,CAAA;IAChB,iDAAgB,CAAA;IAChB,6CAAc,CAAA;IACd,+CAAe,CAAA;IACf,6CAAc,CAAA;IACd,6CAAc,CAAA;IACd,iDAAgB,CAAA;IAChB,iDAAgB,CAAA;IAChB,8CAAe,CAAA;IACf,gDAAgB,CAAA;IAChB,8CAAe,CAAA;AACnB,CAAC,EAdW,KAAK,qBAAL,KAAK,QAchB;AAED;;GAEG;AACH,IAAY,aAGX;AAHD,WAAY,aAAa;IACrB,mDAAS,CAAA;IACT,mDAAS,CAAA;AACb,CAAC,EAHW,aAAa,6BAAb,aAAa,QAGxB"}
|