1
0

79 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🐍 Змейка на 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 :)