Введение
Программирование развивает креативность, логическое мышление, а также навыки поиска и устранения ошибок. Программист может создавать что-то из ничего, пользуясь логикой для составления понятных компьютеру программных конструкций, а если что-то пойдет не так, он отыщет ошибку и исправит проблему. Писать программы — занятие увлекательное и временами непростое, однако полученный опыт пригодится и в школе, и дома (даже если ваша профессия не будет связана с компьютерами).
Ну и, по меньшей мере, программирование — отличный способ скоротать время, когда за окном непогода. Python — простой в изучении язык программирования, он особенно хорош для начинающих. В отличие от многих других языков, Python-код легко читается, а интерактивная оболочка позволяет вводить программы и сразу же получать результат. Помимо простой структуры языка и интерактивной оболочки, в Python есть инструменты, заметно ускоряющие обучение и позволяющие создавать несложные анимации для своих видеоигр. Один из таких инструментов — специально созданный для обучения модуль turtle, который имитирует ≪черепашью графику≫ (в 1960-х годах она использовалась в языке Logo). Другой инструмент — модуль tkinter для работы с графической библиотекой Tk, позволяющей создавать программы с продвинутой графикой и анимацией.
Актуальность. Обусловлена тем, что прогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов – языков программирования. Существуют множество сред программирования, которые предназначены для выполнения конкретных задач. Python гораздо легче, чем все традиционные языки программирования Паскаль, Бейсик, Си и т. д. Эта программа разрабатывалась как новая учебная среда для обучения школьников программированию.
Объект исследования: язык программирования Python.
Предмет исследования: программная среда Python .
Цель исследования: исследовать возможности среды Python для создания игр и мультипликаций.
Задачи:
Изучить среду программирования Python, ее возможности и характеристики, уточнить особенности программирования на Python;
Рассмотреть потенциал программирования на Python, при создании игр;
Создать собственные проекты;
Провести анализ полученных результатов.
Гипотеза: Программирование одна из сложных тем в информатике, но эти сложности можно легко преодолеть создавая компьютерные игры в среде программирования Python не прибегая к программированию на языках высокого уровня
Глава 1. Теоретическое обоснование исследования
Среда программирования Python
Python (в русском языке распространено название пито́н) — высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций. Язык обладает чётким и последовательным синтаксисом, продуманной модульностью и масштабируемостью, благодаря чему исходный код написанных на Python программ легко читаем.
Python — активно развивающийся язык программирования, новые версии с добавлением и изменением языковых свойств выходят примерно раз в два с половиной года. Он находит применение во множестве сфер человеческой деятельности [2].
Python – не самый «молодой» язык программирования, но и не слишком старый. К моменту его создания уже существовали такие языки как «Паскаль» или «Си». А потому при создании «питона» авторы старались взять лучшее из различных платформ для разработчиков. Фактически Python представляет собой своеобразный «джем» удачных решений более чем из 8 различных языков.
Питон поддерживает практически все распространенные операционные системы. Он может прекрасно работать на карманных компьютерах, так и на больших серверах. В случае если платформа значительно устаревает, она исключается из поддержки ядра. К примеру, версии языка, начиная от 2.6, уже не работают с платформами Windows 95, 98 и ME. В случае необходимости можно воспользоваться более старыми версиями, отказавшись от применения современных инструментов языка. И тогда приложение будет работать, в том числе с этими ОС.
Python относится к наиболее востребованным и популярным языкам программирования, о чем свидетельствуют многочисленные рейтинги и анализ предложений на рынке разработки программных продуктов. Он достаточно прост, а потому изучение языка не займет слишком много времени.
При запуске Python появляется окно интерпретатора Python Shell. Оно переводит понятный человеку код в машинный язык, то есть в код, который может выполнить процессор устройства. Здесь находятся вкладки «Файл», «Редактировать», «Отлаживать», «Опции», «Окно», «Помощь». Для созданий программ необходимо зайти во вкладку «Файл» и создать новый файл. Перед нами откроется окно, в котором мы будем писать код. После написания программы она будет исполняться в Python Shell.
Для создания программ часто необходимы дополнительные функции. Для этого существуют специальные библиотеки. Библиотеки могут использоваться для создания оконных приложений с кнопками, картинками и так далее. Существуют специальные библиотеки для создания игр. Некоторые из них встроены в Python, некоторые нужно скачивать отдельно.
1.2. Язык программирования Python: плюсы, минусы, сфера применения. Каким языком является Python?
Плюсы Python: Python является интерпретируемым языком программирования, который не компилируется. Таким образом, до запуска он представляет собой обычный текстовый файл. Соответственно, программировать можно почти на всех платформах, а сам язык логичен и хорошо спроектирован.
Кода в нём меньше, чем при использовании других языков программирования, поэтому разработка осуществляется быстрее. Вот, например, как выглядит код вывода текста "Hello, Otus!" на языке программирования Java:
class Main {
public static void main(String[] args) {
System.out.println("Hello, Otus!");
}
}
В Python же для выполнения той же самой задачи достаточно всего одной строчки: print("Hello, Otus!")
В том числе и поэтому считается, что Python хорошо подходит для новичков.
Как применяют Python?
Как уже было сказано выше, Python универсален, поэтому его используют и в вебе, и на мобильных девайсах, и в приложениях, связанных с Machine learning, нейронными сетями и искусственным интеллектом. Но давайте обо всём по порядку.
Веб-разработка на Python
Сегодня Python довольно часто применяют в веб-разработке. Для работы используют такие фреймворки, как Django, Flask, Pyramid, Pylons, TurboGears, CherryPy. Кроме того, для создания сайтов на языке программирования Python существуют специальные движки: • Saleor; • Wagtail; • Abilian SBE; • Ella; • Django-CMS.
Ещё на языке Python нередко пишут парсеры, предназначенные для сбора информации в сети Интернет. К примеру, в компании Google язык Python используют для индексации сайтов.
Программные приложения на Python
С помощью языка Python можно создавать и десктопные программы. Вот примеры программ: • GIMP — визуальный Linux-редактор; • Ubuntu Software Center — центр приложений в операционной системе Ubuntu; • BitTorrent до 6-й версии включительно — менеджер торрент-закачек (сейчас программу переписали на C++); • Blender — приложение для создания графики 3D.
Мобильные приложения на Python
Не менее популярна и мобильная разработка на языке программирования Python. Да, для Android обычно пишут на Java/C++/C#, а для iOS используют Swift/Objective-C. Но если речь идёт о программировании серверной части мобильных приложений, то тут нередко используют Python. Допустим, тот же Instagram-клиент для iOS пишется на Objective-C, зато сервер — на Python.
Игры на Python
Много компьютерных игр либо полностью, либо частично написаны на языке Python. Бытует мнение, что данный язык не очень подходит для серьёзных проектов, однако на деле он применялся при разработке следующих хитов: • World of Tanks; • Battlefield 2; • Civilization IV; • EVE Online.
Но несмотря на возможность реализовать пользовательский интерфейс и работу с графикой, на языке программирования Python чаще всего пишут скрипты запуска сцен, взаимодействия персонажей, обработки событий.
Встроенные системы
На языке Python программируют встроенные системы для разных устройств. К примеру, язык пригодился «Сбербанку» для управления банкоматами.
Есть и другие успешные проекты: • The Owl Embedded Python System; • Raspberry Pi; • Python Embedded Tools; • Embedded Python.
Кроме того, Python используется во встроенном промышленном ПО на станках с ЧПУ, на телекоммуникационном оборудовании, а также при работе со средствами автоматического регулирования давления, температуры, расхода жидкостей и пр.
Создание скриптов на Python
Мы уже говорили про скрипты на Python. Речь идёт о написании плагинов и скриптового кода к уже готовым программам, то есть, когда нужно создать дополнительные модули или реализовать какую-нибудь логику. Такие скрипты встраивают в ПО, написанное на других языках программирования, чтобы автоматизировать определённые задачи.
Системное администрирование на Python
Системные администраторы используют Python для автоматизации задач. Это простой и мощный язык, поддерживающий специальные пакеты, повышающие его эффективность. Главный плюс заключается в том, что Python инсталлирован на все серверы с Linux по умолчанию.
Научные исследования на Python
Для Python есть ряд библиотек, которые применяются при выполнении вычислений и исследований: • SciPy; • NumPy; • Matplotlib. Благодаря наличию специализированных библиотек, а также простоте освоения, многие учёные (физики, математики, биологи) выбирают именно этот язык.
Python считается наиболее востребованным языком в Data Science. С его помощью пишут алгоритмы ML-программ и аналитические приложения. Также с его помощью обслуживают облачные сервисы и хранилища данных.
Тестирование на Python
Наряду с Java, язык программирования Python широко используется для автоматизации тестирования.
Минусы языка программирования Python
Несмотря на множество плюсов (простота, лаконичность, универсальность), у языка есть и минусы. 1. Программы на Python считают недостаточно быстрыми. Для сравнения: софт для iOS, написанный на языке Swift, может работать в 8 раз быстрее, чем на Python. Также Python — не очень подходящее решение для задач, которые требуют большого объёма памяти, — такие задачи лучше решать с помощью C либо C++. 2. Высокий уровень зависимости от системных библиотек. В результате затрудняется перенос на другие системы. Да, проблема решается посредством Virtualenv, однако у этого инструмента свои недостатки: костыли, избыточность полных методов изоляции, дублирование системных библиотек. 3. Global Interpreter Lock не даёт возможности одновременно исполнять несколько потоков Python в реализации CPython. Но GIL мы можем на какое-то время отключить, как это реализовано в математическом пакете NumPy.
1.3. Программирование в Python на примере игры
Перед созданием игры (или другой программы) полезно наметить план
действий. Он должен содержать описание игры, ее основных элементов и персонажей. Когда дело дойдет до программирования, план поможет сосредоточиться на цели разработки. А результат может и не совпадать с изначальным планом.
Приступим к созданию забавной игры «Человечек спешит к выходу».
План игры про человечка
Человечек очутился в плену у злодея, и ваша задача —помочь человечку спастись, добравшись до выхода на верхнем этаже.
Человечек выглядит как фигурка, которая может двигаться вправо, влево, а также прыгать. На этажах расположены платформы, на которые человечку предстоит запрыгивать.
Цель игры — добраться до двери выхода.
Создаем изображения для игры
Мы установили графический редактор — пора рисовать. Создадим изображения для следующих игровых элементов:
человечка, который может двигаться вправо, влево и прыгать;
Stickman — человечек, нарисованный линиями платформ трех разных размеров;
двери — открытой и закрытой;
фона (если мы хотим, чтобы игра выглядела красиво, сплошной белый или серый фон нам не подходит).
Начнем с главного класса игры (назовем его Game), который будет управлять другим кодом. В классе Game будет функция __init__ для инициа-
лизации игры, а также главный цикл игровой анимации. В начале функции __init__ зададим текст заголовка окна и создадим холст. Откройте окно редактора, введите следующий код и сохраните файл под именем stickmangame.py (он должен находиться в папке stickman).
from tkinter import *
import random
import time
class Game:
Game — игра
self.tk = Tk()
self.tk.title("Человечек спешит к выходу")
self.tk.resizable(0, 0)
self.tk.wm_attributes("-topmost", 1)
self.canvas = Canvas(self.tk, width=500, height=500, \
highlightthickness=0)
self.canvas.pack()
self.tk.update()
self.canvas_height = 500
self.canvas_width = 500
В первой части кода (от tkinter import * до self.tk.wm_attributes) создаем объект tk и с помощью self.tk.title устанавливаем заголовок окна (≪Человечек спешит к выходу≫). Вызываем функцию resizable, чтобы задать фиксированный размер окну, и размещаем его поверх остальных окон с помощью функции wm_attributes. Создаем холст (self.canvas = Canvas) и вызываем функции pack и update объекта tk. Кроме того, для класса Game нужны два свойства —height, где будет храниться высота холста, и width, куда сохраним его ширину.
Создаем функцию mainloop
Функция mainloop класса Game будет управлять игровой анимацией.
Введитетакойкод:
for x in range(0, 5):
for y in range(0, 5):
self.canvas.create_image(x * w, y * h, \
image=self.bg, anchor='nw')
Main loop —
основнойцикл
self.sprites = []
self.running = True
def mainloop(self):
while 1:
if self.running == True:
for sprite in self.sprites:
sprite.move()
self.tk.update_idletasks()
self.tk.update()
time.sleep(0.01)
Со строки начинается цикл while, который будет работать до закрытия окна игры. В строке проверяем: свойство running равно True? Если да, в строке перебираем в цикле все спрайты из списка sprites (self.sprites), вызывая для каждого из них функцию move (сейчас этот код бесполезен, ведь мы еще не добавили в список ни одного спрайта, но позднее он нам пригодится). Последние три строки кода, начиная со строки, нужны для принудительной перерисовки экрана с помощью объекта tk, после чего делается пауза на сотую долю секунды — так же, как в игре. Чтобы запустить код, добавляем в программу еще две строчки и сохраняем файл:
g = Game()
g.mainloop()
Создаемкласс Coords
Создадим класс, который пригодится для размещения спрайтов на экране. В объектах этого класса будут храниться позиции всех графических
элементов в игре, то есть координаты левого верхнего угла (x1 и y1) и правого нижнего угла (x2 и y2) для каждого из спрайтов. Задать позицию изображения с помощью этих координат можно так: Назовем наш новый класс Coords; в нем будет одна лишь функция __init__, принимающая четыре аргумента (x1, y1, x2 и y2). Вот код, который следует добавить в начало файла stickmangame.py:
Coords —
от coordinates —
координаты
class Coords:
def __init__(self, x1=0, y1=0, x2=0, y2=0):
self.x1 = x1
self.y1 = y1
self.x2 = x2
self.y2 = y2
Сохраняем каждый аргумент в свойстве с таким же именем (x1, y1, x2, и y2). Объекты класса Coords уже очень скоро нам понадобятся. Создаем класс Sprite Класс-предок всех игровых объектов будет называться Sprite (спрайт), и в его составе будет две функции: move — для перемещения спрайта, и coords, возвращающая текущую позицию спрайта на игровом экране.
Воткодкласса Sprite:
class Sprite:
def __init__(self, game):
self.game = game
self.endgame = False
self.coordinates = None
def move(self):
pass
def coords(self):
return self.coordinates
Инициализация спрайта
Функция __init__ класса, представляющего спрайт человечка, будет
примерно такой же, как и у остальных классов в игре. Первым делом дадим новому классу (который также будет потомком класса Sprite) имя — StickFigureSprite. class StickFigureSprite(Sprite):
def __init__(self, game):
Sprite.__init__(self, game)
Этот код напоминает код класса PlatformSprite , однако здесь мы не передаем в функцию __init__ другие аргументы, кроме self и game, ведь в отличие от множества платформ, объект класса StickFigureSprite будет в игре один. Для этого и предназначены несколько следующих строк функции __init__. В них загружаются три изображения фигурки, развернутой влево, и три изображения фигурки, развернутой вправо. Вотэтистроки:
class StickFigureSprite(Sprite):
def __init__(self, game):
Sprite.__init__(self, game)
self.images_left = [
PhotoImage(file="figure-L1.gif"),
PhotoImage(file="figure-L2.gif"),
PhotoImage(file="figure-L3.gif")
]
self.images_right = [
PhotoImage(file="figure-R1.gif"),
PhotoImage(file="figure-R2.gif"),
PhotoImage(file="figure-R3.gif")
]
self.image = game.canvas.create_image(200, 470, \
image=self.images_left[0], anchor='nw')
Привязка к нажатиям клавиш
В последних строках функции __init__ с помощью функции bind_all
привяжем нажатие нужных нам клавиш к вызовам соответствующих функций.
self.jump_count = 0
self.last_time = time.time()
self.coordinates = Coords()
game.canvas.bind_all('<KeyPress-Left>', self.turn_left)
game.canvas.bind_all('<KeyPress-Right>', self.turn_right)
game.canvas.bind_all('<space>', self.jump)
Чтобы фигуркой можно было управлять, необходимо создать функ-
ции turn_left (повернуть налево), turn_right (повернуть направо) и jump (прыгать). Привязываем клавишу-стрелку «влево» (<KeyPress-Left>) к вызову функции turn_left, клавишу-стрелку «вправо» (<KeyPress-Right>) — к вызову функции turn_right, а клавишу «пробел» (<space>) —к функции jump.
Поворот фигурки вправо и влево
Функции turn_left и turn_right проверяют, что фигурка не находится в прыжке и не падает (в нашей игре нельзя менять направление во время прыжка), и если это так, задают свойству x значение, которое соответствует движению влево (turn_left) или вправо (turn_right):
game.canvas.bind_all('<KeyPress-Left>', self.turn_left)
game.canvas.bind_all('<KeyPress-Right>', self.turn_right)
game.canvas.bind_all('<space>', self.jump)
def turn_left(self, evt):
if self.y == 0:
self.x = -2
def turn_right(self, evt):
if self.y == 0:
self.x = 2
При нажатии клавиши-стрелки ≪влево≫ Python будет вызывать функ-
цию turn_left, передавая в нее объект, содержащий информацию о событии (аргумент evt).
Прыжок фигурки
Функция для прыжка называется jump, она очень похожа на функции
turn_left и turn_right.
def turn_right(self, evt):
if self.y == 0:
self.x = 2
def jump(self, evt):
if self.y == 0:
self.y = -4
self.jump_count = 0
Анимация фигурки
У нас уже есть класс для фигурки, который загружает нужные изображения и привязывает нажатие клавиш к некоторым функциям. Запустив игру сейчас, ничего интересного мы не увидим. Пора добавить в класс StickFigureSprite функции animate, move и coords. Функция animate будет отображать различные кадры анимации фигурки, move — определять, куда фигурка должна переместиться, а coords — возвращать ее текущую позицию (в отличие от платформ, позицию человечка нужно будет пересчитывать по мере его движения по экрану). Введем код функции animate по частям. В первой части кода будем проверять, куда движется фигурка — влево или вправо, затем с помощью свойства last_time (в последний раз) определим, пора ли переходить к следующему кадру анимации (свойство last_time помогает контролировать скорость чередования кадров). Располагаться функция animate будет после функции jump.
def jump(self, evt):
if self.y == 0:
self.y = -4
self.jump_count = 0
def animate(self):
if self.x != 0 and self.y == 0:
if time.time() - self.last_time > 0.1:
self.last_time = time.time()
self.current_image += self.current_image_add
if self.current_image >= 2:
self.current_image_add = -1
if self.current_image <= 0:
self.current_image_add = 1
Перемещение фигурки по экрану
Последняя из функций класса StickFigureSprite — move — отвечает за перемещение человечка по холсту, а также обрабатывает столкновения фигурки с другими объектами или границами экрана. Начало функции move. Вот первая часть функции move. Этот код должен располагаться после функции coords:
def coords(self):
xy = self.game.canvas.coords(self.image)
self.coordinates.x1 = xy[0]
self.coordinates.y1 = xy[1]
self.coordinates.x2 = xy[0] + 27
self.coordinates.y2 = xy[1] + 30
return self.coordinates
def move(self):
self.animate()
if self.y < 0:
self.jump_count += 1
if self.jump_count > 20:
self.y = 4
if self.y > 0:
self.jump_count -= 1
Дверь и конец игры
Теперь нужно изменить код функции move класса StickFigureSprite —ту его часть, которая обрабатывает столкновения со спрайтами справа и слева. Вотпервоеизменение:
if left and self.x < 0 and collided_left(co, sprite_co):
self.x = 0
left = False
if sprite.endgame:
self.game.running = False
Проверяем, содержит ли свойство endgame спрайта, с которым фигурка столкнулась левой стороной, True. Если это так, даем свойству running значение False (фигурка добралась до двери, и игру нужно завершить).Добавим в код, проверяющий столкновение справа, эти же строки:
if right and self.x > 0 and collided_right(co, sprite_co):
self.x = 0
right = False
if sprite.endgame:
self.game.running = False
Заключение
В результате исследования выяснилось, что Python, выполненные с целью создания игры, могут быть сделаны самими учащимися для демонстрации на занятиях, проведения исследований, поиска ответов на поставленные вопросы.
Цель нашего исследования была достигнута: среда Python позволяет создавать свои проекты. При создании скриптов в Python не требуется написания текстов программ на формализованных языках программирования, так как здесь предоставлены все необходимые графические средства для изображения данных и структур управления. Совмещая графические блоки, можно создать программу и запустить ее на выполнение в той же среде Python.
Все поставленные задачи в начале нашего исследования были выполнены: изучены возможности и потенциал среды Python; созданы собственные проекты.
В результате проделанной работы гипотеза подтвердилась, в итоге осуществленного экспериментального исследования было установлено, что среда Python располагает всеми возможностями для самостоятельного созданиякомпьютерных игр.
Используя Python, научились выбирать интересные для нас направления работы, формулировать свои идеи, воплощать их в жизнь, делиться результатами. И на этом наша работа ещё не закончена. За кажущейся простотой Python скрываются возможности, которые необходимо использовать и в старшихклассах, продолжим свою работу, придумывая сценарии и будем создавать другие компьютерные игры.
При создании игры в Python не требуется написания текстов программ на формализованных языках программирования, так как здесь предоставлены все необходимые графические средства для изображения данных и структур управления.
Одним из самых трудных этапов реализации проекта считаю этап работы со скриптами движения и управления героев, а также выбор сценария, так как хотелось создать полезную и развивающую игру.
Использование шаблонов картинок и звуков из существующих библиотек, создание собственных файлов, выполнение таких операций с файлами проектов, как Сохранить, Открыть, Создать, позволило мне быстро освоить работу с файловой системой и стандартными приложениями.
Основываясь на вышеперечисленном, считаем, что создание данной игры в среде Python возродит интерес к программированию, а также привлечёт учащихся к изучению современных технологий и воспитает любовь и заботу к природе.
Список литературы
https://drive.google.com/file/d/0ByXHP1ktMKJaSFJVS3cxRmYwb00/view
Великович Л., Цветкова М. Программирование для начинающих. – М.: Бином, 2007
Python для детей. Самоучитель по программированию / Джейсон Бриггс ; пер. с англ. Станислава Ломакина ; [науч. ред. Д. Абрамова]. — М. : Манн, Иванов и Фербер, 2017. — 320 с.