【问题标题】:Get enemy's possible moves in chess to a 2D array - Python将国际象棋中敌人的可能移动到二维数组 - Python
【发布时间】:2015-06-23 10:13:01
【问题描述】:

我有三个数组,

chess = [["c","d","e","f","g","e","d","c"],
         ["b","b","b","b","b","b","b","b"],
         ["a","a","a","a","a","a","a","a"],
         ["a","a","a","a","a","a","a","a"],
         ["a","a","a","a","a","a","a","a"],
         ["a","a","a","a","a","a","a","a"],
         ["h","h","h","h","h","h","h","h"],
         ["i","j","k","l","m","k","j","i"]]

存储棋子的位置,('a' 是空的,'b' 是黑色棋子等)和另外两个 8x8 数组,其中填充了名为 whiteMoves 和 blackMoves 的 False。我想要的是一个函数

def getEnemyMoves():
    global chess, whiteMoves, blackMoves
    doSomethingToWhiteMoves()
    doSomethingToBlackMoves()

例如这些:

  • 如果 chess[5][0](或 a3)中有一个敌​​方棋子,whiteMoves[5][0] 应该变为 True,因为 chess[7][1] (b2) 中的棋子可以吃掉它。
  • 如果黑皇后在 chess[7][0] (a1) 中,而国王在 chess[7][1] (b1) 中,则 blackMoves[7][1] 应为 True。
  • 如果 chess[0][0] (a8) 中有黑子处于危险中,则 whiteMoves[0][0] 应为 True。

我尝试了许多不同的方法来做到这一点,但它们都非常复杂,而且没有一个能完全发挥作用。这是我的棋局结束前唯一要做的事情。

【问题讨论】:

  • 也许你应该考虑一个更好的数据表示。您的角色很难在程序中使用,并且作为输出信息量不大。

标签: python arrays chess


【解决方案1】:

遍历棋盘上的棋子。对于每个棋子,根据该棋子的移动规则缩小目标方格:

  • 国王可以移动到相邻的 8 个方格或每边两个方格
  • 棋子可以向前移动一格或两格,或沿对角线向前移动一格。

对于每个这样的候选移动,测试是否有额外的约束阻止该候选移动:

  • King 只能将两个方格移到一边,如果它是城堡的话。
  • 如果棋子抓住了对手的棋子(可能是过路者),它只能沿对角线向前移动。
  • Rook 无法跳过其他棋子

如果将这两个通道组合成一个通道,可以节省一些 CPU 周期:

  • 如果 a1 上的车不能移动到 a3,因为挡块,它肯定不能移动到 a4、a5、a6、a7 和 a8。

这些东西复杂的。例如。在最终决定行动之前,您必须测试国王是否在控制中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多