Найти в Дзене
Артем Антонов

Пишем игру Змейка на GO для Android, iOS и ПК

Оглавление

Привет! Сегодня мы разберем, как написать классическую игру "Змейка" на языке Go с использованием фреймворка Fyne, которая будет работать на Android, iOS и ПК. Это не просто учебный пример, а полноценное приложение с современным интерфейсом и оптимизацией.

Общая структура проекта

Импорты и зависимости

Импорты
Импорты

Объяснение импортов:

  • fmt - для форматированного вывода (отображение счета)
  • image/color - работа с цветами
  • math, math/rand - математические операции и генерация случайных чисел
  • sync, sync/atomic - синхронизация потоков
  • time - работа со временем (таймеры, задержки)
  • fyne.io/fyne/v2 и подпакеты - фреймворк для создания GUI

Кастомная тема оформления

Определение цветовой палитры

Кастомная тема fyne.io
Кастомная тема fyne.io

Методы темы Fyne:

Кастомная тема fyne.io
Кастомная тема fyne.io

Каждый элемент интерфейса запрашивает свой цвет по имени. Мы переопределяем только нужные нам цвета.

Модель данных игры

Перечисление направлений

Направления движения
Направления движения

iota автоматически присваивает последовательные значения константам.

Структура состояния игры

-5

Почему atomic? Поля gameOver и score доступны из нескольких горутин одновременно. Atomic операции гарантируют, что не будет состояния гонки.

Настройки игры

Настройки
Настройки

Глобальные переменные и их назначение

Глобальные переменные
Глобальные переменные

Система команд

-8

Главная функция main()

Инициализация приложения

main.go
main.go

Создание графических элементов

main.go
main.go

Оптимизация: пул объектов

main.go
main.go

Вместо постоянного создания и удаления объектов мы используем существующие, что значительно эффективнее.

Создание интерфейса

main.go
main.go

Запуск горутин

main.go
main.go

Игровой цикл (gameLoop)

Главный игровой цикл
Главный игровой цикл

Важность фиксированного шага времени: Игра должна работать с одинаковой скоростью независимо от производительности устройства.

Логика движения змейки

Логика движения змейки
Логика движения змейки

Проверка столкновений

Проверка на столкновения
Проверка на столкновения

Обработка съедания еды

-17

Алгоритм размещения еды

Еда никогда не появляется на теле змейки - для этого используем алгоритм:

  1. Составляем список всех клеток поля
  2. Убираем из списка те, где находится змейка
  3. Случайно выбираем из оставшихся клеток
Размещение еды
Размещение еды

Цикл отрисовки

Отрисовка ~60 к/с
Отрисовка ~60 к/с
Отрисовка ~60 к/с
Отрисовка ~60 к/с

Адаптация к разным размерам экранов

Динамически вычисляем размер игрового поля:

Определение размера дисплея и подгон размера
Определение размера дисплея и подгон размера

Этот метод вызывается каждый раз при изменении размера окна

Управление на разных устройствах

На компьютере — клавиатура

Управление на ПК
Управление на ПК

На телефоне - сенсорные кнопки

Создаем виртуальный джойстик внизу экрана:

Управление на смартфоне
Управление на смартфоне

Fyne автоматически подстраивает размер кнопок под плотность пикселей экрана.

Особенности реализации для кроссплатформенности

Единая кодовая база

Код полностью одинаков для всех платформ. Fyne автоматически адаптирует:

  • Размеры элементов под плотность пикселей
  • Обработку ввода (касания/клики)
  • Системные шрифты и иконки

Производительность

  • Пул объектов избегает создания/удаления в рантайме
  • Разделение логики и рендеринга гарантирует плавность
  • Atomic операции обеспечивают безопасность многопоточности
-24

Видео работы игры на смартфоне с ОС Android

Весь код игры и скомпилированный файл .apk есть на Boosty, переходите и скачивайте.

Этот код можно использовать как основу для других игр - тетриса, сапера, арканоида. Принципы остаются теми же: игровой цикл, разделение логики и отображения, адаптивный интерфейс.

Спасибо за ваше время и внимание! Ваша поддержка очень важна для меня! Если вам понравилась статья, пожалуйста, поставьте лайк!

Подпишитесь на мой Телеграм-канал, чтобы быть в курсе новых статей.

Удачи!