Как создать пользовательский вход в Pygame? - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь создать пользовательский интерфейс для решателя судоку, созданного с помощью python. Пока что я могу отображать сетку 9x9 и хочу, чтобы пользователь мог щелкнуть блок, ввести число и сделать это для всех начальных чисел в сетке. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 16 марта 2020

Вашему коду необходимо событие l oop, где он ожидает щелчков мышью. Когда получен щелчок мыши, код должен определить, в каком из 81 под-прямоугольника был нажат.

С размерами окна и размером сетки, сохраненными в переменных:

# Window stuff
WINDOW_WIDTH  = 600
WINDOW_HEIGHT = 600
GRID_SIZE     = 9
GRID_WIDTH_X  = WINDOW_WIDTH  // GRID_SIZE
GRID_HEIGHT_Y = WINDOW_HEIGHT // GRID_SIZE

Когда событие щелчка мыши получено, простое деление координаты на соответствующий размер сетки даст индекс ячейки, в котором она была нажата. X для X-ширины и Y для Y-высоты. Очевидно, что это дает смещение на основе 0, нумерация ячеек от [0,0] до [8,8].

    elif ( event.type == pygame.MOUSEBUTTONUP ):
        # Where was the click on the screen?
        mouse_x, mouse_y = pygame.mouse.get_pos()
        cell_x = mouse_x // GRID_WIDTH_X
        cell_y = mouse_y // GRID_HEIGHT_Y
        print( "Click in cell [%d,%d]" % ( cell_x, cell_y ) )

Это местоположение затем можно редактировать, обновлять и т. Д. c.

Полный источник:

import pygame

# Window stuff
WINDOW_WIDTH  = 600
WINDOW_HEIGHT = 600
GRID_SIZE     = 9
GRID_WIDTH_X  = WINDOW_WIDTH  // GRID_SIZE
GRID_HEIGHT_Y = WINDOW_HEIGHT // GRID_SIZE

BACKGROUND_COLOUR = ( 200, 200, 200 )
GRID_COLOUR       = ( 200,  10,  10 )

pygame.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ) )
pygame.display.set_caption( "Suduko Solver Question" )

clock   = pygame.time.Clock()
exiting = False
# Main Loop
while not exiting:

    # Handle User Input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            exiting = True
        elif ( event.type == pygame.MOUSEBUTTONUP ):
            # Where was the click on the screen?
            mouse_x, mouse_y = pygame.mouse.get_pos()
            cell_x = mouse_x // GRID_WIDTH_X
            cell_y = mouse_y // GRID_HEIGHT_Y
            print( "Click in cell [%d,%d]" % ( cell_x, cell_y ) )


    # Draw the screen
    window.fill( BACKGROUND_COLOUR )
    for i in range( GRID_SIZE ):
        x_coord = i * GRID_WIDTH_X
        y_coord = i * GRID_HEIGHT_Y
        pygame.draw.line( window, GRID_COLOUR, ( x_coord, 0 ), ( x_coord, WINDOW_WIDTH-1 ) )
        pygame.draw.line( window, GRID_COLOUR, ( 0, y_coord ), ( WINDOW_WIDTH-1, y_coord ) )

    pygame.display.flip()
    clock.tick(60)  # limit FPS

pygame.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...