# 🐍 Змейка на Jetpack Compose Учебный пример простого Android-приложения для студентов: классическая игра «Змейка» на одном экране. Цель примера — показать, как устроено реальное Android-приложение на современном стеке (Kotlin + Jetpack Compose) без лишней сложности. ## Что внутри - Игровое поле-сетка 20×30 - Управление **свайпами** (вверх/вниз/влево/вправо) - Змейка растёт, когда съедает еду; ведётся счёт и рекорд за сессию - Столкновение со стеной или с собой = Game Over, **тап** — рестарт - Вся отрисовка — через Compose `Canvas`, игровой цикл — на корутине ## Стек | Что | Версия | |-----|--------| | Язык | Kotlin 2.0.20 | | UI | Jetpack Compose (BOM 2024.10.01, Material 3) | | Android Gradle Plugin | 8.13.2 | | Gradle | 8.13 | | compileSdk / minSdk | 36 / 24 | ## Как запустить ### Вариант 1: Android Studio (рекомендуется) 1. Открыть папку проекта в Android Studio (**File → Open**). 2. Дождаться Gradle Sync. 3. Подключить телефон по USB (с включённой *отладкой по USB*) или запустить эмулятор. 4. Нажать ▶ **Run**. ### Вариант 2: командная строка ```bash # нужен JDK 17+ и установленный Android SDK ./gradlew installDebug # соберёт и поставит приложение на подключённое устройство ``` > Файл `local.properties` с путём к SDK создаётся автоматически Android Studio > и **не** хранится в репозитории — у каждого свой путь. ## Структура проекта ``` app/src/main/ ├── java/com/example/snake/ │ ├── MainActivity.kt # точка входа: ComponentActivity + setContent { SnakeGame() } │ └── SnakeGame.kt # вся игра: состояние, игровой цикл, отрисовка, управление ├── res/values/themes.xml # тема приложения └── AndroidManifest.xml ``` 👉 **Главный файл для изучения — [`SnakeGame.kt`](app/src/main/java/com/example/snake/SnakeGame.kt).** Там по шагам видно идеи Compose: - состояние через `remember { mutableStateOf(...) }` — UI сам перерисовывается при его изменении; - игровой цикл через `LaunchedEffect { while(true) { delay(); step() } }`; - ввод через `Modifier.pointerInput { detectTapGestures / detectDragGestures }`; - рисование через `Canvas { drawRoundRect / drawLine }`. ## Управление | Действие | Жест | |----------|------| | Начать игру | свайп или тап | | Повернуть | свайп ↑ ↓ ← → | | Рестарт после проигрыша | тап по экрану | ## Этапы (ветки) Проект задуман как серия этапов — каждый в своей ветке, чтобы можно было сравнивать версии: - **`snake-stage-1`** — базовая рабочая игра (этот код). Идеи для следующих этапов: ускорение с ростом счёта, сохранение рекорда через `DataStore`, экранные кнопки-стрелки, анимации. Zdes' byl Irakli :)