簡體   English   中英

使用 pygame 在 python 中制作游戲 Checkers 但遇到輕微的邏輯錯誤

[英]Making the game Checkers in python with pygame but are running into minor logical errors

問題是當這個有效的移動 function 運行並通過 2 個元組時,它只會在兩個元組都應該作為有效移動附加時才附加第二個元組。

例如,棋盤上的第一步,應該允許 (1, 1) 和 (-1, 1) 但只允許 (-1, 1) 對於其他玩家總是反之亦然,坐標只是不同( (- 1, -1) 和 (1, -1) )。

在跳棋中,如果您的對角線上有對手棋子,您可以對角跳過它並拿走它。 這工作正常,但同樣只適用於第二個元組。 我在調試器中逐步完成了它,它只是通過了第一個元組。 我不知道為什么會這樣,而且我已經被困了好幾天了。 該板是一個大列表,還有 8 個行列表。 只是為了澄清問題在於這種方法,因為棋子可以移動 (1,1) 但永遠不能移動 (-1, 1)

get mouse pos 簡單地遍歷列表並檢查是否允許移動。 get 轉彎 function 只是相應地改變轉彎。

最后一點來自主文件,它是我唯一鏈接到問題的東西,但在調試器中,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)

我建議簡化您的代碼。 玩家的移動可以通過將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()

    # [...]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM