正确计算死亡

在计算象棋国王的将军时,你是否确定其他玩家可能对抗国王? 或者你是否仅仅考虑他们单位的触角? 如果你说它是前者,那么就存在一个矛盾,比如“这个陈述是错误的”。考虑这个图像,两个国王相隔一个四方形,他们的骑士们保护着上面的车。 如果我们假设可能移动的定义必须阻止基于敌人可能移动的检查,那么逻辑将递归交替。

  • 首先,我们说我们的国王正在对敌方骑士进行检查,所以我们受限于移动自己的骑士,因为我们必须逃跑。
  • 然后我们意识到,骑士没有一个可用的进入我们国王的广场,因为他将把他的国王与我们的车进行检查。 毕竟他没有我们的国王。
  • 然后我们意识到,不受检查,我们现在能够将我们自己的骑士移动到敌方国王的位置,迫使他从支票移动并阻止他的选择。
  • 但是,我们注意到我们不能这样做,因为它会让我们与敌人的车进行核对。
  • 我们认识到,由于我们实际上无法移动我们的骑士,因此敌方国王实际上并没有受到检查,因此他可以自由地使用他的骑士攻击我们的国王。
  • 转到第2步(不管你已经有多少次)。
  • 好吧,也许我们假设无论敌方的检查状态如何,覆盖率总是很重要。 如果我们的国王达到了敌方骑士通常的攻击范围,我们认为它是一张支票,必须予以解决。 这是真正的游戏规则吗? 对编程游戏逻辑时遇到的问题似乎是一个简单的解决方案,但我不确定它是否正确。

    两者都检查,或两者都不?

    我做了一些思考,并提出了这样的分析:我认为你已经证明,两个国王被检查的情况(不一定是我展示的董事会的情况)不能以矛盾的方式存在。 一次只能有一名球员出招。 因此,一名球员进行了从无王队状态过渡到正在检查中的国王的初始移动。 根据规则,如果该球员的国王结果在检查中,则不允许此举。 (我会很快指出'结果'的意义)。这意味着无论如何定义检查,如果他的国王遇到这种情况,他就不能采取任何行动。 因此,从没有检查的唯一过渡到检查敌人。 敌人必须逃避检查,仍然遵循一次不进入支票的规则。 剩下的状态是比赛结束或国王逃跑检查。

    所以我明白,两个国王在检查是不可能的。 现在我展示的主板可以访问或不可访问。 让我们假设董事会是可及的,看看是否有矛盾。 由于场景是对称的,我们不明确地假定它轮到白色。 这意味着黑色刚刚移动。 因此,黑王不在检查中。 黑王只能由白骑士抵达。 因此,白骑士必须受到某种规则的限制,才不会攻击黑王。 唯一可以执行这一结论的两条规则是:

  • 白色骑士目前正在保护他的国王免受支票。
  • 白色国王已经在检查中,这一举措不会解决检查。
  • 首先,假定2是真实的,不管1是什么。白色国王在检查中,唯一在攻击范围内的是黑色骑士。 但是,黑骑士不能攻击含有国王的广场,因为它会把自己的国王放在一边。 所以1必须是真的,白王不在检查中。 所以两个国王都没有检查。 我们颠倒游戏板,看看它是否可达。 假设场景有以下改变:白色的黑色主体有2个主体和1个右边的主体。 黑王在左边一个方格。 白色国王在右边一个方格。 没有任何国王在任何其他棋子的范围内,所以假设这个初始状态是可达的是合理的。 黑骑士正在保护他的国王免受主教的侵害,所以它不能移动到白骑士下面。 白王向左移动。 现在白骑士正在保护白王,不能移动到黑骑士下。 黑王移动一个正方形。 因此,该场景是可达的。 唯一被怀疑的假设是,当考虑任何移动时,假设计算检查规则是安全的。 因此,国王可能会进入一个单位的范围,因为防止他自己的国王被检查,所以它不会攻击它。 如果没有这个假设,那么这些棋子可以遵循不允许国王进入敌方单位无限制攻击范围的规则。 现在,看看这个场景是否可以在没有无限循环的情况下进行计算是很有趣的。 对于依赖关系,我将使用箭头。 对于最初的白色国王左移,白王 - >黑骑士停止 - >白主教攻击黑王这些是单步计算,到目前为止没有依赖循环。 对于黑王移动,黑王 - >白骑士停 - >黑白攻击白王仍然没有依赖。 当我们现在试图检查白色骑士的可用动作,包括攻击黑色国王时呢? 白色骑士停下来 - >黑色白嘴鸦攻击白色国王如果白色白色车辆攻击黑色白嘴鸦怎么办? 白车停了 - >黑骑士攻击白王白剩下的选择是把王朝右移或下移。

    我们的结论,

  • 移动到这个委员会状态是可能的,而不会违反'不要进入检查'规则。
  • 这个委员会显然认为计算检查取决于可能的敌方移动,而不是它们简单的本地攻击范围。
  • 当达到这个状态时,两个国王都没有检查。
  • 至少可能这不是一个僵局。 (如果始终未知)
  • 所以我终于找到维基百科有关放置另一位国王的规则,即使它妥协了自己的国王。 所以,我们不能在第2部分中做出我们的假设,因此电路板状态不可达。 “一件不能移动的东西,因为它会把自己的国王放在一边(它固定在它自己的国王身上),可能仍然会向对方球员发放支票。” 因此,我们对国际象棋明显的实际规则的最终结论是,棋盘状态不可达,因为它遵循检查规则。

    由于遵循游戏规则的有价值逻辑,我将选择icedtrees答案:

    if for every move for player X (ignoring rules about king threats), 
    player Y can capture player X's king next turn, 
    then player X is in checkmate.
    

    但是,我会修复它们如下:

    {X is checkmate}
    if and only if {
        For all legal moves:(move according to rule definition) X {
           There exists a generic move:(legal move A ignoring rules of protecting king A) Y such that {
              X king is captured
           }
        }
    }
    

    我可能会误解,但我认为你的问题很容易被修正,因为只有在你自己才能确认是否有可能。 检查国际象棋强有力地与强制捍卫支票,如果它不轮到你不能这样做。

    对于任何国际象棋的位置,定义轮到谁是非常重要的,因为这在游戏中有很多机制。 在你的棋盘位置,如果轮到黑方,那么黑方将被检查,如果轮到白方,则检查白方。

    即使这个位置是不可能的,你仍然可以定义一些关于对棋局计算有利的位置的好规则。

    国际象棋中的将军的一些笔记:

    Checkmate实际上不是很直观,当你玩游戏时,你开始注意到有趣的checkmate情况,这些情况没有多大意义。

    在我看来,这是考虑将军的好方法:

  • 在合法的国际象棋比赛中,当发生同狱时,被选中的球员无法阻止他的国王被对方球员连续转牌。 也就是说,国际象棋中的将军只不过是“尽早结束游戏”,可以这么说。 如果你忽略国际象棋中关于国王威胁的所有规则,但保留棋子的运动模式,计算机可以通过展望计算死亡率。
  • 逻辑如下:

    如果对于玩家X的每一个动作(忽略关于国王威胁的规则),则玩家Y可以在下一回合中捕捉玩家X的王,然后玩家X处于将死状态。

    以下是“检查和转义检查”的更完整版本:

    由于X轮到了玩家X:如果玩家X的国王在玩家Y的棋子的移动范围内,那么它就会被检查。 如果这件作品无法逃脱检查,它是将死的。

    有三种逃避检查的方式:

  • 把你的国王移到一个没有被攻击的广场
  • 阻止提供支票的作品
  • 捕获检查片。

  • 也许你在想这个:-)

    这是来自正常工作的国际象棋程序的算法,这个算法在人力方面比较强大:

  • 生成移动侧的伪法律移动列表。 通过伪法律,我的意思是不用麻烦去核实所产生的移动是否让这边的国王受到检查。 省略此验证可以节省时间验证从未搜索过的移动。
  • 对于搜索到的每一个动作,验证它不会移动边检查。
  • 如果一举一动,国王就会被控制住,然后移动的一方或者交配,或者陷入僵局。
  • 如果移动侧目前处于检查状态,那么它是配对的。 否则就会陷入僵局。

  • 我天真的做法可能会这样。

    player.startTurn();
    if (player.isInCheck()
        if(player.king.hasNoLegalMoves() && player.cannotProtectKing())
            game.checkMate(player);
    
    function isInCheck() {
        boolean isInCheck = false;
        for (Piece p : player.Opponent)
            if (p.canAttack(player.king) {
                isInCheck = true;
                return;
            }
    

    我可能在这里错过了一些东西,但我不明白为什么它不会这么简单。

    链接地址: http://www.djcxy.com/p/84619.html

    上一篇: Computing Checkmate Correctly

    下一篇: How to move pieces in chess?