让国际象棋中的敌人可能移动到2D阵列 - Python

时间:2015-06-23 10:13:02

标签: python arrays chess

我有三个数组,

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阵列填充False名为whiteMoves和blackMoves 。我想要的是一个功能

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

例如:

  • 如果国际象棋[5] [0](或a3)中有敌人,则whiteMoves [5] [0]应该变为True,因为国际象棋[7] [1](b2)中的棋子可以吃掉它。
  • 如果黑人女王将下棋[7] [0](a1)和国际象棋[7] [1](b1),则blackMoves [7] [1]应该变为True。
  • 如果国际象棋[0] [0](a8)中存在黑色危险,则 whiteMoves [0] [0]应为True。

我尝试了许多不同的方法来做到这一点,但它们非常复杂,并且没有一个完全有效。这是我的国际象棋比赛结束前唯一要做的事情。

1 个答案:

答案 0 :(得分:1)

迭代棋盘上的碎片。对于每件作品,根据该作品的移动规则缩小目标方块:

  • King可以移动到相邻的8个方格或每边两个方格
  • Pawns可以向前移动一个或两个方格,或者向前一个方向移动。

对于每个这样的候选移动,测试附加约束是否阻止候选移动:

  • 如果是城堡,King只能将两个方块移到一边。
  • 如果它能抓住一个对手(可能是通行证),典当只能向前对角移动。
  • 鲁克不能跳过其他作品

如果将这两个传递合并为一个传递,则可以节省一些CPU周期:

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

这些 复杂的东西。例如。在最终决定采取行动之前,你必须检查国王是否在接受检查。