Как сделать змейку на python
Создание игры "Змейка в лабиринте" с помощью программы Python. Программное заполнение игрового поля элементами: ограждениями, фруктами. Разработка модуля взаимодействия программных продуктов в игре. Программный код управления змейкой в лабиринте.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 10.12.2015 |
Размер файла | 682,6 K |
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Студента 2 курсу
Силина Евгения Леонидовича
Snake (Питон, Удав, Змейка и др.) -- компьютерная игра, возникшая в середине или в конце 1970-х.
Игрок управляет длинным, тонким существом, напоминающим змею, которое ползает по плоскости (как правило, ограниченной стенками), собирая еду (или другие предметы), избегая столкновения с собственным хвостом и краями игрового поля. В некоторых вариантах на поле присутствуют дополнительные препятствия. Каждый раз, когда змея съедает кусок пищи, она становится длиннее, что постепенно усложняет игру. Игрок управляет направлением движения головы змеи (обычно 4 направления: вверх, вниз, влево, вправо), а хвост змеи движется следом. Игрок не может остановить движение змеи.
Первой игрой этого плана был игровой автомат Hustle, выпущенный фирмой Gremlin в 1977 году. Одна из первых реализаций на домашнем компьютере была сделана в 1979 году на компьютере TRS-80, автор F. Seger (Германия). Вскоре после неё вышла версия для Commodore VIC-20, под названиемWorms. Микрокомпьютерная версия игры Hustle была выпущена Milton Bradley для компьютера TI-99/4A в 1980 году. Версии игры существовали и на многих советских компьютерах, например -- на Радио 86РК.
В число известных вариантов Питона входит игра Nibbles, некоторое время входившая в комплект MS-DOS.
Трёхмерная версия Питона существует для телефона Nokia и последующих телефонов Nokia.
Несмотря на довольно долгую историю, змейка до сих пор популярна. Чаще всего змейка распространяется на телефонах (обычно на Nokia). В большинстве случаев эта игра популярна, поскольку оказывается единственной предустановленной на устройстве.
В змейку можно поиграть на YouTube. Для этого надо поставить видео на паузу и нажать клавиши влево и вверх.
1. Постановка задачи
Позволяющий управлять объектом в данном лабиринте. При каждом съедании объекта змейка увеличивается и насчитываются очки.
Для этого необходимо изучить принципы работы с программным продуктом Python.
При первом переходе в состояние игры должно происходить заполнения игрового поля элементами: ограждениями, фруктами, частями змейки. Процесс игры будет представлять собой управление змейкой при помощи клавиатуры. Если змейка натыкается на ограждение или на саму себя, то игра заканчивается.
Если же она съедает фрукт, то происходит увеличение длины змеи и уменьшением интервала обновления поля (увеличивается скорость перемещения).
2. Обзор инструментов
2.1 Описание программы
Python широко применяется как интерпретируемый язык для скриптов различного назначения.
Python имеет целью приблизить синтаксис реальной программы, написанной на нём, к описывающему задачу псевдокоду, что позволяет программисту уменьшить объём программы. Идея создания данного языка возникла в конце 1980-х и была реализована Гвидо ван Россумом.
Элегантный дизайн и эффективный, дисциплинирующий синтаксис этого языка облегчают программистам совместную работу над кодом. Python - мультипарадигмальный язык программирования: он позволяет совмещать процедурный подход к написанию кода с объектно-ориентированным и функциональным:
- довольно прост в изучении ,особенно на начальном этапе;
- особенности синтаксиса стимулируют программиста писать хорошо читаемый код;
- предоставляет средства быстрого прототипирования и динамической семантики;
- имеет большое сообщество, позитивно настроенное по отношению к новичкам;
- множество полезных библиотек и расширений языка можно легко использовать в своих проектах благодаря предельно унифицированному механизму импорта и программным интерфейсам;
- механизмы модульности хорошо продуманы и могут быть легко использованы;
- абсолютно всё в Python является объектами в смысле ООП, но при этом объектный подход не навязывается программисту.
- не слишком удачная поддержка многопоточности;
- на Python создано не так уж много качественных программных проектов по сравнению с другими универсальными языками программирования, например, с Java;
- отсутствие коммерческой поддержки средств разработки (хотя эта ситуация со временем меняется);
- изначальная ограниченность средств для работы с базами данных;
- бенчмарки показывают меньшую производительность Python по сравнению с основными Java VM, что создаёт этому языку репутацию медленного.
Проекты с использованием Python:
- Linux Weekly News;
Интерпретатор python можно использовать как для запуска скриптов, так и в режиме интерактивной оболочки.
Наберите в командной строке:
чтобы получить приглашение интерпретатора:
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Теперь можно набрать строку на языке Python и нажать Enter, чтобы выполнить её:
>>> print "Put some text here"
Put some text here
2.2 Сравнение продуктов
Наверняка многие ещё не успели забыть, что когда-то телефоны Nokia выходили с предустановленной игрой "Змейка", которая пользовалась в своё время огромной популярностью у владельцев телефонов компании.
С течением лет для смартфонов выходили самые разнообразные модификации этой игры, но их попросту нельзя было сравнить с оригиналом. Однако теперь программист Танели Армандо, занимавшийся разработкой игр для старых телефонов Nokia, пообещал воссоздать знаменитую игру для современных смартфонов с учётом тех изменений, которые произошли с телефонами за всё это время.
Итак, игра получит название Dubbed Snake Rewind и по сути будет являться оригинальной версией "Змейки", которая когда-то предустанавливалась на устройства от Nokia. Но в отличие от старой версии, эта будет оснащена более современной графикой и большим количеством нововведений, например, возможностью усилить мощность змейки и оживить её в случае проигрыша.
Всего в игре будет 10 уровней, каждый из которых будет иметь свой уникальный внешний вид и звуковое сопровождение. Открыть каждый последующий уровень можно будет, выполнив определённые миссии, или же совершив встроенную покупку.
Все змейки отличаются своим фоном ,формой и дополнительными бонусами.
2.3 Улучшение продукта
Разработка модуля взаимодействия программных продуктов
Требования к интерфейсу
8 пунктов, которые просто необходимы хорошему интерфейсу:
Давайте расмотрим все пункты.
1.Доходчивость - самый важный элемент дизайна интерфейса пользователя. В действительности единственным назначением интерфейса является организация возможности для посетителей взаимодействовать с вашей системой с помощью содержания и функций. Если люди не могут догадаться, как работает Ваше приложение или куда надо двигаться , они будут сбиты с толку и разочарованы.
Доходчивость интерфейса - замечательная функция, однако следует соблюдать осторожность, чтобы не попасть в ловушку перегруженности информацией. Очень просто добавлять описания и объяснения. Если добавить слишком много объяснений, то пользователь будет вынужден проводить много времени за чтением инструкций. Делайте Ваш интерфейс доходчивым, но сохраняйте лаконичность. Если есть возможность уложить объяснение в одно предложение вместо трех, сделайте это. Одновременное сохранение доходчивости и лаконичности - очень непростая задача. Но результат стоит усилий.
Многие дизайнеры стремятся сделать интерфейс интуитивным. А что значит интуитивность в действительности? Это значит, что что-то может быть распознано и понято инстинктивно и естественно. А как можно сделать что-то интуитивным? Сделайте это похожим. Похожесть - это что-то такое же, как то, что Вы уже встречали ранее. Если Вы видите что-то одно похожее на другое, то Вы знаете как оно действует, Вы знаете что можно ожидать. Выделите объекты, которые похожи для Ваших пользователей и интегрируйте их в Ваш интерфейс.
Восприимчивость подразумевает два пункта. Первый, короткое время отклика. Интерфейс, если за ним нет программного обеспечения, должен работать быстро. Ожидание загрузки и использование медленного и инертного интерфейса приводит к разочарованию. Возможность видеть элементы интерфейса быстро (даже если контент еще не полностью загружен) значительно улучшает удовлетворенность пользователей.
Восприимчивость также означает, что интерфейс выдает некоторую форму обратной связи на действия пользователя. Посетителя надо информировать о том, что происходит. Нажатие на кнопку было воспринято системой? Как об этом можно узнать? Кнопка должна отобразить состояние "нажата", чтобы пользователь увидел реакцию на свои действия.
Последовательность интерфейса позволяет пользователю развивать шаблоны использования проекта - они изучают различные кнопки, закладки, иконки и другие элементы интерфейса, распознают их при последующей работе и быстрее начинают использовать в другом контексте. Также пользователи изучают, как работают определенные функции, и экстраполируют свой предыдущий опыт на новые области.
Может быть, данный пункт противоречит всему выше сказанному, но хороший интерфейс должен быть привлекательным. Привлекательным в том смысле, что его использование доставляет удовольствие. Да, Вы можете сделать пользовательский интерфейс очень простым, легким в использовании, эффективным и восприимчивым, и он будет великолепно справляться с возложенными на него функциями. Но можно сделать еще один шаг вперед и придать интерфейсу привлекательность, так чтобы его использование доставляло истинное наслаждение. Когда Ваше программное обеспечение имеет привлекательный интерфейс, ваши пользователи и персонал не просто используют его - они предвкушают работу с ним. Конечно, существуют различные типы программного обеспечения и сайтов, предназначенные для разных рынков и аудиторий. То, что для одних выглядит хорошо, является плохим для других. Это означает, что следует разрабатывать внешний вид и функциональность для своей аудитории. Также эстетика должна использоваться для улучшения функциональности.
Интерфейс пользователя - это машина, которая доставляет Вас туда, куда нужно. Пункты назначения - это различные функции программного обеспечения. Хороший интерфейс должен дать Вам возможность выполнить функции быстрее и с меньшими усилиями. "Эффективность" пока представляется несколько неясно - если Вы скомбинируете все описанные пункты данного определенно должен получиться эффективный интерфейс? Почти, но не совсем. Что действительно нужно, чтобы получить эффективный интерфейс, так это точно догадаться, чего хочет добиться пользователь и затем дать ему именно это без каких-либо препятствий. Вы должны определить, как Ваше приложение должно работать, какие функции необходимы, какие цели должны быть достигнуты? Реализуйте интерфес, который даст людям то, что они хотят, вместо простого предоставления доступа к списку функций.
Никто не совершенен, и люди делают ошибки, когда пользуются Вашим программным обеспечением или вэбсайтом. То, насколько хорошо контролируются такие ошибки, является очень важным индикатором качества интерфейса. Не надо заставлять паниковать пользователя - сделайте снисходительный интерфейс со средствами от ошибок. Такой интерфейс позволит Вашим пользователям избежать дорогостоящих действий. Например, если кто-то удалит важную часть информации, сможет ли он легко ее восстановить или отменить операцию? Когда кто-то приходит на отсутствующую на Вашем сайте страницу, что он увидит? Он столкнется с непонятной ошибкой или получит список альтернативных источников?
3. Описание игры
Выбор "Змейки" в качестве примера игры на Python связан, в первую очередь, с простотой ее реализации.
В данной реализации на Python игра будет иметь ряд ограничений и особенностей: Количество уровней равно 1 (от 0 до 1). В каждом уровне доступно 0 жизней. При использовании всех жизней, а также при прохождении всех уровней, происходит переход на начальный уровень. Возможно создание собственных уровней. Скорость змейки и ее максимальная длина одинаковы на каждом уровне.
Область игры состоит из четырех элементов: Заголовок игры. Используется для позиционирования области игры на графике. Перемещая заголовок, перемещаются все элементы игры.
На игровом поле располагаются: Змейка. Состоит как минимум из трех последовательно расположенных элементов - голова, тело, хвост. Голова может перемещаться влево, вправо, вверх и вниз. Все остальные элементы змейки перемещаются вслед за ее головой.
Препятствие. Представляет собой прямоугольникb, при столкновении с которым головы змейки, текущий уровень перезапускается, а количество жизней уменьшается на одну.
Предмет "еда". Ягодка, при столкновении с которой размер змейки увеличивается, а точнее увеличивается ее тело.
Информационная панель (панель состояния игры). Состоит из трех элементов:
Level. Показывает текущий уровень.
Food left over. Показывает, сколько осталось съесть ягод.
Lives. Показывает количество доступных жизней.
Панель управления. Состоит из трех кнопок:
Кнопка "Start". Запускает текущий уровень.
Кнопка "Pause". Приостанавливает игру.
Кнопка "Stop". Останавливает игру, при этом происходит переход на начальный уровень. змейка python программный игра
В результате работы разработана программа, которая позволяет управлять объектом в лабиринте , при сьедании рандомного объекта змейка увеличиваеться, при столкновении с преградой или с самим собой ,то игра завершиться.
Данный программный продукт может служить для хорошего проведения времени.
Разработанная программа обладает высокой конкурентно способностью для приложений змейка.
Подобные документы
Алгоритм поиска по первому наилучшему совпадению на графе. Основные классы для поиска пути в лабиринте. Тестирование нахождения кратчайшего пути в лабиринте. Порядок обхода вершин. Тестирование поведения программы при отсутствии пути в лабиринте.
курсовая работа [888,7 K], добавлен 19.12.2013
Особенности программирования аркадных игр в среде Python. Краткая характеристика языка программирования Python, его особенности и синтаксис. Описание компьютерной игры "Танчики" - правила игры, пояснение ключевых строк кода. Демонстрация работы программы.
курсовая работа [160,3 K], добавлен 03.12.2014
Практическое использование алгоритмов для нахождения минимального пути в лабиринте. Разработка программы на языке С++ и в среде Visual C++. Основные способы поиска пути: метод волны и приоритетов. Описание разработанных функций и инструкция пользователя.
дипломная работа [54,3 K], добавлен 16.03.2012
Разработка программы, относящейся к классу задач маршрутизации и системы принятия решения, предназначенной для выбора оптимального маршрута перемещения в лабиринте из начальной клетки в конечную, с учетом необходимости посещения определенных клеток.
контрольная работа [14,7 K], добавлен 11.11.2010
Программное обеспечение Python и ее основные характеристики, как программной среды. Общие сведения о языке программирования Python. Особенности применения ППП Python (x,y) с использованием его различных вычислительных модулей в учебном процессе.
Если вы хотите обновить Ваш сервер новыми доработками - то зайдите в наш раздел. Большой выбор готовых решений от наших пользователей
Моды для сервера
Огромный выбор различных модификаций для Вашего сервера. Пролистайте эти темы! Возможно именно там Вы найдете то, что искали уже давно.
Модификации SA
Хотите разнообразить свою игру в San Andreas? Смелее в наш раздел. Отличный сборник готовых решений. Играйте с удовольствием
Oleg Polikhronidi
Изучающий
- Класс сегмента (одного блока змейки).
- Класс змеи (по сути собрание сегментов).
- Создание графического окна приложения.
- Объявление вспомогательных глобальных переменных.
- Установка на окне области для рисования.
- Создание классов сегмента и змеи.
- Создание вспомогательных функций.
Обратите внимание, что весь остальной код должен находиться до строки root.mainloop() Объявление вспомогательных глобальных переменных.
Тут все просто, для облегчения последующей работы создадим следующие переменные:
Установка на окне области для рисования.
Область для рисования в tkinter реализована при помощи класса Canvas, им и воспользуемся.
Создание классов сегмента и змеи: Класс сегмента змейки.
Сегмент змейки будет простым прямоугольником, созданным при помощи метода create_rectangle класса Canvas модуля tkinter.
Класс змейки. Змейка у нас будет набором сегментов. У нее будут методы движения, изменения направления и добавления сегмента.
Если вы осилили эти два класса и более того, поняли что, как и почему, то поздравляю - самая трудная часть позади
Уже сейчас можно создавать змейку. Вставьте следующие строчки, но обязательно после строк c.grid()
Для начала напишем функцию создания яблок (или что там наша змея будет есть). Не забудьте импортировать модуль random, чтобы все работало
Последний шаг - правильно обработать нажатия клавиш. Привяжем метод класса Snake change_direction() к Canvas:
Вот такая у нас получилась змейка на Python. Попробуйте немного усовершенствовать игру, например, добавить счет, ускорение игры, отредактировать функцию create_block чтобы новые яблоки не появлялись на самой змейке, или реализовать систему уровней, спасибо за прочтение)
О нас
"Pawno Info" - портал о программировании номер один. Начните с нами изучать эти великолепные и бесконечные виртуальные миры. Научитесь создавать функции и скрипты используя наши уроки по программированию на различных языках. Задавайте вопросы которые Вас интересуют и получайте ответы от наших профессионалов. Будьте с нами. Будьте там, где лучшее.
Плохой код
- Динамичные объекты (к примеру, фрукт) прикреплены к файлу kv, так что вы не можете создать более одного яблока не переписав половину кода
- Чудная логика перемещения змеи вместо клетка-за-клеткой.
- 350 строк — слишком длинный код.
Статья неочевидна для новичков
Это мое ЛИЧНОЕ мнение. Более того, я не гарантирую, что моя статья будет более интересной и понятной. Но постараюсь, а еще гарантирую:
- Код будет коротким
- Змейка красивой (относительно)
- Туториал будет иметь поэтапное развитие
Результат не комильфо
Нет расстояния между клетками, чудной треугольник, дергающаяся змейка.
Первое приложение
Пожалуйста, удостовертесь в том, что уже установили Kivy (если нет, следуйте инструкциям) и запустите
buildozer init в папке проекта.
Запустим первую программу:
Мы создали виджет. Аналогично, мы можем создать кнопку или любой другой элемент графического интерфейса:
Ура! Поздравляю! Вы создали кнопку!
Файлы .kv
Однако, есть другой способ создавать такие элементы. Сначала объявим нашу форму:
Что произошло? Мы создали еще одну кнопку и присвоим id but_id. Теперь but_id ассоциировано с but2 формы. Это означает, что мы можем обратиться к button с помощью but2:
Графика
Далее создадим графический элемент. Сначала объявим его в worm.kv:
Мы связали позицию прямоугольника с self.pos и его размер с self.size. Так что теперь эти свойства доступны из Cell, например, как только мы создаем клетку, мы можем менять ее размер и позицию:
Окей, мы создали клетку.
Необходимые методы
Давайте попробуем двигать змею. Чтобы это сделать, мы можем добавить функцию Form.update и привязать к расписанию с помощью Clock.schedule.
Клетка будет двигаться по форме. Как вы можете видеть, мы можем поставить таймер на любую функцию с помощью Clock.
Далее, создадим событие нажатия (touch event). Перепишем Form:
Каждый touch_down создает клетку с координатами = (touch.x, touch.y) и размером = 30. Затем, мы добавим ее как виджет формы И в наш собственный массив (чтобы позднее обращаться к нему).
Теперь каждое нажатие на форму генерирует клетку.
Няшные настройки
Так как мы хотим сделать красивую змейку, мы должны логически разделить графическую и настоящую позиции.
Много причин делать это. Вся логика должна быть соединена с так называемой настоящей позицией, а вот графическая — есть результат настоящей. Например, если мы хотим сделать отступы, настоящая позиция будет (100, 100) пока графическая — (102, 102).
P. S. Мы бы этим не парились если бы имели дело с on_draw. Но теперь мы не обязаны перерисовать форму лапками.
Давайте изменим файл worm.kv:
Появился отступ, так что это выглядит лучше не смотря на то, что мы создали вторую клетку с X = 130 вместо 132. Позже мы будем делать мягкое передвижение, основанное на расстоянии между actual_pos и graphical_pos.
Объявление
Инициализируем config в main.py
(Поверьте, вы это полюбите!)
Затем присвойте config приложению:
Перепишите init и start:
Надеюсь, это было более менее понятно.
Давайте создадим нашего червячка.
Движение
Теперь подвигаем ЭТО.
Оно живое! Оно живое!
Управление
Как вы могли судить по первой картинке, управление змеи будет таким:
Создание фрукта
Теперь мы должны объявить несколько методов Worm:
Кстати, после того, как мы объявили gather_positions, мы можем улучшить fruit_dislocate:
На этот моменте позиция яблока не сможет совпадать с позиции хвоста
… и добавим проверку в update()
Определение пересечения головы и хвоста
Мы хотим узнать та же ли позиция у головы, что у какой-то клетки хвоста.
Раскрашивание, декорирование, рефакторинг кода
Начнем с рефакторинга.
Перепишем и добавим
Теперь если червяк мертв (заморожен), если вы нажмете на экран, игра будет начата заново.
Теперь перейдим к декорированию и раскрашиванию.
Раскрасим. Перепишем Cell in .kv:
Добавим это к Cell.__init__:
и это к Form.start
Превосходно, наслаждайтесь змейкой
Вы еще тут? Самая интересная часть впереди!
Бонус — плавное движение
Так как шаг червячка равен cell_size, выглядит не очень плавно. Но мы бы хотели шагать как можно чаще без полного переписывания логики игры. Таким образом, нам нужен механизм, который двигал бы наши графические позиции (graphical_pos) но не влиял бы на настоящие (actual_pos). Я написал следующий код:
Этот модуль не есть верх элегантности. Я признаю это решение плохим. Но это только hello-world решение.
Так, вы лишь создаете smooth.py and и копируете код в файл.
Наконец, заставим ЭТО работать!
Заменим self.worm.move() с
А это как методы Cell должны выглядить
Ну вот и все, спасибо за ваше внимание! Код снизу.
Демонстрационное видео как работает результат:
Решил написать игру "Змейка" на Pygame через спрайты (наверное была глупая идея). Изначально у змейки есть только голова. И когда она съедает яблоко,то размер змейки обновляется на долю секунды, а дальше снова будет видна одна голова. Я так же могу наткнуться на "невидимый" хвост и игра заканчивается. Вот такой код:
1 ответ 1
В коде при столкновении добавляется хвост змеи:
В классе Snake хвост змеи прописан как отрисовка блока:
В цикле игры экран заливается чёрным цветом, потом происходит отрисовка спрайтов:
Так как хвост спрайтом не является то он просто не отрисовывается. Я вижу здесь два варианта: либо добавить хвост в спрайты, либо отдельно отрисовывать хвост после заливки экрана чёрным цветом.
Читайте также: