chess-legal-moves
Version:
Analyses a given chess game position in Fen notation to return legal moves and provides the next game position after a given move
100 lines (99 loc) • 3.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getKingAndColor = exports.kingMoves = void 0;
var BitBoard_1 = require("../BitBoard/BitBoard");
var positionsHashTable_1 = require("./../BitBoard/positionsHashTable");
function kingMoves(board, hasToPlay) {
// @TODO document
var opponent = hasToPlay === 'w' ? 'blacks' : 'whites';
var allKingMovesTable = generateAllKingMovesBBTable();
var kingList = board[getKingAndColor(hasToPlay)]
.extractBits()
.map(function (kingPositionCode) {
var from = positionsHashTable_1.positionsTable[kingPositionCode];
var quietMoves = allKingMovesTable[kingPositionCode]
.and(board.quietDestinations)
.extractBits()
.map(function (knightDestination) { return positionsHashTable_1.positionsTable[knightDestination]; });
var killMoves = allKingMovesTable[kingPositionCode]
.and(board[opponent])
.extractBits()
.map(function (knightDestination) { return positionsHashTable_1.positionsTable[knightDestination]; });
return {
from: from,
quietMoves: quietMoves,
killMoves: killMoves,
};
});
return kingList;
}
exports.kingMoves = kingMoves;
function generateAllKingMovesBBTable() {
// King moves from a given position
//
// noWe no noEa
// +7 +8 +9
// \ | /
// \ | /
// we -1 -- 0 -- +1 ea
// / | \
// / | \
// -9 -8 -7
// soWe so soEa
var AFile = [0, 8, 16, 24, 32, 40, 48, 56];
var HFile = [7, 15, 23, 31, 39, 47, 55, 63];
function no(position) {
return position + 8;
}
function so(position) {
return position - 8;
}
function noWe(position) {
return !HFile.includes(position + 7) ? position + 7 : null;
}
function we(position) {
return !HFile.includes(position - 1) ? position - 1 : null;
}
function soWe(position) {
return !HFile.includes(position - 9) ? position - 9 : null;
}
function noEa(position) {
return !AFile.includes(position + 9) ? position + 9 : null;
}
function ea(position) {
return !AFile.includes(position + 1) ? position + 1 : null;
}
function soEa(position) {
return !AFile.includes(position - 7) ? position - 7 : null;
}
var allKingMoves = [];
for (var position = 0; position < 64; position++) {
var movesFromThisPosition = [];
// if position is not out of the board, add it to the list
if (no(position))
movesFromThisPosition.push(no(position));
if (noEa(position))
movesFromThisPosition.push(noEa(position));
if (noWe(position))
movesFromThisPosition.push(noWe(position));
if (so(position))
movesFromThisPosition.push(so(position));
if (soEa(position))
movesFromThisPosition.push(soEa(position));
if (soWe(position))
movesFromThisPosition.push(soWe(position));
if (we(position))
movesFromThisPosition.push(we(position));
if (ea(position))
movesFromThisPosition.push(ea(position));
allKingMoves.push(BitBoard_1.default.fromPositions(movesFromThisPosition));
}
return allKingMoves;
}
function getKingAndColor(hasToPlay) {
if (hasToPlay === 'w')
return 'whiteKing';
if (hasToPlay === 'b')
return 'blackKing';
}
exports.getKingAndColor = getKingAndColor;