Каковы причины, по которым нажатия кнопок в Pygame могут не обрабатываться?

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

```python
import pygame as pg 

from func import * 
from const import * 

pg.init() 
pg.font.init() 

screen = pg.display.set_mode((WIDTH, HEIGHT)) 
font = pg.font.SysFont(pg.font.get_default_font(), 70) 
text_menu = text = font.render('играть' , True , BLACK) 
clock = pg.time.Clock() 

generation_happen = 1 
time = None 

game_over = True 
running = True 

board = [ 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0], 
    [0, 0, 0, 0] 
] 

generation_2_or_4(board) 
generation_2_or_4(board) 

while running: 
    clock.tick(60) 
    mouse = pg.mouse.get_pos() 

    for event in pg.event.get(): 
        if event.type == pg.QUIT: 
            running = False 
        if game_over: 
            if event.type == pg.MOUSEBUTTONDOWN: 
                if WIDTH / 3 <= mouse[0] <= WIDTH / 3 + WIDTH_BUTT0N and HEIGHT / 2.5 <= mouse[1] <= HEIGHT / 2.5 + HEIGHT_BUTTON: 
                    game_over = False 
        if not game_over: 
            if time is not None: 
                time += 1 

    for event in pg.event.get(): 
        if event.type == pg.KEYDOWN and generation_happen == 1: 
            if event.key == pg.K_LEFT: 
                board = move_left(board) 
            if event.key == pg.K_UP: 
                board = move_up(board) 
            if event.key == pg.K_DOWN: 
                board = move_down(board) 
            if event.key == pg.K_RIGHT: 
                board = move_right(board) 
            time = 0 
            generation_happen = 0 

    # if is_winning(board): 
    #     win = True 
    #     screen.fill((51, 25, 0)) 
    if is_terminal(board): 
        game_o
```
  • 26 декабря 2024 г. 18:23
Ответы на вопрос 2
В вашем коде есть несколько моментов, которые могут привести к тому, что нажатия кнопок не обрабатываются. Давайте рассмотрим основные из них:

1. **Дублирование цикла обработки событий**: В вашем коде дважды вызывается `pg.event.get()`. Это приводит к тому, что вы обрабатываете события в каждом цикле отдельно, и если события между ними перекрываются (например, из-за большого количества событий), то некоторые нажатия могут не быть обработаны. Вместо этого вам следует обрабатывать все события в одном цикле. Вот как это можно сделать:

    ```python
    for event in pg.event.get(): 
        if event.type == pg.QUIT: 
            running = False 
        if game_over: 
            if event.type == pg.MOUSEBUTTONDOWN: 
                if WIDTH / 3 <= mouse[0] <= WIDTH / 3 + WIDTH_BUTT0N and HEIGHT / 2.5 <= mouse[1] <= HEIGHT / 2.5 + HEIGHT_BUTTON: 
                    game_over = False
        else:  # Если игра не завершена, обрабатываем нажатия клавиш
            if event.type == pg.KEYDOWN and generation_happen == 1: 
                if event.key == pg.K_LEFT: 
                    board = move_left(board) 
                if event.key == pg.K_UP: 
                    board = move_up(board) 
                if event.key == pg.K_DOWN: 
                    board = move_down(board) 
                if event.key == pg.K_RIGHT: 
                    board = move_right(board) 
                time = 0 
                generation_happen = 0 
    ```

2. **Обработка состояний игры**: Обратите внимание, что проверки на события клавиатуры происходят только, когда `game_over` равно `False`. Убедитесь, что вы правильно переключаете это состояние и что `game_over` действительно меняется, как ожидалось.

3. **Инициализация переменных**: Убедитесь также, что все функции (например, `move_left`, `move_up` и т. д.) правильно инициализированы и возвращают корректные значения для `board`. Если они возвращают ошибочные состояния, это может привести к неправильной обработке game loop.

4. **Проверка на инициализацию**: Все функции, упомянутые в коде (`move_left`, `move_up` и т. д.), должны быть определены и работать правильно, иначе ваше приложение может испытывать ошибки, и вам не будет видно соответствующих событий клавиатуры.

Внесите предложенные изменения и проверьте, будет ли ваша игра обрабатывать нажатия клавиш.
splliii , у вас два цикла обработки событий: for event in pg.event.get(): , из-за этого не обрабатываются корректно нажатия на кнопки. 

Перепишите логику, используя один цикл.
Похожие вопросы