Всем привет, меня зовут Цзеджи. Сегодня я познакомлю вас с небольшим проектом, игрой, которую можно разработать всего с сотней строк кода.
установить пигейм
Загрузите соответствующую версию pygame для Python и выполните следующую команду.
Создавайте окна Pygame и отвечайте на ввод пользователя
Создайте новую папку Alien_invasion и создайте в папке новый файл Alien_invasion.py, введите следующий код.
Запустив приведенный выше код, мы можем получить серое окно интерфейса:
Создать класс настроек
Для того, чтобы в процессе написания игры легко создавать какие-то новые фичи, давайте напишем дополнительный модуль настроек, который содержит класс Settings для хранения всех настроек в одном месте. Это упрощает изменение внешнего вида игры позже, когда проект разрастется.
Сначала мы изменяем размер и цвет отображения в файле Alien_invasion.py.
Сначала создайте новый файл python settings.py в папке Alien_invasion и добавьте в него следующий код.
Затем импортируйте класс Settings в Alien_invasion.py и используйте соответствующие настройки, измените их следующим образом:
Добавьте изображение космического корабля
Далее нам нужно добавить космический корабль в игру. Чтобы нарисовать корабль игрока на экране, мы загрузим изображение и отрисуем его с помощью метода blit() в Pygame().
В игре можно использовать файлы изображений практически любого типа, но проще всего использовать файл растрового изображения (.bmp), поскольку Pygame по умолчанию загружает растровые изображения.
Хотя другие типы изображений могут быть загружены, необходимо установить дополнительные библиотеки.
Мы рекомендуем искать изображения на сайтах с бесплатными фотографиями:pixabay.com/
Мы создаем новую папку с именем images в основной папке проекта (alien_invasion) и помещаем в нее следующие bmp-изображения.
Далее мы создаем класс корабля ship.py:
Рефакторинг: модуль game_functions
В больших проектах часто необходимо провести рефакторинг существующего кода перед добавлением нового кода. Цель рефакторинга — упростить структуру кода и облегчить его расширение.
Мы собираемся реализовать модуль game_functions, в котором будет храниться набор функций, обеспечивающих работу игры Alien Invasion. Создав модуль game_functions, можно избежать слишком длинного файла linear_invasion.py, что упростит понимание его логики.
Функция check_events()
Сначала мы перемещаем код, управляющий событиями, в функцию с именем check_events(), чтобы изолировать цикл обработки событий.
Затем мы модифицируем код Alien_invasion.py, чтобы импортировать модуль game_functions и заменить цикл обработки событий вызовом функции check_events():
Функция update_screen()
Переместите код, который обновляет экран, в функцию с именем update_screen() и поместите эту функцию в модуль game_functions:
Alien_invasion изменен следующим образом:
Из приведенного выше набора процессов мы обнаружили, что в реальном процессе разработки мы писали максимально простой код в начале и проводили рефакторинг, когда проект становился все более и более сложным. Далее мы начинаем работать над динамическими аспектами игры.
летать на космическом корабле
Здесь мы хотим добиться того, чтобы игрок мог управлять движением космического корабля влево и вправо с помощью клавиш со стрелками влево и вправо.
Реагировать на нажатия клавиш
Поскольку в pygame каждое нажатие клавиши регистрируется как событие KEYDOWN, в check_events() нам нужно дополнительно определить, какая клавиша является клавишей, после того, как мы обнаружим событие KEYDOWN через event.type. код показывает, как показано ниже:
разрешить постоянное движение
Пока игрок держит стрелку вправо, мы хотим, чтобы корабль продолжал двигаться, пока игрок его не отпустит. Здесь мы судим по событию KETUO. Поэтому мы устанавливаем бит флага moving_right для обеспечения непрерывного движения. Принцип заключается в следующем:
Когда корабль не движется, флаг moving_right будет ложным. Когда игрок нажимает стрелку вправо, мы устанавливаем этот флаг в True, когда игрок отпускает, мы сбрасываем флаг в False.
Это движущееся свойство является типом свойства космического корабля, которым мы управляем с помощью класса корабля, поэтому мы добавляем к этому классу имя свойства с именем moving_right и метод update() для определения состояния флага moving_right.
ship
game_functions
Наконец, вызовите метод update() в Alien_invasion.
двигаться влево и вправо
Ранее мы реализовали перемещение вправо, а затем перешли влево, логика аналогична, поэтому код выкладывать не буду.
Отрегулируйте скорость корабля
В настоящее время каждый раз, когда выполняется цикл while, корабль перемещается не более чем на один пиксель, мы можем добавить ship_speed_factor в настройках, чтобы контролировать скорость корабля. Мы будем использовать это свойство, чтобы определить максимальное расстояние, на которое корабль будет перемещаться за каждый цикл.
Настройки:
Судно:
Ограничение диапазона движения корабля
Если игрок будет удерживать стрелку слишком долго, корабль исчезнет, так как мне остановить движение корабля, когда он достигнет края экрана? Здесь нам нужно только изменить метод обновления в классе Ship, чтобы добавить логическое суждение.
рефакторинг
Здесь мы в основном говорим о рефакторинге функции check_events(), разделив часть кода на две части, одна часть обрабатывает событие KEYDOWN, а другая часть обрабатывает событие KEYUP.
game_functions:
стрельба
Затем добавьте функцию стрельбы, чтобы когда игрок нажимал пробел, пуля выстреливала, а пуля поднималась вверх по экрану и исчезала, когда достигала экрана.
Добавить настройки маркера
Добавьте некоторые свойства маркера в класс Settings, здесь мы создадим темно-серый маркер шириной 3 пикселя и высотой 15 пикселей. Скорость пули чуть ниже, чем у корабля.
Создайте класс Bullet
Хранить пули в группе
С классом Bullet и необходимыми настройками, определенными ранее, пришло время написать код, который запускает пулю каждый раз, когда игрок нажимает пробел.
Во-первых, мы создаем группу в linear_invasion для хранения всех допустимых пуль.
открытый огонь
Здесь мы модифицируем функцию check_keydown_events(), чтобы отслеживать событие нажатия игроком пробела. Здесь также необходимо изменить функцию update_screen(), чтобы каждый маркер можно было перерисовывать при каждом обновлении экрана.
Давайте посмотрим на эффект:
удалить недостающие пули
Убраны исчезающие пули в Alien_invasion.
Ограничьте количество пуль
Чтобы стимулировать игроков к стрельбе по мишеням, мы оговариваем, что одновременно на экране могут существовать только 3 пули, нам нужно только проверять, меньше ли 3 пуль, которые не исчезли, перед каждым созданием пуль.
Создайте функцию update_bullets()
Чтобы сделать код в Alien_invasion проще, мы проверим код управления пулями и переместим его в модуль game_functions:
Создайте функцию fire_bullet()
Здесь мы переносим код, который запускает пулю, в отдельную функцию:
Добавляйте пришельцев и обнаруживайте столкновения
Прежде чем мы завершим новую задачу, давайте добавим быструю клавишу Q, чтобы завершить игру:
Создайте первого инопланетянина
Здесь тот же метод, что и для создания космического корабля
Создайте группу пришельцев
Здесь мы сначала определяем, сколько пришельцев может удерживать линия и сколько линий рисовать. Здесь много изменений в коде, и вы можете непосредственно увидеть эффект:
мобильный инопланетянин
Ранее мы создали статичного инопланетянина, теперь нам нужно заставить инопланетянина двигаться. Здесь мы задаем скорость движения пришельца в классе Settings, а затем реализуем движение через метод update в классе Alien
стрелять в инопланетян
Чтобы стрелять в инопланетян, вы должны сначала определить, есть ли столкновение между двумя членами группы.В игре столкновение — это наложение игровых элементов.
Здесь мы используем sprite.groupcollide() для обнаружения коллизий между членами двух групп.
Когда пуля попадает в инопланетянина, нам нужно знать об этом немедленно и в то же время заставить столкнувшегося инопланетянина немедленно исчезнуть, поэтому нам нужно обнаружить столкновение сразу же после обновления положения пули.
Конец игры
Здесь нам также нужно знать, когда закончить игру, в следующих случаях:
Все корабли уничтожены
Инопланетяне достигают нижней части экрана
фактический эффект:
подсчет очков
Наконец, мы добавим в игру кнопку «Играть», которая будет использоваться для запуска игры по мере необходимости и перезапуска игры, когда она закончится.
Мы также внедрим систему подсчета очков, которая будет ускорять темп по мере повышения уровня игроков.
Добавить кнопку воспроизведения
Здесь мы можем инициализировать игру в неактивное состояние, и когда мы нажмем кнопку, запустить игру.
Поскольку в Pygame нет встроенного способа создания кнопок. Таким образом, мы можем создать сплошной прямоугольник с собственной меткой, создав класс Button.
Мы определяем, происходит ли событие щелчка, определяя, сталкиваются ли координаты после щелчка мыши с кнопкой, которую мы рисуем.
уровень повышен
Чтобы сделать игру более сложной и интересной после того, как игрок устранил врага, мы можем изменить его в классе Settings, чтобы увеличить статическое начальное значение и динамическое начальное значение.
Оценка, уровень, оставшиеся корабли
Упакован в исполняемый файл
Вышеупомянутая разработка игры завершена! !
Небольшие партнеры с сильными практическими способностями могут попытаться сделать это самостоятельно, вы можете написать мне личное сообщение «game», чтобы получить полный исходный код.