首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bitboard Javascript --如何识别攻击国王的确切位置/位置

Bitboard Javascript --如何识别攻击国王的确切位置/位置
EN

Stack Overflow用户
提问于 2021-03-22 20:50:12
回答 1查看 249关注 0票数 1

我对比特板和位操作没有太多的了解,我也从Github那里得到了一些棋盘引擎的例子。我想知道是否有人能帮我解决问题。

我怎样才能确定攻击国王的确切部位?

我在isKingInCheck函数中得到了position.js中的一个例子,该函数只识别国王何时受到攻击(甚至识别该物品是典当还是主教等),但我需要确切地知道攻击国王的棋子(位置)。

我相信创建一个通用攻击掩码函数是可能的,如下所示。问题是,我不知道如何从position.js文件中声明的预先制作的比特板中单独获得每一块(以及它在游戏中的位置)。

代码语言:javascript
复制
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);
};

有人知道我怎么做到的吗?

EN

回答 1

Stack Overflow用户

发布于 2021-05-17 20:40:07

我认为找到支票最有效的方法是在你产生合法行为的同时找到它们。这将需要一些重构,可能会有点复杂。

一种更简单的方法是从国王的位置开始,通过为每个部件生成攻击掩码来使用isAttacked函数的重加工副本。

例如,如果您使用国王的颜色将国王的比特板发送到makePawnAttackMask函数,并在掩码和对面玩家的棋子之间应用一个逻辑值,您将得到一个包含检查棋子的位板。然后,您可以使用函数extractLowestBitPositiongetLowestBitPosition查找攻击典当的方格(如果存在的话)。在尝试提取最不重要位的位置之前,请确保位板是不是空的

代码语言:javascript
复制
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个棋子一次检查国王是不可能的。

我相信,一旦你在面具中找到一种,除了女王,你也可以放弃寻找一种类型的碎片。我认为,在一个合法的棋局中,国王不能同时被两个相同的棋子攻击,除非是两个皇后,因为一个典当捕获/升级到一个皇后可以进行检查,同时也可以发现一个女王的攻击。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66753660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档