Картинки на выставку (часть 1)
Система управления версиями (CVS) — один из основных инструментов программиста. Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое.
Git — одна из самых популярных систем контроля версиями (CVS). Автор git — Линус Торвальдс.
GitHub — крупнейший веб-сервис для хостинга IT-проектов и их совместной разработки.
Упражнение 1. Git
Пройдите туториал и продемонстрируйте преподавателю тестовый репозиторий на гитхабе.
1. Зарегистрируйтесь на github.com с некоторым именем пользователя, например Ivanov (тут и далее вместо Ivanov нужно подставлять имя вашего пользователя, а вместо ivanov.ivan@someuniversity.edu вашу настоящую почту).
- Создаем новый репозиторий https://github.com/new (или значок + в правом верхнем углу):
- В качестве имени репозитория задаем infa_2020_ivanov
- Доступ оставляем Public
- Не забываем поставить галочку «Initialize this repository with a README»
3. Откройте терминал (консоль) GNU/Linux или командную строку Git-bash под M$ Windows. Теперь git clone — склонируем получившийся репозиторий на свой компьютер и зайдем в папку с репозиторием:
$ git clone https://github.com/Ivanov/infa_2020_ivanov Cloning into 'infa_2020_ivanov'. remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), done. $ ls infa_2020_ivanov $ cd infa_2020_ivanov $ ls README.md
Не забудем сконфигурить гит, представившись ему (это обязательно нужно сделать находясь в папке infa_2020_ivanov ):
git config user.name "Ivanov Ivan" git config user.email ivanov.ivan@someuniversity.edu
Почту указываем как при регистрации.
4. Теперь у нас локально есть полная и независимая версия нашего репозитория infa_2020_ivanov . Она никак явным образом не связана с версией на серверах github’а, однако в гите существуют инструменты для обмена данными между разными репозиториями. Иными словами, git — это распределенная система управлениями версиями.
- Команда git log возвращает историю нашего репозитория. В данный момент в нашей истории ровно один коммит (коммит — это некоторый набор изменений).
-> git log commit eec733a21cerfb66973991a9357aab735fa40ba4 Author: Ivanov Date: Wed Sep 16 12:06:08 2020 +0300 Initial commit
6. Давайте отредактируем файл README.md и добавим в него что-нибудь. Откроем файл README.md и напишем в нем что-нибудь. После с помощью git diff посмотрим на текущие изменения. В «диффе» видно, что была добавлена строчка «it’s test project».
-> git diff diff --git a/README.md b/README.md index 21e60f8..285eafa 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ -# infa_2020_ivanov \ No newline at end of file +# infa_2020_ivanov + +it\'s test project
7. Команда git status показывает текущий статус репозитория. Мы видим, что сейчас мы находимся в ветке master (основная ветка нашего репозитория). Ниже написано, что файл README.md был изменен. Однако он ещё не готов для коммита.
-> git status # On branch master # Changes not staged for commit: # (use "git add . " to update what will be committed) # (use "git checkout -- . " to discard changes in working directory) # # modified: README.md # no changes added to commit (use "git add" and/or "git commit -a")
- Сделаем git add, как рекомендует нам команда status.
-> git add README.md -> git status # On branch master # Changes to be committed: # (use "git reset HEAD . " to unstage) # # modified: README.md #
Теперь git status показывает, что изменения в файле README.md готовы для коммита. Если сейчас снова измененить README.md , то нужно снова обязательно выполнить git add.
- git-commit — закоммитим наши изменения, то есть внесём «квант» изменений в историю развития проекта:
$ git commit -m "Added something to README" [master 274f6d5] Added something to README Committer: Ivanov Ivan 1 file changed, 3 insertions(+), 1 deletion(-)
- Снова посмотрим (git log) на историю нашего репозитория:
$ git log commit 8e2642d512b11ae43a97b0b4ac68e802d2626f14 Author: Ivanov Ivan Date: Wed Nov 9 14:47:40 2016 +0300 Added something to README commit eec733a21cerfb66973998a9327aab735fa40ba4 Author: Ivanov Ivan Date: Wed Nov 9 13:36:38 2016 +0300 Initial commit
Теперь в нашем репозитории два коммита.
- Давайте сделаем git push — отправим («запушим» на сленге программистов) наши изменения в оригинальный репозиторий на github.com.
$ git push Username for 'https://github.com': Password for 'https://ivanov@github.com': To https://github.com/Ivanov/infa_2020_ivanov eec733a..8e2642d master -> master
При git push необходимо будет ввести логин и пароль на GitHub (если, конечно, вы не настроили ssh-аутентификацию :-)). Теперь изменения будут доступны для всех.
- Существует парная команда git pull — которая забирает изменения с оригинального репозитория на сервере.
$ git pull Already up-to-date.
Создание картинок с библиотекой Pygame.draw
На этом занятии вы будете рисовать графические объекты на языке Python.
Откройте папку со своим репозиторием infa_2020_ivanov , который вы создали в GitHub и склонировали на локальный компьютер.
Создайте в нём вложенную папку lab3 . Все файлы этой лабораторной работы сохраняйте в эту папку, чтобы затем добавить их в репозиторий, закоммитить и «запушить» на сервер для сдачи преподавателю.
Установка и подключение библиотеки
Для установки библиотеки следуйте инструкциям на pygame.org
Чтобы импортировать возможности библиотеки Pygame в вашей программе недостаточно одной инструкции import , нужны ещё некоторые дополнительные действия:
import pygame # После импорта библиотеки, необходимо её инициализировать: pygame.init() # И создать окно: screen = pygame.display.set_mode((300, 200)) # здесь будут рисоваться фигуры # . # после чего, чтобы они отобразились на экране, экран нужно обновить: pygame.display.update() # Эту же команду нужно будет повторять, если на экране происходят изменения. # Наконец, нужно создать основной цикл, в котором будут отслеживаться # происходящие события. # Пока единственное событие, которое нас интересует - выход из программы. while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()
Помимо команды import pygame для более удобного доступа к функциям рисования, можно дополнительно прописать ещё одну строку импорта:
import pygame from pygame.draw import *
Это позволит вместо pygame.draw.rect(. ) писать просто rect(. ) .
Также хорошей практикой является добавление небольшой задержки в главный цикл программы, чтобы не заставлять ее работать «вхолостую», постоянно считывая события, которых, скорее всего, нет. Для этого в pygame есть специальный модуль time . До начала главного цикла создаем объект Clock:
clock = pygame.time.Clock()
После этого в главном цикле добавляем строку:
clock.tick(30)
Здесь 30 — это максимальный FPS, быстрее которого программа работать не будет. Естественно, можно указать и любое другое значение (которое, кстати, есть смысл записать в отдельную переменную для легкого доступа).
Пример №1
Выведем простую картинку. Создайте файл 1_draw.py , скопируйте туда текст примера №1 и запустите.
import pygame from pygame.draw import * pygame.init() FPS = 30 screen = pygame.display.set_mode((400, 400)) rect(screen, (255, 0, 255), (100, 100, 200, 200)) rect(screen, (0, 0, 255), (100, 100, 200, 200), 5) polygon(screen, (255, 255, 0), [(100,100), (200,50), (300,100), (100,100)]) polygon(screen, (0, 0, 255), [(100,100), (200,50), (300,100), (100,100)], 5) circle(screen, (0, 255, 0), (200, 175), 50) circle(screen, (255, 255, 255), (200, 175), 50, 5) pygame.display.update() clock = pygame.time.Clock() finished = False while not finished: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: finished = True pygame.quit()
Пример №2
Для создания штриховок можно использовать циклы:
import pygame from pygame.draw import * pygame.init() FPS = 30 screen = pygame.display.set_mode((400, 400)) x1 = 100; y1 = 100 x2 = 300; y2 = 200 N = 10 color = (255, 255, 255) rect(screen, color, (x1, y1, x2 - x1, y2 - y1), 2) h = (x2 - x1) // (N + 1) x = x1 + h for i in range(N): line(screen, color, (x, y1), (x, y2)) x += h pygame.display.update() clock = pygame.time.Clock() finished = False while not finished: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: finished = True pygame.quit()
Все функции модуля pygame.draw в качестве первого аргумента принимают экран, на котором нужно рисовать (приложение может открывать и несколько окон, нужно точно знать, на каком рисовать). Второй аргумент — цвет, заданный кортежем из трех чисел от 0 до 255 в формате RGB. Также возможно наличие четвертого числа — прозрачности. После этого следуют координаты фигуры (для каждой фигуры свой формат задания координат), далее — параметр width . Если передать в этот параметр положительное значение, оно будет означать толщину линии. Если параметр равен 0 (значение по умолчанию), фигура будет полностью закрашеной. Полное описание функций модуля pygame.draw вы можете найти в официальной документации.
Задание №1 (пробное)
Первое задание-картинка одинаковое у всех студентов. Нарисовать злой смайлик:

Задание №2 (боевое)
Второе задание-картинка у всех студентов разное. Попросите преподавателя закрепить за вами одно из заданий. Возможно, вам будет выдано отдельное задание, не из этого списка.
| Картинка | Сложность |
| 1_1.png | |
| 2_1.png | |
| 3_1.png | |
| 4_1.png | |
| 5_1.png | |
| 6_1.png | |
| 7_1.png | |
| 8_1.png | |
| 9_1.png | |
| 10_1.png | |
| 11_1.png | |
| 12_1.png | |
| 13_1.png | |
| 14_1.png | |
| 15_1.png | |
| 16_1.png | |
| 17_1.png |
Важно! Результат вашей работы обязательно нужно отправить в свой репозиторий:
student@computer:~/$ cd infa_2020_ivanov student@computer:~/infa_2020_ivanov/$ git add lab3 student@computer:~/infa_2020_ivanov/$ git commit -m "Классная работа. Нарисовал. " # здесь можно написать подробности student@computer:~/infa_2020_ivanov/$ git push
Задание №3 (на дом)
Третье задание является усложнённой версией второго. Вам придётся выполнить модификацию своей программы. Если вы не успеете выполнить его на занятии, обязательно сделайте задание дома.
Для скачивания репозитория на домашнем компьютере используйте команду git clone, а в дальнейшем для подтягивания изменений команду git pull.
| Картинка | Сложность |
| 1_2.png | |
| 2_2.png | |
| 3_2.png | |
| 4_2.png | |
| 5_2.png | |
| 6_2.png | |
| 7_2.png | |
| 8_2.png | |
| 9_2.png | |
| 10_2.png | |
| 11_2.png | |
| 12_2.png | |
| 13_2.png | |
| 14_2.png | |
| 15_2.png | |
| 16_2.png | |
| 17_2.png |
Важно! Результат вашей работы обязательно нужно отправить в свой репозиторий:
student@computer:~/$ cd infa_2020_ivanov student@computer:~/infa_2020_ivanov/$ git add lab3 student@computer:~/infa_2020_ivanov/$ git commit -m "Домашняя работа. Нарисовал. " # здесь можно написать подробности student@computer:~/infa_2020_ivanov/$ git push
Сайт построен с использованием Pelican. За основу оформления взята тема от Smashing Magazine. Исходные тексты программ, приведённые на этом сайте, распространяются под лицензией GPLv3, все остальные материалы сайта распространяются под лицензией CC-BY.
Как добавить картинку в Pygame menu?

Всем привет!
Я сделал простенькую игру на питоне с помощью pygame, в которой пользователь сначала выбирает скин своего персонажа, а затем играет им.
Когда запускаю игру появляется меню, в котором кроме кнопки PLAY еще есть кнопка CHOOSE YOUR CHARACTER, где кокраз таки можно выбрать персонажа. Высвечивается имя героя(например, Железный человек). если пользователь хочет другого перса, то кликает мышью и появляется название другого героя.
Подскажите, как мне сделать так, чтобы под именем персонажа еще высвечивался его скин(его картинка) и то есть,листая, появлялись новые имена персонажей и их картинки
Часть кода с меню:
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
def set_hero(value, difficulty): global skin_h print(value, difficulty) if difficulty == 1: skin_h = 'images\чп.png' elif difficulty == 2: skin_h = 'images\iron man.png' elif difficulty == 3: skin_h = 'images\A usa man.png' elif difficulty == 4: skin_h = 'images\dead pool.png' global skin_h pygame.init() surface = pygame.display.set_mode((700, 700)) mainmenu = pygame_menu.Menu('Welcome', 700, 700, theme=themes.THEME_SOLARIZED) mainmenu.add.button('Choose your character ', character_menu) skin_h = 'images\чп.png' skins_h = pygame_menu.Menu('Select a Character', 700, 700, theme=themes.THEME_BLUE) skins_h.add.selector('Character :', [('Spider man', 1), ('Iron man', 2), ('Captain America', 3), ('Dead Pool', 4)], onchange=set_hero) mainmenu.add.button('Play', start_the_game) mainmenu.mainloop(surface)
Если что, в переменной skin_h хранится итоговый скин персонажа, который выберет пользователь. Потом skin_h передается в саму игру, с этим скином уже играет пользователь.
Модули pygame.image и pygame.transform
Функция load() модуля pygame.image загружает изображение и создает экземпляр Surface , на котором отображено это изображение. В load() передается имя файла. «Родным» форматом является BMP, однако если функция pygame.image.get_extended() возвращает истину, то можно загружать ряд других форматов: PNG, GIF, JPG и др.
import pygame as pg import sys W = 400 H = 300 sc = pg.display.set_mode((W, H)) sc.fill((100, 150, 200)) dog_surf = pg.image.load('dog.bmp') dog_rect = dog_surf.get_rect(bottomright=(W, H)) sc.blit(dog_surf, dog_rect) pg.display.update() while 1: for i in pg.event.get(): if i.type == pg.QUIT: sys.exit() pg.time.delay(20)

Если у изображения нет прозрачного слоя, но он необходим, то следует воспользоваться методом set_colorkey() класса Surface :
dog_surf = pg.image.load('dog.bmp') dog_surf.set_colorkey((255, 255, 255))
Все пиксели, цвет которых совпадает с переданным в set_colorkey() значением, станут прозрачными.

У формата PNG с альфа-каналом (когда для точек можно настраивать степень прозрачности; обычно устанавливается полностью прозрачный фон) таких проблем нет:
sun_surf = pg.image.load('sun.png') sun_rect = sun_surf.get_rect() sc.blit(sun_surf, sun_rect)

Ко всем экземплярам Surface рекомендуется применять метод convert() , который, если не передавать аргументы, переводит формат кодирования пикселей поверхности в формат кодирования пикселей главной поверхности. При выполнении игры это ускоряет отрисовку поверхностей.
Если поверхность была создана на базе изображения с альфа-каналом, то вместо convert() надо использовать метод convert_alpha() , так как первый удаляет прозрачные пиксели (вместо них будет черный цвет). Таким образом, код загрузки и обработки изображений разных форматов должен выглядеть примерно так:
dog_surf = pg.image.load('dog.bmp').convert() sun_surf = pg.image.load('sun.png').convert_alpha()
Что по смыслу равносильно:
. dog_surf = pg.image.load('dog.bmp') dog_surf = dog_surf.convert() .
Метод convert() возвращает новую, конвертированную, поверхность. Он не изменяет ту, к которой применяется.
В модуле pygame.image есть функция save() , которая позволяет сохранять переданную ей поверхность (не обязательно главную) в формат BMP, TGA, PNG, JPEG. Пример:
while 1: for i in pygame.event.get(): if i.type == pygame.QUIT: sys.exit() elif i.type == pygame.KEYUP \ and i.key == pygame.K_s: pygame.image.save(sc, 'day.png') pygame.time.delay(20)
Изменение поверхностей
Модуль pygame.transform содержит функции для изменения поверхностей. Некоторые трансформации (например, изменение размера) приводят к ухудшению изображения из-за потери части пикселей. В таких случаях надо сохранять исходную поверхность и выполнять трансформации от нее.
Функции модуля transform , которые изменяют поверхности, возвращают новые. Первым аргументом им передается исходный Surface . Ниже приведены примеры использования наиболее востребованных функций.
Функция flip() переворачивает Surface по горизонтали и вертикали, к потери качества не приводит. Указывается поверхность и булевыми значениями оси переворота.
import pygame import sys sc = pygame.display.set_mode((400, 300)) sc.fill((100, 150, 200)) dog_surf = pygame.image.load('dog.bmp').convert() dog_surf.set_colorkey((255, 255, 255)) dog_rect = dog_surf.get_rect(center=(200, 150)) sc.blit(dog_surf, dog_rect) pygame.display.update() while 1: for i in pygame.event.get(): if i.type == pygame.QUIT: sys.exit() # При отжатии (нажать и отпустить) клавиши f elif i.type == pygame.KEYUP and i.key == pygame.K_f: # собака перевернется слева направо flip = pygame.transform.flip(dog_surf, True, False) sc.fill((100, 150, 200)) sc.blit(flip, dog_rect) pygame.display.update(dog_rect) pygame.time.delay(20)
Поворот и изменение размера:
import pygame import sys sc = pygame.display.set_mode((400, 300)) sc.fill((100, 150, 200)) dog_surf = pygame.image.load('dog.bmp').convert() dog_surf.set_colorkey((255, 255, 255)) dog_rect = dog_surf.get_rect(center=(200, 150)) sc.blit(dog_surf, dog_rect) pygame.display.update() # ждем 1 секунду перед изменением pygame.time.wait(1000) sc.fill((100, 150, 200)) # уменьшаем в два раза scale = pygame.transform.scale( dog_surf, (dog_surf.get_width() // 2, dog_surf.get_height() // 2)) scale_rect = scale.get_rect(center=(200, 150)) sc.blit(scale, scale_rect) pygame.display.update(dog_rect) pygame.time.wait(1000) sc.fill((100, 150, 200)) # поворачиваем на 45 градусов rot = pygame.transform.rotate(dog_surf, 45) rot_rect = rot.get_rect(center=(200, 150)) sc.blit(rot, rot_rect) pygame.display.update() while 1: for i in pygame.event.get(): if i.type == pygame.QUIT: sys.exit() pygame.time.delay(20)
Практическая работа
Допустим, у вас есть такое изображение вида сверху машины:
Напишите программу управления ее движением с помощью стрелок клавиатуры (вверх, вниз, влево, вправо) так, чтобы объект всегда двигался головой вперед.
Курс с примерами решений практических работ:
pdf-версия
X Скрыть Наверх
Pygame. Введение в разработку игр на Python
Как работать с изображениями. Модули image и transform
Для фотореалистичных изображений лучше всего использовать JPEG, т.к. незначительные потери практически не скажутся на визуальном восприятии, но изображение будет хорошо сжато. Для искусственных изображений с большим наличием однотонных областей (например, клип-арт) где четкость границ и однотонность заливки имеет первостепенное значение, лучше выбирать формат PNG. Кроме того, этот формат хранит альфа-канал для прозрачного фона (в JPEG такой возможности нет).
Программа ниже инициализирует Pygame и выводит в консоль значение функции get_extended():
import pygame pygame.init() W, H = 600, 400 sc = pygame.display.set_mode((600, 400)) pygame.display.set_caption("Изображения") pygame.display.set_icon(pygame.image.load("app.bmp")) clock = pygame.time.Clock() FPS = 60 WHITE = (255, 255, 255) RED = (255, 0, 0) YELLOW = (239, 228, 176) print( pygame.image.get_extended() ) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() clock.tick(FPS)
Как видите, в данном случае Pygame возвращает 1, значит, можно использовать форматы PNG и JPEG. Теперь загрузим в программе изображение машинки:
car_surf = pygame.image.load("images/car.bmp")
Здесь используется функция load(), в которой указывается путь к изображению (относительно исполняемого файла на Питоне) и на выходе она формирует поверхность с изображением машинки. Далее, мы можем отобразить содержимое этой поверхности уже знакомым нам способом:
car_rect = car_surf.get_rect(center=(W//2, H//2)) sc.blit(car_surf, car_rect) pygame.display.update()

После выполнения программы увидим в центре окна изображение машины: Выглядит не очень. Добавим фон в виде изображения песка:
bg_surf = pygame.image.load("images/sand.jpg") sc.blit(bg_surf, (0, 0))
Стало лучше, но белый фон у машинки явно выделяется на фоне песка. Давайте укажем Pygame, что белый цвет следует воспринимать как прозрачный:
car_surf.set_colorkey((255, 255, 255))
Теперь намного лучше. Однако, если имеется файл с альфа-каналом (прозрачным фоном), то оно будет сразу отображаться нужным образом:
finish_surf = pygame.image.load("images/finish.png") sc.blit(finish_surf, (0, 0))
Следующий важный момент, особенно при разработке динамических игр, перевод пикселей загруженных изображений в формат пикселей главной поверхности:
car_surf = pygame.image.load("images/car.bmp").convert() finish_surf = pygame.image.load("images/finish.png").convert_alpha() bg_surf = pygame.image.load("images/sand.jpg").convert()
В этом случае, перерисовка поверхностей будет выполняться быстрее. Причем, обратите внимание, изображение в формате PNG с альфа-каналом преобразуется методом convert_alpha(), а не convert(). Вообще, эти строчки равносильны следующей операции:
car_surf = pygame.image.load("images/car.bmp") car_surf = car_surf.convert()
То есть, методы convert() и convert_alpha() – это методы класса Surface, которые возвращают новую поверхность с измененным представлением пикселей. При этом прежняя поверхность остается без изменений. Например, если переписать последнюю строчку вот так:
car_surf2 = car_surf.convert()
то пиксели car_surf2 будут приведены к формату главной поверхности, а пиксели car_surf останутся прежними – без изменений.
Трансформация поверхностей
Предположим, что мы теперь хотели бы уменьшить масштаб изображения фона, чтобы песок был более мелкий. Это можно сделать с помощью модуля pygame.transform содержащий различные функции трансформации поверхностей. Подробное их описание можно посмотреть на странице официальной документации: https://www.pygame.org/docs/ref/transform.html Итак, мы воспользуемся функцией: pygame.transform.scale(Surface, (width, height), DestSurface = None) -> Surface Здесь первый параметр – преобразуемая поверхность; (width, height) – ее новые значения ширины и высоты. В нашей программе вызовем эту функцию так:
bg_surf = pygame.transform.scale(bg_surf, (bg_surf.get_width()//3, bg_surf.get_height()//3))
Мы здесь уменьшаем размеры bg_surf в три раза по обеим координатам. Теперь, при отображении песок выглядит более мелким. Давайте теперь сделаем так, чтобы машинка перемещалась при нажатии на курсорные клавиши. Для начала мы сформируем изображения машинки при движении вверх, влево, вправо и вниз:
car_up = car_surf car_down = pygame.transform.flip(car_surf, 0, 1) car_left = pygame.transform.rotate(car_surf, 90) car_right = pygame.transform.rotate(car_surf, -90)
Далее, определим переменные для хранения текущего вида машинки и ее скорости:
car = car_up speed = 5
А внутри главного цикла будем выполнять перерисовку главного окна с текущим видом и положением машинки:
while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() bt = pygame.key.get_pressed() if bt[pygame.K_LEFT]: car = car_left car_rect.x -= speed if car_rect.x 0: car_rect.x = 0 elif bt[pygame.K_RIGHT]: car = car_right car_rect.x += speed if car_rect.x > W-car_rect.height: car_rect.x = W-car_rect.height elif bt[pygame.K_UP]: car = car_up car_rect.y -= speed if car_rect.y 0: car_rect.y = 0 elif bt[pygame.K_DOWN]: car = car_down car_rect.y += speed if car_rect.y > H-car_rect.height: car_rect.y = H-car_rect.height sc.blit(bg_surf, (0, 0)) sc.blit(finish_surf, (0, 0)) sc.blit(car, car_rect) pygame.display.update() clock.tick(FPS)
- pygame.image – загрузка/сохранение изображений;
- pygame.transform – трансформация поверхностей.