#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 Пожалуйста, обратите внимание, что я не могу отладить ваш код. Я могу просто заметить очевидную ошибку.