【问题标题】:Making the game Checkers in python with pygame but are running into minor logical errors使用 pygame 在 python 中制作游戏 Checkers 但遇到轻微的逻辑错误
【发布时间】:2021-01-17 02:18:39
【问题描述】:

问题是当这个有效的移动函数运行并遍历两个元组时,它只会在两个元组都应该作为有效移动附加时才附加第二个元组。

例如棋盘上的第一个动作,应该允许 (1, 1) 和 (-1, 1),但只允许 (-1, 1) 对于其他玩家总是反之亦然,坐标只是不同( (-1, -1) 和 (1, -1) )。

在跳棋中,如果你的对角线上有对手棋子,你可以从对角线上跳过它并拿走它。这工作正常,但同样只适用于第二个元组。我在调试器中逐步完成了它,它只是通过了第一个元组。我不知道为什么会这样,而且我已经被困了好几天了。该板是一个大列表,还有 8 个行列表。只是为了澄清问题在于这种方法,因为这块可以移动(1,1)但永远不会 (-1, 1)

获取鼠标位置只是遍历列表并检查是否允许移动。 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_x, 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, start_y, end_x, end_y)
            board.print_board()
            board.draw_board(screen)
            board.draw_checkers(screen)

【问题讨论】:

  • 您好,请您发一个minimal reproducible example,以便我们可以测试几件事。
  • 我把它放在同一个问题之外
  • 我真的不知道如何制作一个最小的可重现示例,但在调试器中它只是跳过第一个元组,即使它等于 1
  • 只是认为问题必须在这组代码中,如果你找不到解决方案,你能告诉我一个我可以而不是调试器的方法

标签: python pygame


【解决方案1】:

我建议简化您的代码。玩家的移动可以通过将xy乘以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_x, 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()

    # [...]

【讨论】:

  • 它有效,谢谢你能解释一下错误是因为我在有效移动功能中删除了碎片
  • 没关系,问题和以前一样,现在是红块和跳过
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多