首页 > 解决方案 > 切换到 Pygame 中的另一个窗口后,用户选择的按钮重置为默认值

问题描述

我一直在尝试使用 PyGame 创建一个简单的游戏。游戏中有一个选项供用户将他们的棋盘颜色自定义为游戏中可用的六种可能颜色之一。所以基本上,如果用户点击棋盘图标,就会打开一个新窗口,让他们选择他们喜欢的棋盘颜色,如下所示:

木板

通过单击带有棋盘图像的第一个图标,选项窗口打开:

选项

如您所见,默认板设置为绿色(如预期的那样),现在图像用户想要一个蓝色板,因此他们单击写有“BLUE”的按钮。结果是这样的:

新板

现在,正如预期的那样,我们有一个蓝板。现在假设用户不喜欢蓝色并决定再次选择另一种板颜色,因此他们再次打开选项窗口:

选项赢

看看刚刚发生了什么,尽管用户上次选择了“蓝色”,但被选中的按钮再次设置为默认的“绿色”。

如何解决此问题并使其不再设置为默认值?以下是与上述功能相对应的代码片段:

def board_color_select(board_default=0, piece_default='pawn', pos=(336, 252)):
    bg = pygame.image.load('/home/liana/Downloads/ffcba4.png')
    return_button = pygame.image.load('/home/liana/Downloads/icons8-reply-arrow-64(1).png')
    grey_mode_button = pygame.image.load('/home/liana/Desktop/CGB02-grey_M_btn.png')
    green_mode_button = pygame.image.load('/home/liana/Desktop/CGB02-green_M_btn.png')

    green_font = pygame.image.load('/home/liana/Downloads/text-1629543607354.png')
    grey_font = pygame.image. load('/home/liana/Downloads/text-1629543845773.png')
    pink_font = pygame.image.load('/home/liana/Downloads/text-1629544089972.png')
    blue_font = pygame.image.load('/home/liana/Downloads/text-1629544268459.png')
    purple_font = pygame.image.load('/home/liana/Downloads/text-1629544429630.png')
    red_font = pygame.image.load('/home/liana/Downloads/text-1629544606588.png')
    board_font = pygame.image.load('/home/liana/Downloads/text-1629544715543.png')

    pygame.init()

    root = pygame.display.set_mode((672, 672))
    pygame.display.set_caption('Board Design')
    font = pygame.font.SysFont("Arial", 55)
    textsurface = font.render("BOARD", False, (255, 255, 255))
    mode_font = pygame.font.SysFont("Arial", 25)

    mode_one_surface = mode_font.render("GREEN", False, (255, 255, 255))
    mode_two_surface = mode_font.render("BLUE", False, (255, 255, 255))
    mode_three_surface = mode_font.render("PINK", False, (255, 255, 255))
    mode_four_surface = mode_font.render("GREY", False, (255, 255, 255))
    mode_five_surface = mode_font.render("RED", False, (255, 255, 255))
    mode_six_surface = mode_font.render("PURPLE", False, (255, 255, 255))

    run = True

    #default = 0
    
    while run:
        root.blit(bg, (0, 0))
        root.blit(board_font, (229, 30))
        root.blit(return_button, (7, 7))

        mx, my = pygame.mouse.get_pos()

        mode_one_button_collide = pygame.Rect(50, 150, 256, 140)
        mode_two_button_collide = pygame.Rect(50, 320, 256, 140)
        mode_three_button_collide = pygame.Rect(50, 490, 256, 140)
        mode_four_button_collide = pygame.Rect(366, 150, 256, 140)
        mode_five_button_collide = pygame.Rect(366, 320, 256, 140)
        mode_six_button_collide = pygame.Rect(366, 490, 256, 140)
        return_button_collide = pygame.Rect(7, 7, 50, 50)

        if mode_two_button_collide.collidepoint((mx, my)):
            if click:
                board_default = 1 #mode 2
                
        elif  mode_one_button_collide.collidepoint((mx, my)):
            if click:
                board_default = 6 #mode 1

        elif mode_three_button_collide.collidepoint((mx, my)):
            if click:
                board_default = 2 #mode 3

        elif mode_four_button_collide.collidepoint((mx, my)):
            if click:
                board_default = 3 #mode 4
        elif mode_five_button_collide.collidepoint((mx, my)):
            if click:
                board_default = 4 #mode 5
        elif mode_six_button_collide.collidepoint((mx, my)):
            if click:
                board_default = 5 #mode 6
        elif return_button_collide.collidepoint((mx, my)):
            if click:
                game(board_default, piece_default, pos)

        if board_default == 1: #if mode 1 is selected
            root.blit(green_mode_button, (50, 320))
            root.blit(grey_mode_button, (50, 150))
            root.blit(grey_mode_button, (50, 490))
            root.blit(grey_mode_button, (366, 150))
            root.blit(grey_mode_button, (366, 320))
            root.blit(grey_mode_button, (366, 490))
            game(board_default, piece_default, pos)

        elif board_default == 0:
            root.blit(green_mode_button, (50, 150))
            root.blit(grey_mode_button, (50, 320))
            root.blit(grey_mode_button, (50, 490))
            root.blit(grey_mode_button, (366, 150))
            root.blit(grey_mode_button, (366, 320))
            root.blit(grey_mode_button, (366, 490))
            
        elif board_default == 2:
            root.blit(grey_mode_button, (50, 150))
            root.blit(grey_mode_button, (50, 320))
            root.blit(green_mode_button, (50, 490))
            root.blit(grey_mode_button, (366, 150))
            root.blit(grey_mode_button, (366, 320))
            root.blit(grey_mode_button, (366, 490))
            game(board_default, piece_default, pos)

        elif board_default == 3:
            root.blit(grey_mode_button, (50, 150))
            root.blit(grey_mode_button, (50, 320))
            root.blit(grey_mode_button, (50, 490))
            root.blit(green_mode_button, (366, 150))
            root.blit(grey_mode_button, (366, 320))
            root.blit(grey_mode_button, (366, 490))
            game(board_default, piece_default, pos)

        elif board_default == 4:
            root.blit(grey_mode_button, (50, 150))
            root.blit(grey_mode_button, (50, 320))
            root.blit(grey_mode_button, (50, 490))
            root.blit(grey_mode_button, (366, 150))
            root.blit(green_mode_button, (366, 320))
            root.blit(grey_mode_button, (366, 490))
            game(board_default, piece_default, pos)

        elif board_default == 5:
            root.blit(grey_mode_button, (50, 150))
            root.blit(grey_mode_button, (50, 320))
            root.blit(grey_mode_button, (50, 490))
            root.blit(grey_mode_button, (366, 150))
            root.blit(grey_mode_button, (366, 320))
            root.blit(green_mode_button, (366, 490))
            game(board_default, piece_default, pos)

        elif board_default == 6:
            root.blit(green_mode_button, (50, 150))
            root.blit(grey_mode_button, (50, 320))
            root.blit(grey_mode_button, (50, 490))
            root.blit(grey_mode_button, (366, 150))
            root.blit(grey_mode_button, (366, 320))
            root.blit(grey_mode_button, (366, 490))
            game(0, piece_default, pos)

        root.blit(green_font, (84, 187.5))
        root.blit(grey_font, (99, 357.5))
        root.blit(pink_font, (102, 527.5))
        root.blit(blue_font, (416, 187.5))
        root.blit(purple_font, (382.5, 357.5))
        root.blit(red_font, (430, 527.5))
        
        click = False

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                exit()
            
            if event.type == MOUSEBUTTONDOWN:
                if event.button == 1:
                    click = True

        pygame.display.update()

    pygame.quit()

def game(default_board=0, default_piece='pawn', pos=(336, 252)):
    purple_board = pygame.image.load('/home/liana/Downloads/checkerboard_purple(1).png')
    red_board = pygame.image.load('/home/liana/Downloads/checkerboard_red(1).png')
    pink_board = pygame.image.load('/home/liana/Downloads/checkerboard_pink(1).png')
    green_board = pygame.image.load('/home/liana/Downloads/checkerboard_green(2).png')
    blue_board = pygame.image.load('/home/liana/Downloads/checkerboard_blue(1).png')
    grey_board = pygame.image.load('/home/liana/Desktop/chessboard.gif')

    green_bg = pygame.image.load('/home/liana/Downloads/80bd8f.png')
    blue_bg = pygame.image.load('/home/liana/Downloads/2ca7b9.png')
    pink_bg = pygame.image.load('/home/liana/Downloads/d394bb.png')
    red_bg = pygame.image.load('/home/liana/Downloads/e4746b.png')
    purple_bg = pygame.image.load('/home/liana/Downloads/9394cc.png')
    grey_bg = pygame.image.load('/home/liana/Downloads/d7ded3.png') 

    return_icon = pygame.image.load('/home/liana/Downloads/icons8-reply-arrow-50(3).png')
    exit_icon = pygame.image.load('/home/liana/Downloads/icons8-close-window-50.png')

    chessboard_icon_green = pygame.image.load('/home/liana/Downloads/icons8-chess-board-50.png')
    chesspiece_icon_green = pygame.image.load('/home/liana/Downloads/icons8-board-game-figure-50.png')
    mute_icon_green = pygame.image.load('/home/liana/Downloads/icons8-mute-50(3).png')
    position_icon_green = pygame.image.load('/home/liana/Downloads/icons8-place-marker-50.png')

    chessboard_icon_black = pygame.image.load('/home/liana/Downloads/icons8-chess-board-50(2).png')
    chesspiece_icon_black = pygame.image.load('/home/liana/Downloads/icons8-board-game-figure-50(1).png')
    mute_icon_black = pygame.image.load('/home/liana/Downloads/icons8-mute-50(2).png')
    position_icon_black = pygame.image.load('/home/liana/Downloads/icons8-place-marker-50(2).png')

    chessboard_icon_blue = pygame.image.load('/home/liana/Downloads/icons8-chess-board-50(3).png')
    chesspiece_icon_blue = pygame.image.load('/home/liana/Downloads/icons8-board-game-figure-50(2).png')
    mute_icon_blue = pygame.image.load('/home/liana/Downloads/icons8-mute-50(4).png')
    position_icon_blue = pygame.image.load('/home/liana/Downloads/icons8-place-marker-50(3).png')

    chessboard_icon_red = pygame.image.load('/home/liana/Downloads/icons8-chess-board-50(1).png')
    chesspiece_icon_red = pygame.image.load('/home/liana/Downloads/icons8-board-game-figure-50(3).png')
    mute_icon_red = pygame.image.load('/home/liana/Downloads/icons8-mute-50(5).png')
    position_icon_red = pygame.image.load('/home/liana/Downloads/icons8-place-marker-50(4).png')

    chessboard_icon_purple = pygame.image.load('/home/liana/Downloads/icons8-chess-board-50(5).png')
    chesspiece_icon_purple = pygame.image.load('/home/liana/Downloads/icons8-board-game-figure-50(4).png')
    mute_icon_purple = pygame.image.load('/home/liana/Downloads/icons8-mute-50(6).png')
    position_icon_purple = pygame.image.load('/home/liana/Downloads/icons8-place-marker-50(5).png')

    chessboard_icon_pink = pygame.image.load('/home/liana/Downloads/icons8-chess-board-50(6).png')
    chesspiece_icon_pink = pygame.image.load('/home/liana/Downloads/icons8-board-game-figure-50(5).png')
    mute_icon_pink = pygame.image.load('/home/liana/Downloads/icons8-mute-50(7).png')
    position_icon_pink = pygame.image.load('/home/liana/Downloads/icons8-place-marker-50(6).png')

    chessboard_hover = pygame.image.load('/home/liana/Downloads/text-1629794955368.png')
    chesspiece_hover = pygame.image.load('/home/liana/Downloads/text-1629795041496.png')
    mute_hover = pygame.image.load('/home/liana/Downloads/text-1629795088276.png')
    position_hover = pygame.image.load('/home/liana/Downloads/text-1629795118799.png')
    return_hover = pygame.image.load('/home/liana/Downloads/text-1629795781903.png')
    exit_hover = pygame.image.load('/home/liana/Downloads/text-1629795796445.png')

    player_king = pygame.image.load('/home/liana/Downloads/icons8-king-80(4).png')
    player_queen = pygame.image.load('/home/liana/Downloads/icons8-queen-80(2).png')
    player_knight = pygame.image.load('/home/liana/Downloads/icons8-knight-80(11).png')
    player_rook = pygame.image.load('/home/liana/Downloads/icons8-rook-80(2).png')
    player_pawn = pygame.image.load('/home/liana/Downloads/icons8-pawn-80(2).png')
    player_bishop = pygame.image.load('/home/liana/Downloads/icons8-bishop-80(2).png')

    possible = pygame.image.load('/home/liana/Downloads/icons8-square-84(1).png')

    pygame.init()

    root = pygame.display.set_mode((730, 730))

    pygame.display.set_caption('Chess')
    font = pygame.font.SysFont("Arial", 45)
    textsurface = font.render("CONTROLS", False, (255, 255, 255))

    run = True

    board_color = green_board
    bg_color = green_bg
    chessboard_default_icon = chessboard_icon_green
    chesspiece_default_icon = chesspiece_icon_green
    mute_default_icon = mute_icon_green
    position_default_icon = position_icon_green

    while run:
        if default_board == 0:
            board_color = green_board
            bg_color = green_bg
            chessboard_default_icon = chessboard_icon_green
            chesspiece_default_icon = chesspiece_icon_green
            mute_default_icon = mute_icon_green
            position_default_icon = position_icon_green

        elif default_board == 1:
            board_color = grey_board
            bg_color = grey_bg
            chessboard_default_icon = chessboard_icon_black
            chesspiece_default_icon = chesspiece_icon_black
            mute_default_icon = mute_icon_black
            position_default_icon = position_icon_black

        elif default_board == 2:
            board_color = pink_board
            bg_color = pink_bg
            chessboard_default_icon = chessboard_icon_pink
            chesspiece_default_icon = chesspiece_icon_pink
            mute_default_icon = mute_icon_pink
            position_default_icon = position_icon_pink

        elif default_board == 3:
            board_color = blue_board
            bg_color = blue_bg
            chessboard_default_icon = chessboard_icon_blue
            chesspiece_default_icon = chesspiece_icon_blue
            mute_default_icon = mute_icon_blue
            position_default_icon = position_icon_blue

        elif default_board == 4:
            board_color = purple_board
            bg_color = purple_bg
            chessboard_default_icon = chessboard_icon_purple
            chesspiece_default_icon = chesspiece_icon_purple
            mute_default_icon = mute_icon_purple
            position_default_icon = position_icon_purple

        elif default_board == 5:
            board_color = red_board
            bg_color = red_bg
            chessboard_default_icon = chessboard_icon_red
            chesspiece_default_icon = chesspiece_icon_red
            mute_default_icon = mute_icon_red
            position_default_icon = position_icon_red

        root.blit(bg_color, (0, 0))
        root.blit(board_color, (0, 0))
        root.blit(chessboard_default_icon, (677, 4))
        root.blit(chesspiece_default_icon, (677, 68))
        root.blit(mute_default_icon, (677, 133))
        root.blit(position_default_icon, (677, 197))
        root.blit(return_icon, (677, 261))
        root.blit(exit_icon, (677, 325))

        if default_piece == 'pawn':
            root.blit(player_pawn, pos)
        elif default_piece == 'knight':
            root.blit(player_knight, pos)
        elif default_piece == 'rook':
            root.blit(player_rook, pos)
        elif default_piece == 'queen':
            root.blit(player_queen, pos)
        elif default_piece == 'king':
            root.blit(player_king, pos)
        elif default_piece == 'bishop':
            root.blit(player_bishop, pos)

        possible_area = show_possible(default_piece, pos)

        #print(f'POSSIBLE AREA: {possible_area}')

        for i in possible_area:
        #rect_pos = pygame.Rect(tuple(i))
        #pygame.draw.rect(win, (230, 0, 115), rect_pos)
            root.blit(possible, i)
        
        mx, my = pygame.mouse.get_pos()

        chessboard_icon_collide = pygame.Rect(677, 4, 50, 50)
        exit_button_collide = pygame.Rect(677, 325, 50, 50)
        return_button_collide = pygame.Rect(677, 261, 50, 50)
        piece_icon_collide = pygame.Rect(677, 68, 50, 50)
        mute_icon_collide = pygame.Rect(677, 132, 50, 50)
        position_icon_collide = pygame.Rect(677, 196, 50, 50)

    
        if chessboard_icon_collide.collidepoint((mx, my)):
            root.blit(chessboard_hover, (573, 21))
            if click:
                board_color_select(0, default_piece, pos)

        elif piece_icon_collide.collidepoint((mx, my)):
            root.blit(chesspiece_hover, (548, 85))
            if click:
                piece_choose(default_board, default_piece, pos)

        elif mute_icon_collide.collidepoint((mx, my)):
            root.blit(mute_hover, (573, 149))

        elif position_icon_collide.collidepoint((mx, my)):
            root.blit(position_hover, (537, 213))
            if click:
                set_pos(board_color, bg_color, default_piece, default_board)

        elif return_button_collide.collidepoint((mx, my)):
            root.blit(return_hover, (511, 277))

        elif exit_button_collide.collidepoint((mx, my)):
            root.blit(exit_hover, (573, 341))
            if click:
                pygame.quit()
                exit()

        click = False
        
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                exit()
            
            if event.type == MOUSEBUTTONDOWN:
                if event.button == 1:
                    click = True

        pygame.display.update()

    pygame.quit()

game()

我非常感谢您提前提供的任何帮助。任何提示,对我应该做什么或解决方案的简要说明都会有所帮助。

标签: pythonfunctionpygame

解决方案


您需要调用board_color_selectwithdefault_board而不是 0。

board_color_select(0, default_piece, pos)

board_color_select(default_board, default_piece, pos)

推荐阅读