diff --git a/README.md b/README.md index bafb0e9..41eab42 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,10 @@ app/src/main/ Проект задуман как серия этапов — каждый в своей ветке, чтобы можно было сравнивать версии: -- **`snake-stage-1`** — базовая рабочая игра (этот код). +- **`snake-stage-1`** — базовая рабочая игра. +- **`snake-stage-2`** — ускорение: змейка ускоряется с каждой съеденной едой + (задержка шага 150 → 60 мс), на экране индикатор «Скорость». Смотри + функции `stepDelay()` / `speedLevel()` и игровой цикл в `SnakeGame.kt`. -Идеи для следующих этапов: ускорение с ростом счёта, сохранение рекорда через -`DataStore`, экранные кнопки-стрелки, анимации. +Идеи для следующих этапов: сохранение рекорда через `DataStore`, +экранные кнопки-стрелки, анимации, звук. diff --git a/app/src/main/java/com/example/snake/SnakeGame.kt b/app/src/main/java/com/example/snake/SnakeGame.kt index 994cda4..7dc61fb 100644 --- a/app/src/main/java/com/example/snake/SnakeGame.kt +++ b/app/src/main/java/com/example/snake/SnakeGame.kt @@ -34,7 +34,19 @@ import kotlin.random.Random // --- Параметры игры --- private const val COLS = 20 private const val ROWS = 30 -private const val STEP_MS = 130L + +// --- Скорость и ускорение (этап 2) --- +private const val START_STEP_MS = 150L // стартовая задержка между шагами (медленнее = безопаснее старт) +private const val MIN_STEP_MS = 60L // потолок скорости: быстрее этого змейка не станет +private const val SPEEDUP_MS = 6L // на сколько мс ускоряемся за каждую съеденную еду + +/** Текущая задержка шага: чем больше счёт, тем меньше задержка (но не ниже MIN_STEP_MS). */ +private fun stepDelay(score: Int): Long = + (START_STEP_MS - score * SPEEDUP_MS).coerceAtLeast(MIN_STEP_MS) + +/** Уровень скорости для индикатора: растёт со счётом, пока не упёрлись в потолок. */ +private fun speedLevel(score: Int): Int = + 1 + minOf(score, ((START_STEP_MS - MIN_STEP_MS) / SPEEDUP_MS).toInt()) /** Клетка поля / сегмент змейки. Direction тоже храним как Cell (dx, dy). */ private data class Cell(val x: Int, val y: Int) @@ -92,10 +104,12 @@ fun SnakeGame() { } } - // Игровой цикл на корутине — пока компонент в композиции + // Игровой цикл на корутине — пока компонент в композиции. + // Задержка пересчитывается каждый шаг из текущего счёта, поэтому + // змейка плавно ускоряется по мере поедания еды. LaunchedEffect(Unit) { while (true) { - delay(STEP_MS) + delay(stepDelay(score)) if (started && !gameOver) step() } } @@ -145,9 +159,9 @@ fun SnakeGame() { drawBoard(snake, food) } - // Счёт сверху + // Счёт сверху (+ индикатор скорости — видно ускорение) Text( - text = "Счёт: $score Рекорд: $best", + text = "Счёт: $score Рекорд: $best Скорость: ${speedLevel(score)}", color = Color.White, fontSize = 20.sp, modifier = Modifier