Как сделать шутер на python

Добавил пользователь Владимир З.
Обновлено: 05.10.2024

Сегодня мы научимся кодировать несколько простых игр, используя распространенные модули Python.

Сегодня мы научимся кодировать несколько простых игр, используя распространенные модули Python.

Почему мы используем Python?

Python – это известный язык программирования. Python код очень легко понять и написать. Считается, что он удобен для разработчиков. Любой новичок может научиться кодировать на Python в течение короткого промежутка времени.

Вот некоторые из самых интересных особенностей этого языка:

  • Python – это язык с открытым исходным кодом и распространяется свободно
  • Портативный и динамический
  • Python супер легко понять и т. д.

Создание простых игр в Python

Давайте теперь реализуем несколько простых игр в Python, которые вы можете построить как новичок, чтобы начать свой путь обучения!

1. Игра викторина в Python

Это очень простая текстовая игра на Python. Это маленькая викторина, которую вы можете сделать для себя или своих друзей. Нам не нужно импортировать какие-либо модули для этой игры, что облегчает её! Попробуйте сами.

2. Игра в Pong на Python

Большинство из нас слышали о знаменитой игре в Pong. Многие из нас любят играть. Сегодня мы научимся кодировать эту классическую игру с помощью языка программирования python!

Прежде чем начать кодировать, необходимо установить модуль turtle. Этот модуль представляет собой библиотеку Python, которая позволяет пользователям создавать картины и фигуры, предоставляя им виртуальный холст.

Если у вас его еще нет, вы можете установить библиотеку, используя pip.

Вы можете узнать больше о библиотеке turtle из их официальной документации

Попробуйте код самостоятельно!

3. Игра Hungry Snake на Python

Это была наша любимая игра, когда мы были детьми. На самом деле мы можем реализовать эту игру в python, импортируя всего два модуля! Как это круто!

Во-первых, нам нужно установить библиотеку turtle. Если у вас она еще не установлена, откройте свой cmd и введите следующую команду.

Теперь мы установим случайное модуль. Случайный модуль используется для генерации случайных чисел. В вашем типе CMD в следующей команде.

Теперь мы установим модуль random2. Модуль random2 используется для генерации случайных чисел. Выполните в cmd следующую команду.

Попробуйте сами код ниже и наслаждайтесь игрой!

Заключение

Вот и все! Это некоторые из простых игр в Python, которые вы можете создать как новичок и повеселиться! Мы любили создавать эти игры, и мы надеемся, что у вас тоже получиться!

Создание игры Arkanoid на PyGame Zero

В данной статье мы расскажем, как при помощи Python и PyGame Zero можно быстро и легко написать клон игры Арканоид (Breakout).

Содержание статьи

Что ж, приступим!

Весь код, который будет использоваться в данном руководстве, доступен по ссылке.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Изображения были взяты с Kenney. На данном сайте есть множество клевых бесплатных ассетов для создания игры. Обязательно зацените его!

Установка Pygame Zero

Первым делом нужно создать пустое окно:

Здесь мы импортируем Pygame Zero. Переменная TITLE — это заголовок отображаемого окна, а переменные WIDTH и HEIGHT определяют ширину и высоту данного окна соответственно.

Метод pgzrun.go() запускает программу.

Вы должны увидеть пустое окно:

Игра Арканоид на Python

Давайте попробуем отобразить несколько игровых блоков.

Добавим следующий код под высотой и шириной:

Actor отвечает за то, как Pygame Zero будет показывать картинки. Изображения всегда хранятся в папке images , которая находится в том же месте, где расположен скрипт игры.

Мы также указываем начальные позиции x и y для тех изображений, которые будут загружены:

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

Итак, у нас есть изображения, загруженные в память, однако они пока не отображаются. Давайте это исправим. В Pgzero есть встроенная функция draw() , которая вызывается автоматически при запуске игры. Есть также функция update , которая вызывается 60 раз в секунду и обновляет экран по мере вашего движения.

По сути, у нашей игры будет 60 FPS.

Функции update() и draw() в Pgzero

Функции update и draw похожи — разница лишь в том, что update вызывается 60 раз в секунду, в то время как draw вызывается только в тех случаях, когда что-то нужно изменить, нарисовать…

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

Создание двигающейся панели и мячика

Для начала воспользуемся функцией draw() , а update() пока оставим пустой:

Игра Арканоид на Python

Давайте сделаем еще кое-что. Вам не кажется, что сейчас фон очень скучный? Давайте сделаем его немного повеселее.

Обновим функцию draw() :

В качестве фона мы используем файл background.jpg , который находится в папке images . Функция blit() рисует наше изображение на экране. Кортеж (0,0) является стартовой позицией, где x=0 и y=0 . Систему координат в Pygame Zero мы обсудим немного позже.

Игра Арканоид на Python

Создание стенки с кирпичиками для игры Арканоид

Сейчас мы займемся созданием стенки с кирпичиками, которых будет сбивать мяч.

У нас в папке есть несколько подходящих изображений, именно их мы используем. Для начала попробуем вставить только один кирпичик:

Игра Арканоид на Python

Очевидно, что строить стенку по одному кирпичику за раз будет очень долго и муторно. Давайте используем цикл for, чтобы упростить задачу.

Здесь мы создаем начальные переменные для координат x и y — bar_x инициализируется на 120 , а bar_y — на 100 .

Мы выполняем цикл 8 раз. Почему 8? Потому что именно столько кирпичиков мы можем удобно разместить на экране.

Для каждого цикла мы создаем объект Actor , инициализируем его координаты x и y и рисуем все на экране. Затем делаем следующее:

Игра Арканоид на Python

Неплохо. Теперь нужно разложить все остальные кирпичи. Я планирую построить 3 ряда, причем цвет каждого будет отличаться.

Первым делом я хочу превратить приведенный выше код в удобную функцию:

Здесь я поместил использованный раннее код в функцию place_blue_bars() .

Я мог бы создать больше функций наподобие create_red_bars() и так далее, но, думаю, будет лучше использовать более умный подход.

Итак, у нас будет общая функция place_bars() :

В верхней части мы также создадим еще одну глобальную переменную bars_list = [] . Мы будем использовать ее для проверки того, какие кирпичики отображать, а какие удалять после попадания в них мячика.

Передадим начальные координаты x и y первого кирпичика, а также изображение, которое мы будем использовать. Конечная функция выглядит следующим образом:

Единственное изменение заключается в том, что мы инициализируем x , y и изображение из полученных входных данных.

coloured_box_list = [ "element_blue_rectangle_glossy.jpg" , "element_green_rectangle_glossy.jpg" , "element_red_rectangle_glossy.jpg" ]

У нас есть список с 3 изображениями. Мы инициализируем значения x и y . Затем делаем цикл for по списку:

Нам нужно сделать y += 50 в каждом цикле, иначе кирпичики будут располагаться друг над другом.

Нам нужно сделать еще кое-что. Создадим кирпичики, но отображать их не будем. Обновим функцию draw() :

Игра Арканоид на Python

Теперь у нас есть красивый макет. Наконец-то можно заняться логикой!

Добавление физики для двигающейся панели

Давайте начнем с добавления физики для нижней панели. Нам нужно, чтобы игрок мог двигать данный элемент туда-сюда, стараясь отбить мячик. В Pygame Zero это сделать очень просто — вы можете просто проверить события клавиатуры напрямую. Давайте обновим функцию update() :

if keyboard.left проверяет, нажата ли левая стрелка на клавиатуре, и если да, то изменяет x-позицию двигающейся панели на -5 (то есть перемещает ее влево на 5 пикселей). И то же самое происходит для правой стрелки на клавиатуре.

Почему я выбрал 5 пикселей? Чтобы найти баланс между слишком быстрым/медленным перемещением. Попробуйте изменить значения на 1 и 10 и посмотрите, что получится.

Нажмите на левую и правую стрелки — теперь вы можете перемещать нижнюю панель.

Добавление физики для движения мячика в игре

Помните, что встроенный метод update() вызывается 60 раз в секунду. Поэтому любая игровая логика, например, перемещение мяча, проверка столкновений (коллизии) и тому подобное, будет происходить здесь.

Мы создадим новую функцию update_ball() , которую будем вызывать из функции update() .

Таким образом мы меняем позиции x и y для мяча.

Система координат в Pygame Zero

Система координат в PyGame Zero

Координаты верхней левой части экрана — 0, 0 то есть x=0, y=0 .

Если вы двигаетесь вправо, то значение x возрастает.

Если вниз, то возрастает значение y .

При движении влево, уменьшается x . При движении вправо, увеличивает x .

Для передвижения вниз, увеличиваем y . Вверх — уменьшаем y .

Учитывая все это:

ball.x -= 1 двигает мяч влево (так как -1 = влево, +1 = вправо)

ball.y -= 1 двигает мяч вверх (так как -1 = вверх, +1 = вниз)

Итак, в начале игры мяч будет двигаться вверх и влево. Это просто случайное решение — вы можете с таким же успехом выбрать движение вниз и вправо. Но пока что я буду придерживаться этого решения, чтобы объяснить вам возникшую проблему:

Мяч за пределами экрана! Вот незадача!

Нам нужно добавить проверки, чтобы при ударе о стены мяч отскакивал назад. Это физическая часть.

Давайте добавим проверку.

Сначала добавим глобальную переменную для скорости x и y . Добавьте эти глобальные переменные в верхнюю часть файла:

В этой статье мы с вами рассмотрим создание простейшей игры. Суть игры состоит в том, чтобы удержать битой мяч в пределах экрана. Конечно, по современным меркам назвать это игрой сложно — такого рода игры были в ходу лет 40 назад. Ну а сейчас могут рассматриваться только как тренировочное задание. Внешний вид игры представлен на рисунке ниже.

Game

Рис 1. Внешний вид игры

Ну а теперь вкратце рассмотрим код игры

Здесь мы импортируем библиотеку PyGame. Именно с её помощью мы создаем игровой экран, выводим изображения на него и даже текст. Строка pygame.init() производит инициализацию библиотеки.

В строке 12 создаем экран размером 800 на 600 пикселей. Сохранив его в переменной screen, в дальнейшем мы сможем изменять некоторые его параметры, такие как иконка и заголовок окна:

В строке 16 мы загружаем изображение иконки нашего окна в PyGame при помощи pygame.image.load(). При помощи этой функции вообще грузится большинство изображений в PyGame. Размер иконки, в моем случае, 24х24 пикселя. Можете нарисовать свою, если хотите или скачать готовую из интернета — благо сейчас существует просто невероятное количество бесплатных значков и рисунков. При помощи функции pygame.display.set_icon() мы помещаем наше изображение в шапку окна.

В строке 20 мы загружаем изображение биты, размером 64х16 пикселей. В переменных posX и posY указываем текущие координаты мяча. В переменной changeX хранится величина, на которую будет изменятся положение биты во время игры. Так как бита у нас двигается только горизонтально, то и значение смещения только одно.

Здесь мы загружаем изображение мяча. Его стартовые координаты указываем в переменных ballX и ballY. Поскольку мяч у нас движется в двух осях координат, следует указать две переменные смещения, вертикального и горизонтального: changeBallX и changeBallY. Переменная play используется для контроля запуска игры. Чуть нижу будет описано, зачем это нужно.

Первая функция, которую мы создаем, отвечает за вывод на экран биты с координатами x и y. Для этого мы используем функцию screen.blit(), где screen — имя нашего экрана. Так как координата y у нас меняться не будет (бита движется только вдоль оси x), то вместо нее можно сразу установить фиксированное значение. Тут уж как хотите. Пр помощи этой функции в окно PyGame выводятся все наши изображения:

При помощи переменной run запускаем игровой цикл. Пока значение этой переменной равно True — игра будет продолжаться.

Здесь мы выполняем заливку нашего экрана цветом. Это нужно для того, чтобы стереть изображения прошлого кадра. Если вы не понимаете, о чем речь, просто закоментируйте строку 58 и посмотрите, что получится 😉

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

Здесь мы устанавливаем рамки для мяча, чтобы он не улетел за границу экрана. В строке 90 мы проверяем, запущена ли игра. И если да, то при достижении мячом правой (строка 91) или левой (строка 93) границы экрана, движение мяча на противоположное. Если игра еще не началась, то при достижении правой или левой границ экрана мы останавливаем движение мяча. Это нужно для того, чтобы вы не могли запихнуть мяч за границу экрана до того, как начнется игра.

Если мяч достиг верхней границы экрана (строка 99), то вертикальное смещение изменяем на положительное значение — мяч теперь будет двигаться вниз.

Теперь проверяем, столкнулся ли мяч с битой. Прежде всего, нужно проверить, идет ли игра (строка 103). Если да, то проверяем, достиг ли мяч нижней границы экрана (строка 104). Если мяч достиг нижней части экрана, проверяем, находится ли под ним бита (строка 105) и если мяч находится над битой, то изменяем его смещение по вертикальной оси на противоположное и добавляем одно очко к счету. Теперь обратим внимание на строку if posX-22 Нравится Загрузка.


Методы работы с Rect

pygame.Rect.copy Возвращает новый прямоугольник, имеющий ту же позицию и размер, что и оригинал.
pygame.Rect.move Возвращает новый прямоугольник, перемещаемый данным смещением. Аргументы x и y могут быть любым целочисленным значением, положительным или отрицательным.
pygame.Rect.move_ip То же, что и метод Rect.move (), но работает на месте.
pygame.Rect.inflate увеличивать или уменьшать размер прямоугольника, на месте
pygame.Rect.inflate_ip увеличивать или уменьшать размер прямоугольника, на месте
pygame.Rect.clamp перемещает прямоугольник внутри другого
pygame.Rect.clamp_ip перемещает прямоугольник внутри другого, на месте
pygame.Rect.clip обрезает прямоугольник внутри другого
pygame.Rect.union соединяет два прямоугольника в один
pygame.Rect.union_ip соединяет два прямоугольника в один, на месте
pygame.Rect.unionall объединение многих прямоугольников
pygame.Rect.unionall_ip объединение многих прямоугольников, на месте
pygame.Rect.fit изменить размер и переместить прямоугольник учмиывая соотношение сторон
pygame.Rect.normalize корректировать отрицательные размеры
pygame.Rect.contains проверить, находится ли один прямоугольник внутри другого
pygame.Rect.collidepoint проверить, находится ли точка внутри прямоугольника
pygame.Rect.colliderect тест, пересекаются ли два прямоугольника
pygame.Rect.collidelist проверить, пересекается ли хоть один прямоугольник в списке
pygame.Rect.collidelistall пересекаются ли все прямоугольники в списке
pygame.Rect.collidedict проверить, если один прямоугольник в словаре пересекается
pygame.Rect.collidedictall пересекаются ли все прямоугольники в словаре

Обработка событий

Событие — это то, как Pygame сообщает о том, что что-то случилось за пределами кода программы. События создаются, например, при нажатии клавиш клавиатуры, мыши и размещаются в очереди, дожидаясь обработки.

Функция get в модуле pygame.event возвращает последнее событие, ожидающее в очереди и удаляет его из очереди.

Объект event

Модуль pygame.event для обработки очереди событий

pygame.event.pump Если вы не используете другие функции событий в своей игре, вы должны вызвать pygame.event.pump (), чтобы позволить pygame обрабатывать внутренние действия
pygame.event.get получает события из очереди
pygame.event.poll получить одно событие из очереди
pygame.event.wait ждёт одиночного события из очереди
pygame.event.peek проверить, ждут ли очереди события определённого типа
pygame.event.clear удалить все события из очереди
pygame.event.event_name возвращает имя для типа события. Строка находится в стиле WordCap
pygame.event.set_blocked проверяет, какие события не разрешены в очереди
pygame.event.set_allowed проверяет, какие события разрешены в очереди
pygame.event.get_blocked проверить, заблокирован ли тип события из очереди
pygame.event.set_grab проверяет совместное использование устройств ввода с другими приложениями
pygame.event.get_grab проверить, работает ли программа на устройствах ввода данных
pygame.event.post поместить новое событие в очередь
pygame.event.Event создать новый объект события
pygame.event.EventType Объект Python, представляющий событие SDL. Экземпляры пользовательских событий создаются с вызовом функции Event. Тип EventType не может быть напрямую вызван. Экземпляры EventType поддерживают назначение и удаление атрибутов.

Существует множество способов доступа к очереди событий. Просто проверять существование событий, захватывать их непосредственно из стека.

Модуль pygame.mouse для работы с мышью

pygame.mouse.get_pressed получить состояние кнопок мыши
pygame.mouse.get_pos получить позицию курсора мыши
pygame.mouse.get_rel получить количество движений мыши
pygame.mouse.set_pos установить позицию курсора мыши
pygame.mouse.set_visible скрыть или показать курсор мыши
pygame.mouse.get_focused проверяет, принимает ли дисплей ввод мыши
pygame.mouse.set_cursor установить изображение для курсора мыши
pygame.mouse.get_cursor получить изображение для курсора мыши

Функции мыши можно использовать для получения текущего состояния устройства мышь. Эти функции также могут изменять курсор мыши.

Когда режим отображения (display) установлен, очередь событий начнет принимать события мыши. Кнопки мыши генерируют события pygame.MOUSEBUTTONDOWN и pygame.MOUSEBUTTONUP , когда они нажимаются и отпускаются. Эти события содержат атрибут кнопки, указывающий, какая кнопка была нажата. Колесо мыши будет генерировать pygame.MOUSEBUTTONDOWN и pygame.MOUSEBUTTONUP события при прокрутке.

Когда колесо повернуто вверх, кнопка будет установлена на 4, вниз -5. Всякий раз, когда мышь перемещается, генерируется событие pygame.MOUSEMOTION . Движение мыши разбито на небольшие и точные события движения. По мере перемещения мыши многие события движения будут помещены в очередь. События движения мыши, которые неправильно очищены от очереди событий, являются основной причиной того, что очередь событий заполняется.

Пример. Нарисовать курсор под текущей позицией мыши.

Определить какая кнопка была нажата на мышке можно используя значение event.button:

Координаты курсора при нажатии кнопки мыши находятся в event.pos .

Пример. Перемещать картинку курсором мыши.

Клавиатура

Модуль pygame.key

Этот модуль содержит функции для работы с клавиатурой.Очередь событий получает события pygame.KEYDOWN и pygame.KEYUP при нажатии и отпускании клавиш клавиатуры.

Оба события имеют ключевой атрибут, который представляет собой целочисленный идентификатор, представляющий каждую клавишу на клавиатуре.Событие pygame.KEYDOWN имеет дополнительные атрибуты: unicode и scancode. unicode представляет собой одну символьную строку, которая соответствует введённому символу. Scancode представляет собой код для конкретной платформы.

Получить код клавиши:


Существует много клавиатурных констант, они используются для представления клавиш на клавиатуре. Ниже приведен список всех клавиатурных констант:

Направленное движение с помощью клавиш

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

Создать картинку, например:

Проверить очередь событий:

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

Если — да, то получмить код нажатой клавиши и сформировать новые координаты для картинки:

И нарисовать картинку в новом месте:

Объект Surface

pygame.Surface — объект pygame для представления изображений


Наложение поверхностей, прозрачность.

Управление временем

Модуль pygame.time содержит объект Clock, который можно использовать для отслеживания
времени. Чтобы создать объект типа: время, вызывается конструктор pygame.time.Clock:
clock = pygame.time.Clock()

Когда создан объект clock, можно вызвать его функцию tick один раз за кадр,
которая возвращает время, прошедшее со времени предыдущего вызова в миллисекундах:
time_passed = clock.tick ()

Функция tick может использовать необязательный параметр для установления максимальной частоты кадров. Этот параметр нужен, если игра запущена на рабочем компьютере и необходимо контролировать, чтобы она не использовала всю его вычислительная мощность на 100%:

time_passed = clock.tick (30)

Звуки

Для управления звуком используется модуль pygame.mixer . Он отвечает за любые действия со звуками.

Загружаем звуковой файл в формате *.wav

sound = pygame.mixer.Sound("sound.wav")
(загружаем до игрового цикла, т.к. это очень долгая операция)

Столкновения (collisions)

При написании игр часто возникает необходимость проверять взаимное расположение объектов на экране, отслеживать моменты их столкновений, пересечений.

Читайте также: