国际象棋主教运动

时间:2018-05-20 18:53:02

标签: python python-3.6 chess

我正在为python3中的学校项目做一个国际象棋游戏。 我被困在主教运动中。我做了所有事情的一切动作,但主教真的很难。以下是我编写电路板的方法:

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

只有代码的一半mncn>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é

以下是我要求的职位:

{{1}}

2 个答案:

答案 0 :(得分:3)

事实上,piece是用途,因为您有lc。 在您的功能中,您必须验证四件事。

1)这件作品确实是一位主教 2)lcmc不同 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

答案 1 :(得分:1)

非常感谢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