国际象棋中的主教运动
Bishop movement in chess
我正在为 python3 的一个学校项目做国际象棋游戏。
我被困在主教运动中。我为所有棋子做了一切,但主教真的很难。以下是我如何编写我的电路板:
board=[["R1W","C1W","F1W","K1W","D1W","F2W","C2W","R2W"],
["P1W","P2W","P3W","P4W","P5W","P6W","P7W","P8W"],
["___","___","___","___","___","___","___","___"],
["___","___","___","___","___","___","___","___"],
["___","___","___","___","___","___","___","___"],
["___","___","___","___","___","___","___","___"],
["P1N","P2N","P3N","P4N","P5N","P6N","P7N","P8N"],
["R1N","C1N","F1N","D1N","K1N","F2N","C2N","R2N"]]
下面是我如何编程我的主教:
def fou_valide(piece,l,m,c,n):
if piece[0]=="F":
if (abs(m-l)+abs(n-c))%2==0 and l!=m and n!=c and board_fou_dame[l][c]==board_fou_dame[m][n] and abs(l-m)==abs(c-n):
if m>l and n>c:
for x in range(l+1,m):# on scanne les cases ou va passer la piece si elle ne passe par-dessus une pieces en effet elle ne peut pas sauter au dessus d\'une autre piece
for y in range(c+1,n):
if board[x][y]!="___":
print ("faux")
return False
return True
elif m>l and n<c:
for z in range(l+1,m):# on scanne les cases ou va passer la piece si elle ne passe par-dessus une pieces en effet elle ne peut pas sauter au dessus d\'une autre piece
for j in range(c-1,n,-1):
if board[z][j]!="___":
print ("fau")
return False
这只是代码的一半,只有 l
、m
、n
和 c
正在更改。
我的问题是即使 n>c
,它显示 "fau"
而不是 "faux"
这是我求职的方式:
l = int(input("ligne de selection?:\n"))-1 #on demande au joueur la ligne de la piece a selectionné
c = int(input("colonne de selection?:\n"))-1#on demande au joueur la colonne de la piece a selectionné
m = int(input("ligne de destination ?:\n"))-1#on demande au joueur la ligne ou il veut pose la piece
n = int(input("colonne de destination?:\n"))-1#on demande au joueur la colonne ou il veut pose la piece
piece = board[l][c] # piece correspond a la piece selectionné
事实上,piece
是没用的,因为你有 l
和 c
。
在你的函数中,你必须验证四件事。
1) 这件作品确实是主教
2) l
和 c
不同于 m
和 c
3) 他们在同一条对角线上
4) 两者之间的单元格是空闲的
4) 是最难的,除非你指出你需要检查的方向是(sign(m - l), sign(n - c))
。无需为每个方向或每种颜色编写不同的代码。
编辑:没有内置的sign
函数,你需要自己写。
def sign(n):
return 1 if n >= 0 else -1
然后,您可以使用适用于任何方向的单个 while 循环检查单元格。
def can_eat(l, c, m, n):
dl = sign(m - l)
dc = sign(n - c)
x, y = c + dc, l + dl
while x != n and y != m:
if board[y][x] != '___': # non empty cell
return False
x += dc
y += dl
return True
感谢 Bruno L,它现在工作正常,这是我使用的主教代码,这是一个简化版本:
def fou_valide(piece,l,m,c,n,):
if piece[0]=="F":#F in french stand for bishop, "Fou",
if l!=m and n!=c and abs(l-m)==abs(c-n): #the condition for the bishop movement
dl = sign(m - l)#it get the me direction of the movement
dc = sign(n - c)
x, y = c + dc, l + dl
while x != n and y != m:#This check if they are any non-empty cell on the way
if board[y][x] != '___': # non empty cell
return False
x += dc
y += dl
return True
return False
return True
符号函数如下:
def sign(z):
if z >= 0:
return 1
else:
return -1
我正在为 python3 的一个学校项目做国际象棋游戏。 我被困在主教运动中。我为所有棋子做了一切,但主教真的很难。以下是我如何编写我的电路板:
board=[["R1W","C1W","F1W","K1W","D1W","F2W","C2W","R2W"],
["P1W","P2W","P3W","P4W","P5W","P6W","P7W","P8W"],
["___","___","___","___","___","___","___","___"],
["___","___","___","___","___","___","___","___"],
["___","___","___","___","___","___","___","___"],
["___","___","___","___","___","___","___","___"],
["P1N","P2N","P3N","P4N","P5N","P6N","P7N","P8N"],
["R1N","C1N","F1N","D1N","K1N","F2N","C2N","R2N"]]
下面是我如何编程我的主教:
def fou_valide(piece,l,m,c,n):
if piece[0]=="F":
if (abs(m-l)+abs(n-c))%2==0 and l!=m and n!=c and board_fou_dame[l][c]==board_fou_dame[m][n] and abs(l-m)==abs(c-n):
if m>l and n>c:
for x in range(l+1,m):# on scanne les cases ou va passer la piece si elle ne passe par-dessus une pieces en effet elle ne peut pas sauter au dessus d\'une autre piece
for y in range(c+1,n):
if board[x][y]!="___":
print ("faux")
return False
return True
elif m>l and n<c:
for z in range(l+1,m):# on scanne les cases ou va passer la piece si elle ne passe par-dessus une pieces en effet elle ne peut pas sauter au dessus d\'une autre piece
for j in range(c-1,n,-1):
if board[z][j]!="___":
print ("fau")
return False
这只是代码的一半,只有 l
、m
、n
和 c
正在更改。
我的问题是即使 n>c
,它显示 "fau"
而不是 "faux"
这是我求职的方式:
l = int(input("ligne de selection?:\n"))-1 #on demande au joueur la ligne de la piece a selectionné
c = int(input("colonne de selection?:\n"))-1#on demande au joueur la colonne de la piece a selectionné
m = int(input("ligne de destination ?:\n"))-1#on demande au joueur la ligne ou il veut pose la piece
n = int(input("colonne de destination?:\n"))-1#on demande au joueur la colonne ou il veut pose la piece
piece = board[l][c] # piece correspond a la piece selectionné
事实上,piece
是没用的,因为你有 l
和 c
。
在你的函数中,你必须验证四件事。
1) 这件作品确实是主教
2) l
和 c
不同于 m
和 c
3) 他们在同一条对角线上
4) 两者之间的单元格是空闲的
4) 是最难的,除非你指出你需要检查的方向是(sign(m - l), sign(n - c))
。无需为每个方向或每种颜色编写不同的代码。
编辑:没有内置的sign
函数,你需要自己写。
def sign(n):
return 1 if n >= 0 else -1
然后,您可以使用适用于任何方向的单个 while 循环检查单元格。
def can_eat(l, c, m, n):
dl = sign(m - l)
dc = sign(n - c)
x, y = c + dc, l + dl
while x != n and y != m:
if board[y][x] != '___': # non empty cell
return False
x += dc
y += dl
return True
感谢 Bruno L,它现在工作正常,这是我使用的主教代码,这是一个简化版本:
def fou_valide(piece,l,m,c,n,):
if piece[0]=="F":#F in french stand for bishop, "Fou",
if l!=m and n!=c and abs(l-m)==abs(c-n): #the condition for the bishop movement
dl = sign(m - l)#it get the me direction of the movement
dc = sign(n - c)
x, y = c + dc, l + dl
while x != n and y != m:#This check if they are any non-empty cell on the way
if board[y][x] != '___': # non empty cell
return False
x += dc
y += dl
return True
return False
return True
符号函数如下:
def sign(z):
if z >= 0:
return 1
else:
return -1