【问题标题】:Creating Chess in Python, and Pawn Movement Gets Affected By Bishop在 Python 中创建国际象棋,棋子运动受到 Bishop 的影响
【发布时间】:2017-04-10 23:01:31
【问题描述】:

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

目前,我只有制作白兵和白象的能力。我对每个 WhitePawnWhiteBishop 类都有一个 projected() 函数,它突出显示棋子可以去的棋盘上的位置。例如,如果 E2 上有一个棋子,E4 上有一个象,那么 E2(当您单击棋子时)和 E3 会亮起,但 E4 不会亮起,因为象在路上。当你点击点亮的方块时,它会将棋子移动到棋盘上的那个位置。两个类的 noProjected() 函数都应该删除板上的点亮位置。

我现在的问题是,如果白色棋子试图通过白色主教的投影路径(即使我没有点击它),它不会点亮正方形,因此我不能移动到那里.例如,如果一个白兵在 E2 上,而白象在 D4 上,则 E2 和 E4 亮起,而 E2、E3 和 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()

谢谢!

【问题讨论】:

    标签: python class for-loop pygame chess


    【解决方案1】:

    您自己几乎已经发现了问题:您正在为板上的每一块调用 noProjected(),无论它是否在移动 - 这不是您需要的功能那里。相反,您需要等到玩家选择了一个棋子,然后调用以跟踪仅 个棋子的移动。

    如果你在移动棋子,你就没有象可以移动的业务处理;唯一的问题是主教本身是否妨碍了。您不应该根据多条攻击线更改亮点。

    您最终游戏的一个注意事项:您确实在施放时必须注意:国王不能施放出、入或穿过检查:如果那个中间方格受到敌人攻击,玩家无法城堡。

    【讨论】:

    • 感谢您的解释!我现在明白了这个问题,下一步是弄清楚如何编写解决方案......
    • 只关心选定的部分。向每个合法方向投射它的路径,当你击中棋盘边缘、友方棋子(停止)或敌方棋子(可以捕获)时停止。这可能很明显,但我知道有时很难记住所有细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2022-06-17
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多