在Python中创建国际象棋,并且主教运动受到主教的影响

时间:2017-04-10 23:01:31

标签: python class for-loop pygame chess

我正在使用Pygame制作国际象棋。

目前,我只能制作白棋和白主教。我为每个 WhitePawn WhiteBishop 类都有一个 projection()函数,它突出显示了棋子可以进行的位置。例如,如果在E2上有一个棋子,在E4上有一个主教,那么E2(当你点击该棋子时)和E3会亮起,但E4不会亮​​起,因为主教挡路了。当您点击点亮的方块时,它会将块移动到板上的那个位置。两个类的 noProjected()功能应该可以消除电路板上的点亮位置。

我现在的问题是,如果白色的棋子试图穿过白色主教的投射路径(即使我没有点击它),它也不会照亮广场,因此我无法移动到那里。例如,如果白色典当在D4上是E2和白色主教,那么当E2,E3和E4点亮时,E2和E4会亮起。

我确实猜测问题是底部的for循环:play.totalPlayList包含play.whitePawnList(板上的所有白棋子)和play.whiteBishopList。当我颠倒顺序时,在该列表中,典当运动起作用(当然主教运动没有)。所以即使我只点击了pawn,whiteBishop.noProjected()函数仍然被调用,我不想要。

class PlayWhiteBishop(pygame.sprite.Sprite):
    def __init__(self):
        self.select = 0
    def update(self):
    def highlight(self):
        self.image = images["sprWhiteBishopHighlighted"]
        self.select = 1
    def projected(self):
        for grid in room.gridList:
            for i in range(1,8):
                if ord(grid.coordinate[0]) == ord(self.coordinate[0])-i and grid.coordinate[1] == self.coordinate[1]-i and grid.occupied == 0:
                    grid.highlight()
            for i in range(1,8):
                if ord(grid.coordinate[0]) == ord(self.coordinate[0])-i and grid.coordinate[1] == self.coordinate[1]+i and grid.occupied == 0:
                    grid.highlight()
            for i in range(1,8):
                if ord(grid.coordinate[0]) == ord(self.coordinate[0])+i and grid.coordinate[1] == self.coordinate[1]-i and grid.occupied == 0:
                    grid.highlight()
            for i in range(1,8):
                if ord(grid.coordinate[0]) == ord(self.coordinate[0])+i and grid.coordinate[1] == self.coordinate[1]+i and grid.occupied == 0:
                    grid.highlight()
    def noHighlight(self):
        self.image = images["sprWhiteBishop"]
        self.select = 0
    def noProjected(self):
        #SAME EXACT CODE as projected() except replace grid.highlight() with grid.noHighlight()

while RUNNING:
    elif (event.type == pygame.MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]
        for pieceList in play.totalPlayList:
            for piece in pieceList:
                if (piece.rect.collidepoint(mousePos) and piece.select == 0):
                    piece.highlight()
                    piece.projected()
                else:
                    piece.noHighlight()
                    piece.noProjected()

谢谢!

1 个答案:

答案 0 :(得分:2)

你几乎已经自己发现了这个问题:你正在为电路板上的每个部件调用 noProjected(),无论它是否正在移动 - 这不是你需要的功能那里。相反,你需要等到玩家选择一个片段,然后拨打电话来跟踪那个片段的移动。

如果你要移动棋子,你就没有主教可以移动的业务处理;唯一的问题是主教本身是否在阻碍。您不应该根据多个攻击线更改突出显示。

最终游戏的一个注意事项:你在施法时必须注意:国王不能城堡出入,进入或通过检查:如果是中间广场在敌人的攻击下,玩家无法躲避。