UNPKG

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
"use strict"; 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;