问题描述
问题是当这个有效的移动函数运行并遍历 2 个元组时,它只在两个元组都应该作为有效移动附加时才附加第二个元组。
例如棋盘上的第一个动作, (1,1) 和 (-1,1) 都应该被允许,但只有 (-1,1) 被允许,反之亦然,对于其他玩家,坐标只是不同( (-1,-1) 和 (1,-1) ).
在跳棋中,如果您的对角线上有对手棋子,您可以对角线跳过它并拿下它。这工作正常,但同样仅适用于第二个元组。我已经在调试器中遍历了它,它只是通过了第一个元组。我不知道为什么会这样,我已经被困了好几天了。该板是一个大列表,还有 8 个行列表。只是为了澄清问题在于这种方法,因为该部分可以移动(1,1)但永远不会 (-1,1)
get mouse pos 简单地遍历列表并检查是否允许移动。 get turn 函数只是相应地改变了转弯。
最后一点来自主文件,它是我唯一链接到问题的内容,但在调试器中,valid_moves 函数似乎有问题。
self.directions_1 = [(-1,-1),(1,- 1)]
def valid_moves(self,start_x,start_y):
"""
Find all of the valid moves for a selected piece and append them to a list
"""
start_column = int(start_x // SQUARESIZE)
start_row = int(start_y // SQUARESIZE)
if self.turn == player2:
for d in self.directions_1:
x,y = d
self.white_valid_moves.clear()
if self.board[start_row + x][start_column + y] == 0:
self.white_valid_moves.append((x,y))
if self.board[start_row + x][start_column + y] == player1:
if x == -1 and y == -1:
self.white_valid_moves.append((x - 1,x - 1))
self.board[start_row + x][start_column + y] = 0
if x == 1 and y == -1:
self.white_valid_moves.append((x + 1,y - 1))
self.board[start_row + x][start_column + y] = 0
def get_mouse_pos_and_place(self,start_y,end_x,end_y):
"""
Takes care of placing a piece and iterating through the valid moves lists
"""
start_column = int(start_x // SQUARESIZE)
start_row = int(start_y // SQUARESIZE)
end_column = int(end_x // SQUARESIZE)
end_row = int(end_y // SQUARESIZE)
if (self.board[start_row][start_column]) in (player1,player2):
if self.turn == player1:
for x,y in self.red_valid_moves:
print(self.red_valid_moves)
if (x == start_column - end_column) and (y == start_row - end_row):
self.board[start_row][start_column] = 0
self.board[end_row][end_column] = player1
elif self.turn == player2:
for x,y in self.white_valid_moves:
print(self.white_valid_moves)
if (x == start_column - end_column) and (y == start_row - end_row):
self.board[start_row][start_column] = 0
self.board[end_row][end_column] = player2
self.get_turn()
if event.type == pygame.MOUSEBUTTONDOWN:
start_x = event.pos[0]
start_y = event.pos[1]
if event.type == pygame.MOUSEBUTTONUP:
end_x = event.pos[0]
end_y = event.pos[1]
board.valid_moves(start_x,start_y)
board.get_mouse_pos_and_place(start_x,end_y)
board.print_board()
board.draw_board(screen)
board.draw_checkers(screen)
解决方法
我建议简化您的代码。玩家的移动可以通过将 x
和 y
乘以 2 来计算。
在评估可能的移动时,不要移除对手的棋子。现在还为时过早,它会沿可能的移动移除所有对手:
def valid_moves(self,start_x,start_y):
"""
Find all of the valid moves for a selected piece and append them to a list
"""
start_column = int(start_x // SQUARESIZE)
start_row = int(start_y // SQUARESIZE)
if self.turn == player2:
self.white_valid_moves.clear()
for d in self.directions_1:
x,y = d
if self.board[start_row + x][start_column + y] == 0:
self.white_valid_moves.append((x,y))
elif self.board[start_row + x][start_column + y] == player1:
self.white_valid_moves.append((x*2,y*2))
你必须在玩家移动时移除对手:
def get_mouse_pos_and_place(self,start_y,end_x,end_y):
"""
Takes care of placing a piece and iterating through the valid moves lists
"""
start_column = int(start_x // SQUARESIZE)
start_row = int(start_y // SQUARESIZE)
end_column = int(end_x // SQUARESIZE)
end_row = int(end_y // SQUARESIZE)
if (self.board[start_row][start_column]) in (player1,player2):
if self.turn == player1:
valid_moves = self.red_valid_moves
else
valid_moves = self.white_valid_moves
dx = end_column - start_column
dy = end_row - start_row
if (dx,dy) in valid_moves:
self.board[start_row][start_column] = 0
self.board[start_row + dx//2][start_column + dy//2] = 0
self.board[end_row][end_column] = self.turn
self.get_turn()
# [...]