В этой статье мы разберём как создать игру Пинг понг на библиотеки PyGame для языка программирования Python, думаю будет очень интересно.
Также перед прочтением этой статья настоятельно рекомендую почитать мой цикл про основы PyGame:
- Основы Python библиотеки PyGame, Часть 1;
- Pygame основы часть 2, Создание фигур;
- PyGame Основы часть 3. Анимация и события;
Знания из них пригодиться в этой статье.
Создание PyGame пинг понг:
Перед тем как с\начинать создавать игру, нужно подключить нужные компоненты, вот что мы подключаем:
1 2 | import pygame import sys |
Как видите мы подключили сам PyGame и sys, последний нужен нам для того чтобы закрывать игру.
Дальше продолжаем подготовку, назначим несколько переменных которые нам пригодятся:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # Инициализация PyGame pygame.init() # Назначаем чёрный цвет BLACK = (0, 0, 0) # Назначаем зелёный цвет GREEN = (0, 200, 64) # Назначаем жёлтый цвет YELLOW = (225, 225, 0) # Позиция по Y для блока posY_block = 150 # Позиция по Y для шарика posX_circle = 80 # Позиция по X для шарика posY_circle = 150 # Направление шарика на право circle_right = True # Направление шарика вверх circle_top = True # Скорость speed = 3 # Ширина окна игры screenWidth = 800 # Высота окна игры screenHeight = 400 # Создаём окно screen = pygame.display.set_mode((screenWidth, screenHeight)) # Берём компонент часов clock = pygame.time.Clock() |
В начале мы инициализируем проект на PyGame, потом назначаем цвета которые будем использовать, после назначаем координаты объектов, сначала блока которым будем управлять, потом шарика, который надо отбивать.
Дальше, самое интересное, создаём переменные которые отвечают за направление шарика, первая это circle_right
, если значение True
, то направляться будет на право, если False
налево, и circle_top
, если True
, то направление шарика на верх, если False
то вниз.
Последние, мы закачаем переменные для скорости и параметров окна игры, создаём окно и берём компонент часы, он нам нужен будет, чтобы настроить FPS.
Теперь перейдём к основному, для этого мы сделаем цикл, в котором будет происходить вся логика:
1 2 | while True: ... |
То есть цикл у нас всегда True
, так как он нам нужен для рендеринга, теперь пропишем всё логику:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # Назначаем FPS clock.tick(60) # Красим экран в чёрный цвет screen.fill(BLACK) # Отслеживаем зажатие клавиш pressed_keys = pygame.key.get_pressed() # Если зажата стрелка верх if pressed_keys[pygame.K_UP]: # Проверяем позицию блока по Y больше нуля if posY_block > 0: # То # Вычитаем из позиции скорость posY_block -= speed # Если нажата стрелка вниз то if pressed_keys[pygame.K_DOWN]: # Проверяем позиция по Y плюс 100 больше высоты окна if posY_block + 100 < screenHeight: # То # Увеличиваем позицию Y на скорость posY_block += speed |
Тут мы назначаем FPS, с помощью clock.tick(60)
, как и понятно, он будет 60, потом закрашиваем экран в чёрный цвет, это нужно будет для будущего рендеринга, дальше начинаем отслеживать зажатие клавиши, это нужно для управление блоком, зависимости какая кнопка нажата, мы меняем позицию, ещё можете заметить, что там есть условие, оно нужно для того, чтобы блок не вышел за границы экрана.
Теперь идут условия для позиции шарика, вот они:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # Проверяем что наш шарик достиг левого края окна if posX_circle - 50 <= 0: # Меняем направление на право circle_right = True # Проверяем что шарик достиг верхнего края if posY_circle - 50 <= 0: # Меняем направление вниз circle_top = False # Если шарик достиг нижнего края elif posY_circle + 50 >= screenHeight: # Меняем направление вверх circle_top = True # Проверяем направление на право if circle_right: # Увеличиваем позицию X на скорость posX_circle += speed else: # Иначе # Уменьшаем позицию X на скорость posX_circle -= speed # Проверяем направление на верх if circle_top: # Уменьшаем позицию Y на скорость posY_circle -= speed else: # Иначе # Увеличиваем позицию Y на скорость posY_circle += speed |
В начале мы проверяем дошёл ли шарик до левого края, если да, то меняем направление, потом проверяем дошёл ли шарик до нижнего или верхнего края, если одно из этого верно, то меняем направление.
Дальше зависимо от направление уменьшая или увеличиваем позицию по X или Y, ещё вы можете заметить, что для проверки мы в некоторых случаях уменьшаем или увеличиваем позицию на 50, это связано с тем, что диаметр шара будет 100, соответственно, чтобы он не проваливался, нужно проверять при столкновение его радиус.
Осталась последняя проверка, проверка что шарик оттолкнулся от блока или провалился в за правый край, вот что мы пишем:
1 2 3 4 5 6 7 8 9 | # Проверка того, что шарик столкнулся с блоком if posY_block <= posY_circle <= posY_block + 100 and screenWidth - 20 <= posX_circle + 50 <= screenWidth: # Меняем направление circle_right = False # Если шарик прошёл за правый край, то elif posX_circle + 50 > screenWidth: # Выходим из программу pygame.quit() sys.exit() |
В целом тут всё достаточно просто, сначала проверяем что шарик столкнулся с блоком, для этого проверяем столкновение границ шарика и блока.
Также идёт проверка что шарик вышел за приделы окна, в этом случае программа закрывается.
Осталось последние, это проверка для закрытия окна, рендеринг и обновление окна.
1 2 3 4 5 6 7 8 9 10 11 | for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # Рисуем блок pygame.draw.rect(screen, GREEN, (780, posY_block, 20, 100)) # Рисуем шарик pygame.draw.circle(screen, YELLOW, (posX_circle, posY_circle), 50) # Обновляем экран pygame.display.update() |
В целом на этом все, теперь можете играть, вот что у нас получилось:
Вывод:
В этой статье вы прочитали как создать пинг понг на Pyhon PyGame, думаю было очень интересно, единственное надо ещё немного поработать над ним, например чтобы не выходило из программы а просто появлялось мину со счётом, но это думаю вы и сам сделаете.