Выбранная пользователем кнопка сбрасывается по умолчанию после переключения в другое окно в Pygame

#python #function #pygame

Вопрос:

Я пытался создать простую игру, используя PyGame. В игре есть возможность для пользователя настроить свой цвет доски в один из шести возможных цветов, доступных в игре. Таким образом, в основном, если пользователь нажимает на значок шахматной доски, открывается новое окно, которое позволяет ему выбрать цвет, который он предпочитает для своей доски, например:

доска

При нажатии на первый значок с изображением шахматной доски открываются окна параметров:

Опции

Как вы можете видеть, доска по умолчанию установлена на зеленую (как и ожидалось), теперь изображение пользователя хочет иметь синюю доску, поэтому они нажимают на кнопку, на которой написано «СИНЯЯ». Результат выглядит так:

новая доска

Теперь, как и ожидалось, у нас есть синяя доска. Теперь предположим, что пользователю не нравится синий цвет и он решает снова выбрать другой цвет доски, поэтому он снова открывает окно параметров:

варианты

Посмотрите, что только что произошло, выбранная кнопка снова установлена на «ЗЕЛЕНУЮ» по умолчанию, хотя в прошлый раз пользователь выбрал «СИНЮЮ».

Как я могу исправить эту проблему и сделать так, чтобы она снова не была установлена по умолчанию? Вот фрагменты моего кода, соответствующие вышеуказанной функциональности:

 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()
 

Я действительно заранее признателен за любую помощь. Любые советы, краткое объяснение того, что я должен делать, или решение будут полезны.

Ответ №1:

Вам нужно вызвать board_color_select с default_board помощью вместо 0.

board_color_select(0, default_piece, pos)

 board_color_select(default_board, default_piece, pos)
 

Комментарии:

1. Когда я это делаю, я получаю такую ошибку: « Файл «/home/liana/Desktop/check.py», строка 594, в игре, если нажать: UnboundLocalError: локальная переменная`нажмите», на которую ссылаются перед назначением»»

2. @Mania Пожалуйста, обратите внимание, что я не могу отладить ваш код. Я могу просто заметить очевидную ошибку.