Игра змейка в Tkinter [Урок №7]

автор

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

Разработка

Размер каждого соединения змейки – 10 пикселей. Змейка управляется стрелками на клавиатуре. Изначально у змейки есть всего три соединения. Игра начинается мгновенно. Когда игра заканчивается, на экране появляется надпись «Game Over». Чтобы создать игру, мы создаем виджет Canvas. Объектами в игре являются изображения. Мы используем методы canvas для создания объектов изображения. Также, мы используем методы canvas для обнаружения объектов на холсте при помощи тегов, и для обнаружения столкновений.

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

  • WIDTH и HEIGHT обозначают размер игрового поля.
  • DELAY – скорость игры.
  • DOT_SIZE — размер яблока и соединения змейки.
  • ALL_DOTS – максимальное количество точек (соединений змейки и яблок) на игровом поле.
  • RAND_POS – создание случайной точки для яблока.

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

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

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

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

С помощью метода createObject() мы создаем игровые объекты на холсте. Это объекты холста. У них есть стартовые x и y координаты. Параметр image позволяет изображениям появиться на холсте. Параметр anchor установлен на NW (Север и Запад), что означает ориентир на верхнюю левую точку холста. И этот шаг очень важен, если мы хотим отображать изображения около границ корневого окна. Попробуйте удалить anchor и посмотрите, что произойдет. Параметр tag используется для идентификации объектов на холсте.

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

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

Метод find_withtag() позволяет нам найти объект на холсте, используя этот тег. Нам нужно два объекта: голову змеи и яблоко. Стоит отметить, что даже если присутствует только один объект с указанным тегом, метод вернет кортеж. Это для случая с объектом яблока. Позже объект яблока станет доступен по пути: apple[0].

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

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

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

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

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

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

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

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

Здесь мы устанавливаем x и y координаты объекта яблока.
Метод onKeyPressed(), применяемы на классе Board (игрового поля), позволяет нам определить, какие клавиши были нажаты.

Если мы нажали на левый курсор, переменная «лево» изменяется на True. Эта переменная используется в методе doMove(), который изменяет координаты объекта змеи. Стоит отметить, что если змея поворачивается направо, мы не можем сразу же развернуться влево.

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

Если игра закончена, мы удаляем все объекты на холсте. Затем мы выводим на холсте «Game Over» в центре экрана.


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

Вам может быть интересно

Scroll Up