【问题标题】:Python Chess Piece Movement蟒蛇棋子运动
【发布时间】:2020-06-06 23:22:10
【问题描述】:

我在使用 Python 进行的早期国际象棋游戏中为棋子生成有效棋子时遇到了问题……我遇到了 Bishop 的问题。 下面是我的程序的一瞥...右下角的白色主教被选中,红色方块代表有效的移动...很明显主要问题是什么。

如果有阻挡棋子,我希望我的程序停止添加更多潜在动作,

^^ 不是重复的;我已经咨询了其他来源

主教课程:

class Bishop(Piece):
    def __init__(self, x, y, pl, im):
        Piece.__init__(self, x, y, pl, im) 

    def findAvailableMoves(self):
        for i in range(1, 8):
            for (dx, dy) in [(i, i), (i, -i), (-i, i), (-i, -i)]:
                if self.inBoundsPiece(self.cor.x + dx, self.cor.y + dy):
                    if board.board[self.cor.y + dy][self.cor.x + dx] == None:
                    self.potentialMoves.append((self.cor.y + dy, self.cor.x + dx))

class WBishop(Bishop):
    def __init__(self, x, y):
        Bishop.__init__(self, x, y, 1, wBishop)

class BBishop(Bishop):
    def __init__(self, x, y):
        Bishop.__init__(self, x, y, 2, bBishop)

【问题讨论】:

  • 如果您的问题需要图片,请通过问题编辑器上传,以便将其托管在可靠的地方。
  • 您能说明您要解决的问题吗?代码和图像似乎表明,如果没有其他部分,这确实找到了 bishop 可以移动到的所有空间。当遇到阻塞块时,您的代码中没有任何内容可以停止添加潜在移动,它所做的只是不将阻塞块自己的位置添加到潜在移动中。
  • 是的,主要问题是如果有一个阻塞块,我希望我的程序停止添加更多潜在动作

标签: python oop chess pyprocessing


【解决方案1】:

我认为最简单的解决方案是重新排列循环的顺序,因此外循环循环四个方向,内循环循环距离。然后在遇到阻塞块时停止内部循环。一旦搜索超出范围,您也可以停止内部循环。

def findAvailableMoves(self):
    for (dx, dy) in [(1, 1), (1, -1), (-1, 1), (-1, -1)]:
        for i in range(1, 8):
            (x, y) = (self.cor.x + i*dx, self.cor.y + i*dy)
            if self.inBoundsPiece(x, y) and board.board[x][y] == None:
                self.potentialMoves.append((x, y))
            else:
                break

【讨论】: