国际象棋中的主教运动

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

这只是代码的一半,只有 lmnc 正在更改。 我的问题是即使 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 是没用的,因为你有 lc
在你的函数中,你必须验证四件事。

1) 这件作品确实是主教
2) lc 不同于 mc
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