当前位置: 首页 > 知识库问答 >
问题:

在Python中创建国际象棋,棋子的移动受到主教的影响

廖永长
2023-03-14

我正在用pygame做象棋。

我猜测问题出在底部的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个答案

东门奕
2023-03-14

您自己基本上已经确定了问题所在:对电路板上的每一块都调用noproject(),而不管它是否在移动--这不是您需要的功能。取而代之的是,你需要等到玩家选择了一个棋子,然后调用来跟踪该棋子的移动。

如果你在移动棋子,你就没有主教可以移动的业务处理;唯一的问题是主教本身是否碍事。你不应该根据多条攻击线来改变高光。

最后的游戏需要注意的一点是:你必须注意:国王不能进入、进入或通过检查:如果中间的方块受到敌人的攻击,玩家不能进入。

 类似资料:
  • 上面的代码显示了一个可以上下移动的部分的示例。这不是一个有效的棋步。所以,如果我要移动一个皇后,我该怎么做呢?我们只是假设我们已经有了一个矩阵(x,y)8×8的板。

  • 我正在下国际象棋,除了一件事,我几乎得到了所有的东西:我需要使棋手不可能将棋子移动到棋盘上。我很难解决这个问题。 我现在用伪代码生成的有效移动是:类getMoveLocations(我定义了一个位置为国际象棋中的一个方块):如果这个位置在边界内,这个位置的棋子是敌人的棋子,并且模拟的移动不会导致棋盘被检查,然后将该位置添加到工件可以移动到的可能位置。 问题是我如何检查棋盘是否“在检查中”。在我的代

  • 我是编程的新手,我正在尝试实现一个小的象棋游戏。 我目前正在为每件作品的验证移动而挣扎。 字典是: 我在每个子类中都创建了一个函数(Pawn,Rook,Queen...)这应该能证明这次行动是正确的。语法类似于: 目前,我可以移动任何白色树懒或树懒上有一个黑色的部分(但我不能吃我自己),反之亦然。 我想我使用的是而不是列表列表这一事实使事情变得更加困难。我真的迷路了。这将是惊人的,如果你可以帮助我

  • DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。

  • 我已经有一个Board对象,包含一个碎片列表。Piece是一个抽象类,有一个位置(x,y)和一个颜色(黑色或白色)。然后是King、Queen、Knight这三个类,实现了Piece类。 谢谢

  • 我正在使用Python Chess在Python中使用NegaScout实现一个国际象棋引擎。我发现了一个方便的函数它反转棋盘,使黑色为白色,反之亦然。这对于Negamax和NegaScout来说是必不可少的。但是,这会删除移动堆栈。我可以手动反转移动堆栈中的所有移动,将其复制到列表中,反转每个移动并将其分配回翻转的棋盘,但是否有更简单的方法来做到这一点?我需要自树的基础(文本移动)以来的位置的完