提问人:bigpython 提问时间:3/28/2023 更新时间:3/28/2023 访问量:40
尽管已定义,但无法在类之间传入参数
Cannot pass in parameter between classes despite being defined
问:
我是一个初学者程序员,编写了一个使用多个类的国际象棋程序。
一个类,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)
有关错误发生原因的任何帮助将不胜感激。
答:
1赞
Melon Pie
3/28/2023
#1
问题在于,您调用类函数时没有创建它的实例。这就是为什么该类还需要“self”参数的原因。您可以按如下方式创建实例。
move_instance = move()
move_instance.makeMove(moveList[l], board, pieceCaptured)
或
move().makeMove(moveList[l], board, pieceCaptured)
评论
move.makeMove
->move().makeMove