尽管已定义,但无法在类之间传入参数

Cannot pass in parameter between classes despite being defined

提问人:bigpython 提问时间:3/28/2023 更新时间:3/28/2023 访问量:40

问:

我是一个初学者程序员,编写了一个使用多个类的国际象棋程序。

一个类,chessboard 类,定义了一些变量,这些变量在我的程序中使用。相关的是 board 和 pieceCaptured。

class chessboard(
):  #creates a chessboard visualised through a 2D list. This list will determine the positions and types of pieces on the board
    def __init__(self):
      self.board = [
            ['bR', 'bN', 'bB', 'bQ', 'bK', 'bB', 'bN', 'bR'],
            ['bp', 'bp', 'bp', 'bp', 'bp', 'bp', 'bp', 'bp'],
            ['--', '--', '--', '--', '--', '--', '--', '--'],
            ['--', '--', '--', '--', '--', '--', '--', '--'],
            ['--', '--', '--', '--', '--', '--', '--', '--'],
            ['--', '--', '--', '--', '--', '--', '--', '--'],
            ['wp', 'wp', 'wp', 'wp', 'wp', 'wp', 'wp', 'wp'],
            ['wR', 'wN', 'wB', 'wQ', 'wK', 'wB', 'wN', 'wR'],
        ]
      self.whiteTurn = True
      self.moveLog = []
      self.pieceCaptured = [] #list of all the pieces that have been captured

makeMove 类使用户输入移动(我知道我的代码效率低下)。

  • 坐标是两个方块的列表,用户单击这两个方块将一个方块从一个方块移动到下一个方块。
class move():
  def makeMove(self, coords, board, pieceCaptured):
    x = board.board[coords[0][0]][coords[0][1]]
    if board.board[coords[1][0]][coords[1][1]] == '--' and x != '--':
      board.board[coords[0][0]][coords[0][1]] = board.board[coords[1][0]][coords[1][1]]
      board.board[coords[1][0]][coords[1][1]] = x
      self.capture = False #a piece has not been captured
    elif board.board[coords[1][0]][coords[1][1]] != '--': #if a piece has been captured
      pieceCaptured.append(board.board[coords[1][0]][coords[1][1]]) #adds the captured piece to the list
      self.capture = True #a piece has been captured
      board.board[coords[1][0]][coords[1][1]] = board.board[coords[0][0]][coords[0][1]]
      board.board[coords[0][0]][coords[0][1]] = '--'
    board.moveLog.append([coords[0], coords[1]]) #adds the move to the list

validMoves 函数使用在 legalMoves 函数中返回的移动列表,并检查它们是否会导致 king 被检查。只有代码的这一部分应该是相关的。

class defineMoves():
  def validMoves(self, coords, whiteTurn, board, pieceCaptured): #return all of the valid moves that take into account whether the king will be put in check or not
    #1. return a list of all the possible moves
    moveList = self.legalMoves(coords, whiteTurn, board)
    #2. make every move possible
    for l in range(len(moveList)-1, -1, -1): #iterates backwards through the move list
      #moveList[l] = coords
      move.makeMove(moveList[l], board, pieceCaptured) <-- PROBLEM HERE

运行运行 makeMove 函数的行“move.makeMove(moveList[l], board, pieceCaptured)”时,返回以下错误:

TypeError:move.makeMove() 缺少 1 个必需的位置参数:“pieceCaptured”

手动添加 self 作为参数并不能解决问题。 除此之外,我想不出是什么原因导致了问题,因为我清楚地在需要的地方和正确的位置引入了参数。

对于上下文,chessboard 类在不同的模块中使用。

c = chess.chessboard()

此外,validMoves 在不同的模块中定义和运行。


validMoves = m.validMoves(coords, c.whiteTurn, c.board, c.pieceCaptured)
if coords in validMoves:
     move.makeMove(coords, c, c.pieceCaptured)

有关错误发生原因的任何帮助将不胜感激。

python 参数 传递 国际象棋

评论

0赞 Mathias R. Jessen 3/28/2023
move.makeMove -> move().makeMove

答:

1赞 Melon Pie 3/28/2023 #1

问题在于,您调用类函数时没有创建它的实例。这就是为什么该类还需要“self”参数的原因。您可以按如下方式创建实例。

move_instance = move()
move_instance.makeMove(moveList[l], board, pieceCaptured)

move().makeMove(moveList[l], board, pieceCaptured)