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

124 lines (123 loc) 5.91 kB
"use strict"; 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;