gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:35:22 25 4
gpt4 key购买 nike

我正在尝试编写一个程序,如果棋盘上的白王在检查中,它将返回 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

我想我真的把这个复杂化了,有什么明显的我遗漏了吗?

最佳答案

我不会给你代码(至少现在是),但我可以给出一些步骤。
目前看起来您将所有内容都存储为长输入行上的索引。这使它变得更难,所以第一步是将棋盘表示为一个字符串列表,其中一个是 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)],
}
这是一个兵和车的 Action 。如果 (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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com