我正在制作一个国际象棋游戏,并有一个计算所有合法动作的类功能。它通过将一块作为参数并获得所有可能的攻击动作来实现。它然后循环通过这些动作并暂时移动它们以查看该动作是否会使自己受到检查,如果确实如此,那么它不是一个合法的举动:
def calculate_legal_moves(self, piece):
"""Get all the legal moves of a piece and returns them"""
legal_moves = []
if not isinstance(piece, Pawn):
possible_legal_moves = self.get_attacking_moves(piece)
for move in possible_legal_moves:
if isinstance(self.board[move[0]][move[1]], Piece):
if not piece.colour == self.board[move[0]][move[1]].colour:
possible_board = self.preliminary_move_piece(self.board, piece.position, move)
if not self.is_in_check(piece.colour, possible_board):
legal_moves.append(move)
else:
possible_board = self.preliminary_move_piece(self.board, piece.position, move)
if not self.is_in_check(piece.colour, possible_board):
legal_moves.append(move)
else:
if piece.colour == "White":
legal_moves.append([piece.position[0]-1, piece.position[1]])
if piece.position[0] == 6:
legal_moves.append([piece.position[0]-2, piece.position[1]])
else:
legal_moves.append([piece.position[0]+1, piece.position[1]])
if piece.position[0] == 1:
legal_moves.append([piece.position[0]+2, piece.position[1]])
return legal_moves
def preliminary_move_piece(self, chess_board, old_coords, new_coords):
chess_board[new_coords[0]][new_coords[1]] = self.board[old_coords[0]][old_coords[1]]
chess_board[old_coords[0]][old_coords[1]] = 0
if isinstance(chess_board[new_coords[0]][new_coords[1]], Piece):
chess_board[new_coords[0]][new_coords[1]].position = [new_coords[0], new_coords[1]]
return chess_board
问题是,我传入了板的实例(一个2d数组)并临时移动一块以查看是否将其置于检查状态,但它似乎是通过引用传递实例变量,所以实际上是永久性地改变棋子位置,因此当我点击它时,我的棋子自动移动到最后可能的合法移动。当我使用preliminary_move_piece函数时,有没有办法可以保持我的实例变量(self.board)不受影响
答案 0 :(得分:2)
由于list在python中是可变的,所以它通过引用函数传递。要想出来,你可以:
a)将其转换为元组:tuple(your_list)
因为元组是不可变的并且按值传递
b)以different ways之一复制您的清单,例如:
copied_list = your_list[:]
关于实际相同问题的非常相似的问题:
Python passing list as argument