python - bool 函数,用于确定白王是否处于检查棋盘上的给定位置

标签 python chess

我正在尝试编写一个程序,如果棋盘上的白王处于检查状态,该程序将返回 True。棋盘上的棋子以字符串形式生成并格式化,其中小写值是白色,大写值是黑色。:

r*x***k****p***P*****Q*****kp****K*****p***Pb****p***PP***X***KR
| | |X| | | |K|R|
| |p| | | |P|P| |
| | | |P|b| | | |
| |K| | | | | |p|
| | | |k|p| | | |
| | | | | |Q| | |
| | | |p| | | |P|
|r| |x| | | |k| |

我了解如何将棋盘上的单位转换为 x 和 y 坐标,以及棋盘上棋子的数学运算(检查 +7 和 +9 上的棋子,检查 ...-2、-1 上的车) ,+1,+2...和...-16,-8,+8,+16...,但我无法将其翻译为Python,或者如果它击中另一 block 或在它之前停止检查“经过”棋盘并再次循环。到目前为止,这是我的代码,但没有任何东西真正正常工作:

def white_check(coded_position):
    w_king = coded_position.find("x")
    w_king_x = w_king%8
    w_king_y = w_king//8
    result = False
    print(w_king)

    # This doesn't work if king is on x = 0 or 8
    # Returns true if pawn checks
    # if coded_position[w_king+7] == "P" or coded_position[w_king+9] == "P":
        #result = True

    # try using for loops and going up 1 / 8 at a time and trying each case for rooks / and bishops
    # checks right side for rooks
    for i in range(w_king,w_king-w_king_x+8):
        if coded_position[i] != "*" and coded_position[i] != "K":
            result = False
            break
        if coded_position[i] == "K":
            result = True

    # checks left side for rooks
    for i in range(w_king,w_king-w_king_x,-1):
        if coded_position[i] != "*" and coded_position[i] != "K":
            result = False
            break
        if coded_position[i] == "K":
            result = True

    print(result)
    return result

我认为我真的把这件事过于复杂化了,有什么明显的我遗漏的吗?

最佳答案

我不会给您代码(至少现在),但我可以提供一些步骤。

目前看来您正在将所有内容存储为长输入行上的索引。这使得事情变得更加困难,因此第一步是将棋盘表示为字符串列表,其中 1 的长度为 8。

你想要的结果是

board = ["r*x***k*",
         "***p***P",
         "*****Q**",
         "***kp***",
         "*K*****p",
         "***Pb***",
         "*p***PP*",
         "**X***KR"]

现在白王位于board[0][2],黑棋正在棋盘上移动。我们称之为 (0, 2)。

现在您需要计算 (0, 2) 是否处于检查状态。我这样做的方法是针对每种类型的作品(可能存在的地方)进行计算,以检查该位置。您可以将其存储为与当前国王位置的差异列表,并针对每个位置检查其中的东西是否是可以导致检查的棋子。

movements = {
    "P": [(1,-1), (1,1)],
    "R": [*[(0, i), (0, -i), (i, 0), (-i, 0)] for i in range(7)],
}

以下是兵和车的运动。如果 (0, 2)+(1, 1) 或 (0, 2)+(1,-1) 上有一个 pawn,并且这些位置位于网格内,则该 pawn 正在检查 (0, 2)。

要位于网格内,两个数字都必须在 0 到 7 之间(含 0 和 7)。

对于车来说,情况有点复杂。车可以攻击的位置是当行相同或列相同时,这就是为什么上述 Action 之一总是为 0。有了车,你的复杂性就会增加,你必须忽略任何阻碍。搜索国王左边、右边、上方和下方的所有内容可能会更容易,然后停止搜索

  • 您到达了棋盘的边缘 - 没有从这个方向检查
  • 您遇到的棋子不是车 - 没有被车从这个方向检查
  • 您遇到了一只车 - 您受到了控制...

我认为这足以完成这个任务。请记住,您不必检查每个位置,您只需要找到一个威胁国王的棋子即可。


之后就可以很简单地计算出一个国王是否被将死,因为这只是一个国王被检查,并且它周围的所有地方也都被检查,或者无效的地方。

关于python - bool 函数,用于确定白王是否处于检查棋盘上的给定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64825821/

相关文章:

python - SQL 行不会删除。不抛出任何错误

Python 异步 IO 图像处理

python - web2py 数据库中的外键

python - Python中子列表的高效匹配

javascript - 如何在D3中画棋盘?

python - gdal_merge.py 在安装了 gdal 和它的 python 绑定(bind)后不工作

scala - 是否可以使用 Apache Spark RDD 进行递归计算?

algorithm - 如何从最小最大算法中获得实际移动而不是移动值

chess - 如何确定有效的棋步?

c - KTouring递归代码