Пишем игру змейка на Tkinter [Урок №7]

Создание игры на Python Tkinter

В этой части изучения Tkinter мы создадим клон игры Nibbles (змейка). Nibbles – это первоначальная версия классической змейки. Впервые ее создали в конце 70х годов. Позже она была перенесена на ПК. В этой игре игрок управляет змейкой. Цель игры – съесть как можно больше яблок. После каждого съеденного яблока тело змеи увеличивается. Во время движения змейка должна уклоняться от стен и собственного тела.

Содержание курса

  1. Создание окна по центру и кнопка выхода в Tkinter
  2. Разметка виджетов в Tkinter — pack, grid и place
  3. Виджеты Checkbutton, Label, Scale и Listbox в Tkinter
  4. Меню, подменю и панель инструментов в Tkinter
  5. Диалоговые окна в Tkinter — Выбор цвета — Выбор файла
  6. Рисуем линии, прямоугольники, круг и текст в Tkinter
  7. Пишем игру змейка на Tkinter

Содержание статьи

Этапы разработки игры на Tkinter

Размер каждого соединения змейки – 10 пикселей. Змейка управляется стрелками на клавиатуре. Изначально у змейки есть всего три соединения. Игра начинается мгновенно. Когда игра заканчивается, на экране появляется надпись «Игра Закончена».

Для начало, мы создаем Canvas виджет. Объектами в игре являются изображения. Мы используем методы canvas для создания объектов изображения. Также, мы используем методы canvas для обнаружения объектов на холсте при помощи тегов, и для обнаружения столкновений с другими объектами.

В первую очередь, мы расшифруем некоторые переменные, использующиеся в нашей игре:

  • BOARD_WIDTH и BOARD_HEIGHT обозначают размер игрового поля.
  • DELAY – скорость игры;
  • DOT_SIZE — размер яблока и соединения змейки;
  • MAX_RAND_POS – создание случайной точки для яблока.

Метод iniGame() инициализирует переменные, загружает изображения игры и запускает функцию таймера.

Метод createObject() создает объекты на холсте, а locateApple() устанавливает яблоко на случайную точку на холсте.

Мы назначаем клавиши клавиатуры при помощи метода onKeyPressed(). Для управления замеей в игре используются стрелки на клавиатуре.

В этих строчках показана загрузка наших изображений. Это три изображения для нашей игры:

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!



С помощью метода createObject() мы создаем игровые объекты на холсте. Это canvas объекты. У них есть стартовые x и y координаты.

Параметр image позволяет изображениям появиться на холсте. Параметр anchor установлен на NW (Север и Запад), что означает ориентир на верхнюю левую точку холста. И этот шаг очень важен, если мы хотим отображать изображения около границ корневого окна tkinter.

Создание игр на Python

Попробуйте удалить anchor и посмотрите, что произойдет. Параметр tag используется для идентификации объектов на холсте.

Вы можете прямо сейчас купить дешевых подписчиков на YouTube с помощью сервиса doctorsmm.com. Тут Вы найдете не только вкусный прайс, но и разнообразные критерии к каждой услуге, которые подойдут любому каналу. Кроме того, Вы можете получить большинство услуг со стабильной гарантией качества и защитой от списаний.

Один тег может использоваться для нескольких объектов на холсте.

Метод checkAppleCollision() позволяет нам узнать, съела ли змея яблоко или нет. Если да, мы добавляем одно соединение змейке и выполняем метод locateApple() для создания нового яблока на нашей игровой карте.

Метод find_withtag() позволяет нам найти объект на холсте, используя имя данного тега.

Нам нужно два объекта: голова змеи и яблоко.

Стоит отметить, что даже если присутствует только один объект с указанным тегом, метод вернет кортеж. Это для случая с объектом яблока. Позже объект яблока станет доступен следующим образом: apple[0].

Метод bbox() возвращает точки границ объекта. С помощью метода find_overlapping() мы найдем столкновение объектов с этими координатами.

Если яблоко сталкивается с головой змеи, то мы создаем новое соединение для змейки на координатах яблока. Также, мы выполняем метод locateApple(), который удаляет старое яблоко из холста и создает новое в случайной точке на игровой карте.

Метод moveSnake() устанавливаем механизм управлениями змеей через клавиатуру. Чтобы понять, нужно посмотреть на то, как двигается змейка. Мы управляем ее головой. Мы можем изменить ее направление при помощи клавиш стрелок на клавиатуре. Остальные соединения двигаются за головой как одна единая цепочка, прямо как блокчейн на python который мы создали в другой статье.

Этот код позволяет соединениям (туловище змеи) двигаться одной цепью.

Этот код меняет направление движения головы змеи. Значение атрибутов класса self.moveX и self.moveY меняются после каждого нажатия по стрелкам клавиатуры для изменения траектории движения змеи.

С помощью метода checkColission() мы определяем, когда змея удариться головой об свой хвост либо об стену.

Игра заканчивается, если голова змеи ударяется об свой хвост.

Игра заканчивается, если змея ударяется о край игрового поля.

Метод locateApple() устанавливает новое яблоко в случайной точке на холсте и удаляет старое яблоко с игровой карты.

В этой части кода мы находим и удаляем яблоко, которое было съедено змейкой.

Мы получаем случайное число от 0 до MAX_RAND_POS — 1

Здесь мы устанавливаем x и y координаты объекта яблока.

В методе onKeyPressed(), мы реагируем на какие клавиши нажал игрок.

Если мы нажали на стрелку влево, то обновляем значения из атрибутов self.moveX и self.moveY в соответствии с положением змеи на карте. Эти атрибуты используется в методе moveSnake(), который изменяет координаты объекта змеи. Стоит отметить, что если змея поворачивается направо, мы не можем сразу же развернуться влево.

После каждого DELAY запускается метод onTimer(). Если мы в игре, мы запускаем три метода, которые являются основой логики игры. В противном случае игра заканчивается.

Таймер основан на методе after(), который запускает метод после DELAY только однажды. Чтобы повторно запускать таймер, мы рекурсивно запускаем метод onTimer().

Метод drawScore рисует счет игры на нашей игровой карте в верхнем левом углу.

Если игра закончена, мы удаляем все объекты на холсте. Затем мы выводим по центру экрана финальный счет игрока.

Tkinter Игра

В этой части мы разобрали простую компьютерную игру «змейка», созданную в Tkinter.