1
0

Этап 2: ускорение змейки

Змейка ускоряется по мере роста счёта: задержка между шагами
уменьшается со 150 мс до 60 мс (по 6 мс за каждую съеденную еду).

- stepDelay(score) — пересчёт задержки в игровом цикле LaunchedEffect
- speedLevel(score) — уровень скорости для индикатора на экране
- в шапке добавлен показатель «Скорость»

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
george 2026-06-17 16:54:52 +03:00
parent 1ccb52cfb5
commit 6a1719c148
2 changed files with 25 additions and 8 deletions

View File

@ -70,7 +70,10 @@ app/src/main/
Проект задуман как серия этапов — каждый в своей ветке, чтобы можно было
сравнивать версии:
- **`snake-stage-1`** — базовая рабочая игра (этот код).
- **`snake-stage-1`** — базовая рабочая игра.
- **`snake-stage-2`** — ускорение: змейка ускоряется с каждой съеденной едой
(задержка шага 150 → 60 мс), на экране индикатор «Скорость». Смотри
функции `stepDelay()` / `speedLevel()` и игровой цикл в `SnakeGame.kt`.
Идеи для следующих этапов: ускорение с ростом счёта, сохранение рекорда через
`DataStore`, экранные кнопки-стрелки, анимации.
Идеи для следующих этапов: сохранение рекорда через `DataStore`,
экранные кнопки-стрелки, анимации, звук.

View File

@ -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