Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确定白王是否在棋盘上指定位置的布尔函数_Python_Chess - Fatal编程技术网

Python 确定白王是否在棋盘上指定位置的布尔函数

Python 确定白王是否在棋盘上指定位置的布尔函数,python,chess,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| |

我正在尝试编写一个程序,如果棋盘上的白王被选中,该程序将返回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,也无法在它击中另一个棋子或在它“通过”之前停止检查跳板并再次循环。这是到目前为止我的代码,但没有任何东西真正正常工作:

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"]
现在白王在
板[0][2]
,黑王在板上向上移动,我们称之为(0,2)

现在你需要计算出(0,2)是否在检查中。我的方法是计算出每种类型的工件,如果可以的话,将此位置置于检查中。你可以将其存储为与当前king位置的差异列表,并检查每个工件中的东西是否是可以引起检查的工件

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)上有棋子,并且这些位置在网格内,则棋子正在检查(0,2)

要在网格内,两个数字必须介于0和7之间(包括0和7)

对于rook来说,它有点复杂。rook可以攻击的位置是当行相同或列相同时,这就是为什么在上面的一个移动中总是有一个0。对于rook,你有额外的复杂性,你必须忽略任何阻碍。搜索剩下的所有东西可能会更容易国王,在右边,在上面,在下面,当你

  • 您到达了电路板的边缘-未从此方向进行检查
  • 你遇到了一块不是车的东西-没有被车从这个方向检查
  • 你遇到一辆车-你在检查
我想这就足够了。记住,你不必检查每个地方,你只需要找到一块威胁国王的东西



之后,确定一个国王是否被将死是相当简单的,因为这只是一个国王是否被将死,而它周围的所有地方也都被将死,或者是无效的地方。

我想你把这件事弄得更复杂了。以下是我将使用的步骤:

  • 找到国王的位置

  • 在嵌套循环中,从该位置沿所有8个方向循环

  • 当你到达一个白色的块(大写字母),打破这个方向

  • 当你们到达板的末端时,打破那个方向

  • 如果您到达一个黑色块(小写),您有4个选项要检查:

    a、 这件作品是正交的国王,是一辆车

    b、 这件作品是国王的对角线,是一位主教

    c、 这块棋子与国王的对角线距离为1平方,是一个棋子

    d、 任何方向和片段都是女王

  • 如果a-d中的任何一个为真,则返回真(king处于检查中)。如果整个循环结束,则返回假


    如果你需要,我可以给你我的支票的密码。

    你说的
    检查+7和+9上的兵是什么意思,检查…-2,-1,+1,+2…和…-16,-8,+8,+16…上的车是什么意思。
    什么是
    编码的位置
    ?这个密码的想法是正确的。如果你觉得“什么都不起作用”,简单启动:编写一个程序,检查黑车是否仅从左侧攻击白王。添加一些测试用例进行检查,验证这些工作是否正常。然后,扩展程序,同时检查黑根是否仅从右侧攻击(或将程序参数化以从任何一侧进行检查)。添加测试,重复,直到涵盖所有内容。此外,使用合理的变量名也会有所帮助。
    i
    可能会混淆;
    x
    y
    或(
    文件
    )使代码更清晰。编码的_位置被输入到一个生成的字符串中,例如:
    r*x***k****p****p****Q****kp****k****p****Pb****p****PP****x****KR
    其中+7和+9表示检查字符串的高度。无更多提示:如果编写帮助函数
    get(编码的_位置,x,y)
    返回该位置的片段(或将字符串转换为二维列表),则无需一直重复该代码。如果遇到True,请不要在进一步的for循环中重置
    结果
    -调用
    返回True
    谢谢,这是很大的帮助。我想我将使用get()相反,提到了@phihag的helper定义,因为获取国王在2D数组中的位置似乎很复杂。