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
124 lines (123 loc) • 5.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getBlackPawnEastAttack = exports.getBlackPawnWestAttack = exports.getWhitePawnEastAttack = exports.getWhitePawnWestAttack = exports.generateAllPawnsAttacksBBTable = exports.getPawnAndColor = exports.blackDoublePushDestinations = exports.blackSinglePushDestinations = exports.whiteDoublePushDestinations = exports.whiteSinglePushDestinations = exports.generateAllPawnsPushBBTable = exports.pawnsMoves = void 0;
var moveHelpers_1 = require("./moveHelpers");
var BitBoard_1 = require("../BitBoard/BitBoard");
var positionsHashTable_1 = require("./../BitBoard/positionsHashTable");
function pawnsMoves(board, hasToPlay) {
// @TODO document
// https://www.chessprogramming.org/Pawn_Pushes_(Bitboards)
// https://www.chessprogramming.org/Pawn_Attacks_(Bitboards)
var opponent = hasToPlay === 'w' ? 'blacks' : 'whites';
var pawnsList = board[getPawnAndColor(hasToPlay)]
.extractBits()
.map(function (pawnPositionCode) {
var from = positionsHashTable_1.positionsTable[pawnPositionCode];
var quietMoves = generateAllPawnsPushBBTable(board, hasToPlay)[pawnPositionCode].and(board.quietDestinations)
.extractBits()
.map(function (pawnDestination) { return positionsHashTable_1.positionsTable[pawnDestination]; });
var killMoves = generateAllPawnsAttacksBBTable(hasToPlay)[pawnPositionCode].and(board[opponent])
.extractBits()
.map(function (pawnDestination) { return positionsHashTable_1.positionsTable[pawnDestination]; });
return {
from: from,
quietMoves: quietMoves,
killMoves: killMoves,
};
});
return pawnsList;
}
exports.pawnsMoves = pawnsMoves;
function generateAllPawnsPushBBTable(board, hasToPlay) {
var result = [];
if (hasToPlay === 'w') {
for (var position = 0; position < 64; position++) {
result.push(whiteSinglePushDestinations(position, board.empty).or(whiteDoublePushDestinations(position, board.empty)));
}
}
if (hasToPlay === 'b') {
for (var position = 0; position < 64; position++) {
result.push(blackSinglePushDestinations(position, board.empty).or(blackDoublePushDestinations(position, board.empty)));
}
}
return result;
}
exports.generateAllPawnsPushBBTable = generateAllPawnsPushBBTable;
function whiteSinglePushDestinations(position, emptyBoard) {
var whitePawn = BitBoard_1.default.fromPos(position);
whitePawn = (0, moveHelpers_1.slideUp)(whitePawn);
return whitePawn.and(emptyBoard);
}
exports.whiteSinglePushDestinations = whiteSinglePushDestinations;
function whiteDoublePushDestinations(position, emptyBoard) {
var rank4 = BitBoard_1.default.fromHex('00000000FF000000');
var singlePush = whiteSinglePushDestinations(position, emptyBoard);
singlePush = (0, moveHelpers_1.slideUp)(singlePush);
return singlePush.and(emptyBoard).and(rank4);
}
exports.whiteDoublePushDestinations = whiteDoublePushDestinations;
function blackSinglePushDestinations(position, emptyBoard) {
var blackPawn = BitBoard_1.default.fromPos(position);
blackPawn = (0, moveHelpers_1.slideDown)(blackPawn);
return blackPawn.and(emptyBoard);
}
exports.blackSinglePushDestinations = blackSinglePushDestinations;
function blackDoublePushDestinations(position, emptyBoard) {
var rank5 = BitBoard_1.default.fromHex('000000FF00000000');
var singlePush = blackSinglePushDestinations(position, emptyBoard);
singlePush = (0, moveHelpers_1.slideDown)(singlePush);
return singlePush.and(emptyBoard).and(rank5);
}
exports.blackDoublePushDestinations = blackDoublePushDestinations;
function getPawnAndColor(hasToPlay) {
if (hasToPlay === 'w')
return 'whitePawns';
if (hasToPlay === 'b')
return 'blackPawns';
}
exports.getPawnAndColor = getPawnAndColor;
function generateAllPawnsAttacksBBTable(hasToPlay) {
var result = [];
if (hasToPlay === 'w') {
for (var position = 0; position < 64; position++) {
var positionsAttacked = [];
if (getWhitePawnEastAttack(position))
positionsAttacked.push(getWhitePawnEastAttack(position));
if (getWhitePawnWestAttack(position))
positionsAttacked.push(getWhitePawnWestAttack(position));
result.push(BitBoard_1.default.fromPositions(positionsAttacked));
}
}
if (hasToPlay === 'b') {
for (var position = 0; position < 64; position++) {
var positionsAttacked = [];
if (getBlackPawnEastAttack(position))
positionsAttacked.push(getBlackPawnEastAttack(position));
if (getBlackPawnWestAttack(position))
positionsAttacked.push(getBlackPawnWestAttack(position));
result.push(BitBoard_1.default.fromPositions(positionsAttacked));
}
}
return result;
}
exports.generateAllPawnsAttacksBBTable = generateAllPawnsAttacksBBTable;
function getWhitePawnWestAttack(position) {
var HFile = [7, 15, 23, 31, 39, 47, 55, 63];
return !HFile.includes(position + 7) ? position + 7 : null;
}
exports.getWhitePawnWestAttack = getWhitePawnWestAttack;
function getWhitePawnEastAttack(position) {
var AFile = [0, 8, 16, 24, 32, 40, 48, 56];
return !AFile.includes(position + 9) ? position + 9 : null;
}
exports.getWhitePawnEastAttack = getWhitePawnEastAttack;
function getBlackPawnWestAttack(position) {
var HFile = [7, 15, 23, 31, 39, 47, 55, 63];
return !HFile.includes(position - 9) ? position - 9 : null;
}
exports.getBlackPawnWestAttack = getBlackPawnWestAttack;
function getBlackPawnEastAttack(position) {
var AFile = [0, 8, 16, 24, 32, 40, 48, 56];
return !AFile.includes(position - 7) ? position - 7 : null;
}
exports.getBlackPawnEastAttack = getBlackPawnEastAttack;