Создание игры на Pygame с помощью нейросетей
Содержание
1. Описание
- Программы: Python, нейросеть Kandinsky
- Тема: создание персонажа и программирование игры на Python
- Возраст: 12-17 лет
- Цели урока:
Продемонстрировать ученику, что собой представляет процесс написания собственной программы на примере создания мини-игры, а также показать возможности современных технологий; вызвать у ученика интерес к написанию собственных программ и прохождению курса по Python.
2. План урока
2.1. Что надо сделать до урока?
Зарегистрироваться на сайте для генерации изображения. Ученик не сможет генерировать изображение сам, поэтому показываем процесс у себя, через демонстрацию.
2.2. Обязательно все делать по плану?
Обязательно надо сохранить принципиальную структуру урока: 1) генерация персонажа, 2) генерация фона 3) загрузка изображений 4) программирование управления персонажем 5) повторение пунктов 1-4 для предмета (если есть на это время). Кроме этих ключевых моментов занятия, можно поощрить творческий подход ребенка и помочь ему придумать оригинального персонажа.
3. Подготовка к созданию игры
3.1. Введение
Познакомьтесь с ребенком, узнайте чем он интересуется. Спросите, интересно ли ему было бы создавать свои игры. Расскажите ему, что такое нейросети.
3.2. Генерация персонажа
Это отличный момент, чтобы дать ребенку проявить фантазию в хорошем
ключе и почувствовать себя более уверенно психологически. Дайте ему
возможность попробовать разные промпты, поддержите его идеи, но будьте
честными и давайте справедливую обратную связь.
Пример промпта и результата:
Горилла получилась прикольная, но для игры это изображение не подойдет. Объясните это ученику и покажите, как получить более подходящий результат: надо переключить стиль изображения на “Пиксель арт”. Вот результат:
3.3. Генерация заднего фона
Здесь нет ограничений по стилям, я снова выберу пиксель арт, чтобы сохранить общую стилистику:
3.4. Удаление заднего фона у персонажа
Фон у персонажа и предмета удаляем самостоятельно с помощью этого или любого другого сервиса на свой выбор. Ученику только показываем процесс.
4. Программирование персонажа
4.1. Введение
Спросите у ученика, знает ли он, как в общем смысле работает компьютер. Объясните, что любая программа - это набор инструкций для компьютера, написанных на специальном языке, который компьютер понимает. Расскажите ему, что сейчас покажите, как с помощью языка Python, можно написать код для собственной игры.
4.2. Где писать код?
Базовый вариант: показывать у себя в демонстрации. Если ученик достаточно сознательный, то можно предложить ему использовать онлайн компилятор, который поддерживает Pygame, например trinket. Если вы используете онлайн компилятор, то имейте ввиду, что там требуется регистрация, чтобы загрузить изображения. Соответственно, ребенок должен уметь загружать изображения, находить их в проводнике, пользоваться электронной почтой и т.д. Если есть хотя бы маленькая вероятность, что ребенок зависнет на каком-то из этих моментов, то лучше просто показывайте у себя на экране.
4.3. Начальный код
В качестве основы используйте этот код. Объясните ученику, что все это подробно проходится на курсе и сейчас не обязательно все здесь понимать. Просто покажите, что делает этот код и ответьте на вопросы ученика, если они будут.
import random import pygame # запускаем библиотеку pygame.init() # создаем экран SCREEN_SIZE = 768 PLAYER_SIZE = SCREEN_SIZE / 3 ITEM_SIZE = SCREEN_SIZE / 7 WIDTH = HEIGHT = SCREEN_SIZE screen = pygame.display.set_mode((WIDTH, HEIGHT)) # цвета black = (0, 0, 0) red = (255, 0, 0) blue = (0, 0, 255) # кадры в секунду FPS = 60 clock = pygame.time.Clock() # загрузка изображений fon = pygame.image.load("jungles.png") fon = pygame.transform.scale(fon, [SCREEN_SIZE, SCREEN_SIZE]) player = pygame.image.load("monkey.png") player = pygame.transform.scale(player, [PLAYER_SIZE, PLAYER_SIZE]) # координаты игрока player_pos = [WIDTH * 0.5, HEIGHT - PLAYER_SIZE / 2] player_speed = [0, 0] player_rect = player.get_rect( center=player_pos, width=PLAYER_SIZE / 2, height=PLAYER_SIZE / 2 ) # вспомогательная функция def clip(valToClip, edge1, edge2): if valToClip < edge1: valToClip = edge1 if valToClip > edge2: valToClip = edge2 return valToClip # игровой цикл running = 1 while running == 1: # задаем кол-во кадров в секунду clock.tick(FPS) # отрисовка всех спрайтов screen.blit(fon, [0, 0]) screen.blit( player, [ player_rect.centerx - PLAYER_SIZE / 2, player_rect.centery - PLAYER_SIZE / 2 ] ) # обновление экрана pygame.display.update() # обработка событий events = pygame.event.get() for event in events: if event.type==pygame.QUIT: running = 0 pygame.quit()
С моими картинками получилось вот так:
4.4. Программирование движения
Дальше представлен код для движения персонажа. Не надо писать код
прямо на уроке, только вставляем готовые куски и поясняем ученику
зачем нужна та или иная часть. Если ученик задает более специфические
вопросы, вроде “А что означает это слово?” или “А как это работает?”,
то скажите, что все это можно узнать на курсе, а сейчас нет времени
это объяснять, иначе посмотреть на готовую игру не успеете.
Код, который надо вставить в игровом цикле:
# нажатые клавиши keys = pygame.key.get_pressed() # движение персонажа dxdy = [0, 0.5] bottomBorder = HEIGHT - PLAYER_SIZE / 2 accel = 0.5 topSpeed = 7 if (keys[pygame.K_LEFT] and player_speed[0] > -topSpeed) or (player_speed[0] > 0 and not keys[pygame.K_RIGHT]): dxdy[0] = -accel if keys[pygame.K_RIGHT] and player_speed[0] < topSpeed or (player_speed[0] < 0 and not keys[pygame.K_LEFT]): dxdy[0] = accel if keys[pygame.K_SPACE] and player_rect.bottom == bottomBorder: player_speed[1] = -10 player_speed[0] += dxdy[0] player_speed[1] += dxdy[1] player_rect.x += player_speed[0] player_rect.y += player_speed[1] # ограничение движения в рамках экрана player_rect.bottom = clip(player_rect.bottom, 0, bottomBorder) player_rect.top = clip(player_rect.top, 0, HEIGHT) player_rect.left = clip(player_rect.left, 0, WIDTH) player_rect.right = clip(player_rect.right, 0, WIDTH)
5. Добавление предмета (если достаточно времени)
Если времени не хватает, то опустите эту часть. Объясните ученику, что все успеть за один урок невозможно. Скажите, что если ему интересно добавить в игру что-то еще, то надо прийти на курс.
5.1. Создание изображения
В моем случае все довольно очевидно:
5.2. Программирование предмета
Код, который надо добавить до игрового цикла:
item = pygame.image.load("banana.png") item = pygame.transform.scale(item, [ITEM_SIZE, ITEM_SIZE]) # координаты предмета item_pos = [(WIDTH - ITEM_SIZE) * 0.5, (HEIGHT - ITEM_SIZE) * 0.5] item_rect = item.get_rect(topleft=item_pos) # кол-во собранных предметов catched_item = 0
Внутри игрового цикла:
screen.blit(item, item_rect) # движения предмета item_rect.y += 5 didMiss = item_rect.y > HEIGHT + ITEM_SIZE + 10 didCatch = player_rect.colliderect(item_rect) # перемещение предмета if didMiss or didCatch: item_rect.y = -1 * (ITEM_SIZE + 10) item_rect.x = random.randint(0, round(WIDTH - ITEM_SIZE)) # начисление очков if didCatch: catched_item += 1 print("Собрано:", catched_item)
6. Окончательный код и материалы
Если все сделать правильно, то горилла должна двигаться по стрелочкам, прыгать на пробел и собрать падающие бананы. Если, что-то не работает, то следует сравнить с примером рабочего кода.