我对比特板和位操作没有太多的了解,我也从Github那里得到了一些棋盘引擎的例子。我想知道是否有人能帮我解决问题。
我怎样才能确定攻击国王的确切部位?
我在isKingInCheck函数中得到了position.js中的一个例子,该函数只识别国王何时受到攻击(甚至识别该物品是典当还是主教等),但我需要确切地知道攻击国王的棋子(位置)。
我相信创建一个通用攻击掩码函数是可能的,如下所示。问题是,我不知道如何从position.js文件中声明的预先制作的比特板中单独获得每一块(以及它在游戏中的位置)。
Chess.Position.makePawnAttackMask = function(color, pawns) {
var white = (color === Chess.PieceColor.WHITE);
var attacks1 = pawns.dup().and_not(Chess.Bitboard.FILES[0]).shiftLeft(white ? 7 : -9);
var attacks2 = pawns.dup().and_not(Chess.Bitboard.FILES[Chess.LAST_FILE]).shiftLeft(white ? 9 : -7);
return attacks1.or(attacks2);
};有人知道我怎么做到的吗?
发布于 2021-05-17 20:40:07
我认为找到支票最有效的方法是在你产生合法行为的同时找到它们。这将需要一些重构,可能会有点复杂。
一种更简单的方法是从国王的位置开始,通过为每个部件生成攻击掩码来使用isAttacked函数的重加工副本。
例如,如果您使用国王的颜色将国王的比特板发送到makePawnAttackMask函数,并在掩码和对面玩家的棋子之间应用一个逻辑值,您将得到一个包含检查棋子的位板。然后,您可以使用函数extractLowestBitPosition或getLowestBitPosition查找攻击典当的方格(如果存在的话)。在尝试提取最不重要位的位置之前,请确保位板是不是空的:
Chess.Position.prototype.getCheckingPieces = function(color) {
var checkingPieces = [];
var opponent = Chess.getOtherPieceColor(color);
var king = this.getPieceColorBitboard(Chess.Piece.KING, color);
var pawnAttack = Chess.Position.makePawnAttackMask(color, king);
pawnAttack = pawnAttack.and(This.getPieceColorBitboard(Chess.Piece.PAWN, opponent));
if (!pawnAttack.isEmpty()) {
checkingPieces.push(pawnAttack.extractLowestBitPosition());
if (checkingPieces.length > 1) {
return checkingPieces;
}
}
// ... evaluate attacks from the 4 other piece types
return checkingPieces;
}如果你只使用合法的棋子位置找到棋子,在实际游戏中可能出现的位置,那么一旦你找到2个棋子,你就可以停下来,因为3个棋子一次检查国王是不可能的。
我相信,一旦你在面具中找到一种,除了女王,你也可以放弃寻找一种类型的碎片。我认为,在一个合法的棋局中,国王不能同时被两个相同的棋子攻击,除非是两个皇后,因为一个典当捕获/升级到一个皇后可以进行检查,同时也可以发现一个女王的攻击。
https://stackoverflow.com/questions/66753660
复制相似问题