Электронная библиотека » Александра С » » онлайн чтение - страница 1


  • Текст добавлен: 25 января 2023, 14:23


Автор книги: Александра С


Жанр: Развлечения, Дом и Семья


сообщить о неприемлемом содержимом

Текущая страница: 1 (всего у книги 1 страниц)

Шрифт:
- 100% +

Создание игры «Гонки» на Python
Александра С

© Александра С, 2023


ISBN 978-5-0059-5282-0

Создано в интеллектуальной издательской системе Ridero

Идея игры «Гонки»

В гонках участвуют две манишки. Одной машинкой управляет пользователь (очень часто нажимает клавишу вправо), вторая машина едет сама. Кто первый приезжает на финиш (нарисована линия финиша, справа, машинки едут слева направо), тот и побеждает.

Установка PyGame на Windows 10

Установите Python 3.10 и обязательно поставьте флажки:



Откройте на компьютере командную строку:



Наберите команду pip install pygame и нажмите Enter



Если появляется ошибка pip не является внутренней командой, то необходимо правильно указать путь командой cd scripts (перейдёт в папку scripts)

Сохранение, создание окна и фона

– В поиске на компьютере ищем Python. Выбираем IDLE (Python)



– В IDLE (Python), выбираю File – New File



В новом окне выбираю File – Save



В окне сохранения нахожу свою папку на рабочем столе




Пишу имя файла и нажимаю сохранить.



– Пишем все команды в только что сохраненном файле



В первую очередь импортируем модуль pygame в наш файл с исходным кодом:

import pygame


Затем вызываем функцию init () для подготовки модулей pygame к работе:

pygame.init ()


После этого создаем графическое окно, передав в качестве аргумента в функцию set_mode () его разрешение в виде пары целых чисел. В свою очередь функция вернет нам объект типа Surface, используемый для представления изображений:

screen = pygame.display.set_mode ((1200, 800))

создание надписи в заголовке игры

pygame.display.set_caption («Привет»)


В результате получим:



– Добавляем фоновую картинку

Скачаем из интернета или нарисуем сами в Paint, например. Обязательно сохраним картинку в ту же папку, что и файл-программу.

Напишем команды:

sun_surf = pygame.image.load('dog.png’) #путь до картинки

sun_rect = sun_surf.get_rect () # получить доступ к картинке

screen. blit (sun_surf, sun_rect) # отрисовываем картинку


– Внимание! Самая важная команда! Данная команда постоянно отрисовывает всё что написали в коде, эта команда «видит» только то, что написано выше, над ней. Таким образом, эта команда ВСЕГДА должна быть самой последней строчкой:

pygame. display. update ()

В результате получим:



После изменения размера картинки на 1200*800, получим:



Весь код программы на данный момент:


Самостоятельная работа над проектом. Фон

– Придумайте идею своей игры с концепцией управления главным героем клавишами клавиатуры (находится в определенной зоне в течение определенного времени, гонки без правил и т.д.).

– Установите свой размер окна и название окна.

– Найдите и добавьте фон.

Добавляем машину

– Скачиваем картинку машинки из интернета или рисуем сами, при этом расширение картинки должно быть png (чтобы не было фона за машинкой). Если вы скачали и оказалось что (машинка очень большая и на белом фоне):



То сначала изменяем размер машинки (в Paint или онлайн) и удаляем фон (быстрее онлайн, набрав в поиске «убрать фон картинки»)

– Добавляем две машинки также как фон, только вместо имени картинки с фоном, пишем имя картинки с машинкой. Результат:



Но теперь обе машинки находятся в лево верхнем углу, друг на друге.

– Зададим координаты появления первой машинки. Код программы:

sun_surf = pygame.image.load('auto_1.png’) #путь до картинки

myRect = (20,620,100,100) # координаты появления машинки

screen. blit (sun_surf, myRect)

Результат:



Аналогично настроим координаты появления для второй машинки, сделайте самостоятельно. Результат:


Программируем кнопку «закрыть»

До сих пор у нас не работала кнопка «закрыть»



По задумке мы хотим, чтобы данная кнопка всегда понимала, что когда на неё нажимают, то надо закрывать программу. Всегда (while True)! То есть программа должна быть постоянно в состоянии прослушивания событий, как ухо



Немного теории о том, какие события могут происходить:



Вот команда for event in pygame.event.get (), которая постоянно прослушивает события, происходящие с программой.

Если нажали на кнопку закрыть (if event. type == pygame. QUIT), то нужно закрыть программу (pygame. quit ()).

Код полностью по кнопке «закрыть»:

while True:

for event in pygame.event.get ():

if event. type == pygame. QUIT:

pygame. quit ()

pygame. display. update ()

Внимательнее к пробелам! И команда pygame. display. update () теперь внутри цикла while True. Теперь при нажатии на кнопку «закрыть» наша игра прекращается.

Чтобы не было ошибки, можно добавить (подумайте самостоятельно куда):

import sys

sys. exit ()

Управление машинкой с помощью клавиатуры

Наше «ухо» постоянно слушает какие события в программе происходят. В том числе и какие клавиши нажаты. Добавим туда же код:

# цикл для обработки событий

for event in pygame.event.get ():

# если произошло событие – нажатие клавиши

if event. type == pygame.KEYDOWN:

# если была нажата стрелка влево

if event.key == pygame. K_LEFT:

speedx -= 8


Другое оформление того же кода:

# цикл для обработки событий

for event in pygame.event.get ():

# если произошло событие – нажатие клавиши

if event. type == pygame.KEYDOWN:

# запоминаем в переменную keystate какая клавиша нажата

keystate = pygame.key.get_pressed ()

# если была нажата стрелка влево

if keystate [pygame. K_LEFT]:
speedx -= 8

После цикла for пишем код:

myRect_1 = (speedx, 620, 100,100)

screen. blit (auto_1, myRect_1)

Это означает, что когда нажмём клавишу влево, то машинка поедет влево, так как координата в переменной myRect_1 изменится на speedx.

Самостоятельно сделайте для клавиши вправо. В интернете можно найти клавиатурные константы (то есть клавишу вправо, вверх и т.д.).

Рабочий код:



После запуска при нажатии клавиши вправо, получаем:



Такое дублирование картинки машинки происходит потому, что фон мы тоже должны отрисовывать постоянно, то есть в цикле while True. Поэтому переносим туда строчку, где происходит отрисовка фона.

В результате нажатия на клавишу вправо:



Но теперь пропала красная машинка, добавьте её самостоятельно.

Если вы хотите, чтобы машинка двигалась пока нажата клавиша, то можно посмотреть код на сайте webtort.ru/управление-стрелками-в-pygame/. Идея состоит в том, чтобы получать событие когда клавиша не нажата.

Добавляем фоновую музыку

Наконец, необходимо добавить фоновую музыку, которая сделает игру более эмоциональной. Здесь необходим другой подход, потому что музыка играет непрерывно.

Есть два способа. Способ первый:



Другой способ добавления музыки:

Во-первых, нужно указать, в какой папке они находятся:

import pygame

import random

from os import path

snd_dir = path.join (path. dirname (__file__), ’snd’)

И папка snd должна реально существовать, в неё сохраняем музыку.

Сначала загружаем файл:

expl_sounds = []

for snd in [’expl3.wav’, ’expl6.wav’]:

expl_sounds.append(pygame.mixer.Sound(path.join (snd_dir, snd)))

pygame.mixer.music.load(path.join (snd_dir, ' cosmos_mix.mp3»))

pygame.mixer.music.set_volume (0.4)

Музыка довольно громкая, поэтому, чтобы она не перекрывала звуки, необходимо опустить ее максимальную громкость до 40%.

Чтобы музыка играла, нужно просто выбрать в каком месте кода она будет стартовать. В случае гонок это будет позиция перед началом игрового цикла.

# score = 0

pygame.mixer.music.play (loops=-1)

Параметр loops определяет, как часто трек будет повторяться. Если установить значение на -1, то он будет воспроизводиться бесконечно.

Проверяем логику игры, код должен быть размещен как на картинке ниже или похоже:


Программируем движение второй машинки

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

Необходимо настроить скорость изменения этой переменной. Для первой машинки было speedx += 8 и при этом мы нажимаем клавишу «вправо», а теперь, для второй машинки, мы должны указать немного меньшую цифры, чтобы были шансы догнать первую машинку.



Сильно красная машинка вырывается вперед



Подбор скорости для красной машинки

Программируем финиш

– Добавим картинку финиша



– Запрограммируем так, что если машинка, красная или синяя, касается картинки финиша, то игра заканчивается и выводит информацию о том, кто победил.

Немного теории про столкновения:

Одна из многих важных тем в разработке игр это обнаружение столкновений. Рассмотрим алгоритмы обработки столкновений на примере двух спрайтов. В основе алгоритмов обработки столкновений лежит класс Rect. Экземпляры этого класса представляют собой прямоугольные области. Они не имеют графического представления в окне игры, но имеют методы для обнаружения столкновений: если два или более прямоугольных объектов пересекаются друг с другом или находяться в контакте, то это и есть столкновение. Эти методы используются в методах определения столкновения спрайтов.

Вот некоторые основные методы класса Rect:

collidepoint (x, y) – проверка попадания точки в прямоугольник;

colliderect (Rect) – проверка пересечения двух прямоугольников;

collidelist (list) – проверка пересечения хотя бы с одним прямоугольником из списка прямоугольников list;

collidelistall (list) – проверка пересечения со всеми прямоугольниками из списка прямоугольников list.

Полный их список и описание можно посмотреть на странице официальной документации: https://www.pygame.org/docs/ref/rect.html

Обнаружение столкновений между двумя спрайтами

Обнаружение столкновений между двумя спрайтами sprite1, sprite2 выполняется методом collide_rect (sprite1, sprite2), в котором используется функцию проверки пересечения двух прямоугольников colliderect (Rect)

hit = pygame.sprite.collide_rect (sprite1, sprite2)

метод возвращает логическое значение hit: True – столкновение или соприкосновение произошло, False в противном случае.

Настраиваем столкновения

– Подготовим спрайт для столкновения, для этого добавим в группу Спрайтов и укажем атрибуты:



– Самостоятельно сделайте для второй машинки и финиша.

– Добавим все наши спрайты в группу спрайтов:

all_sprites_group = pygame.sprite.Group ([sprite1, sprite2])

– Отрисуем наши машинки в соответствии с новыми критериями

screen.blit(auto_1.image,auto_1.rect)

– Самостоятельно отрисуйте вторую машинку и финиш

Проработаем управление машинкой. Было раньше



Новая запись по управлению машинкой:



Результат: после исправления ошибок, главная машинка не управляется, а сразу угоняет за пределы экрана. Надо исправить.

Добавление speedx = 0 позволяет исправить ситуацию.

– Если произошло столкновение (сохраняем в переменную hit тех кто столкнулся, это первая главная машинка и картинки финишной линии), то меняем фон на победный, перемещаем машинки на свои места (допишите самостоятельно)



– Самостоятельно допишите столкновение для второй машинки и финиша и соответственно то, что произойдёт если они столкнутся (победный фон появится и машинки распределятся по победным местам)

Доработка игры

– Исправляем вторую машинку (она не едет дальше и останавливается в начале игры). Для этого необходимо, чтобы координаты её местоположения были не фиксированы, а менялись. Код:



– Исправляем дублирование машинок, то есть уже появилась картинка с победителями, а вторая машинка продолжает ехать (машинка №2 находится в двух экземплярах на экране, а должна быть только одна, на финише)



Для этого даём понять игре, что если машинки доехали до финиша, то игру надо остановить:



Также добавляем команду, если произошло столкновение:



Чтобы отрисовывались спрайты только те что нужно, добавим условие (Если игра запущена, то нарисовать спрайт главной машинки, спрайт второй машинки и линию финиша):



После тестирования выяснилось, что кнопка «закрыть» после завершения игры не работает, можно добавить после основного цикла игры еще один цикл с закрытием кнопки.

Добавляем текст

Класс pygame.font предназначен для работы с текстом. Создаётся поверхность, на которой будет написан текст, при этом можно указать что это за текст, шрифт текста, сглаживание текста и цвет текста, а также цвет фона.

Можно использовать те шрифты, которые есть в системе:



Или можно указать только размер шрифта, а шрифт он выберет сам:



Отрисовываем текст:



Указываем координаты где отрисовать:



Результат:



Если победила синяя машинка, то выведем соответствующую надпись (помните, что мы видим только то, что нарисовалось последним, то есть сначала рисуем фон, потом машинки и текст. Если в программе указать сначала машинки и текст, а потом фон, то в результате мы увидим только фон)



Соответственно для второй машинки:



Цвет надписи меняется по цветовой модели, можно в Пайнт найти эти три цифры и выбрать понравившийся цвет или в интернете. Цвет меняется в этой строке:



Первая цифра – отвечает за красный оттенок

Вторая цифра – за зеленый оттенок

Третья – за синий



Усовершенствовать игру

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


Страницы книги >> 1
  • 0 Оценок: 0

Правообладателям!

Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.


Популярные книги за неделю


Рекомендации