Python 确定白王是否在棋盘上指定位置的布尔函数
我正在尝试编写一个程序,如果棋盘上的白王被选中,该程序将返回True。电路板上的数据段生成为字符串,并按字符串格式进行格式化,其中小写值为白色,大写值为黑色: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| |
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,你有额外的复杂性,你必须忽略任何阻碍。搜索剩下的所有东西可能会更容易国王,在右边,在上面,在下面,当你
- 您到达了电路板的边缘-未从此方向进行检查
- 你遇到了一块不是车的东西-没有被车从这个方向检查
- 你遇到一辆车-你在检查
之后,确定一个国王是否被将死是相当简单的,因为这只是一个国王是否被将死,而它周围的所有地方也都被将死,或者是无效的地方。我想你把这件事弄得更复杂了。以下是我将使用的步骤:
如果你需要,我可以给你我的支票的密码。你说的
检查+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数组中的位置似乎很复杂。