forked from george/snake-compose
Этап 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:
parent
1ccb52cfb5
commit
6a1719c148
@ -70,7 +70,10 @@ app/src/main/
|
||||
Проект задуман как серия этапов — каждый в своей ветке, чтобы можно было
|
||||
сравнивать версии:
|
||||
|
||||
- **`snake-stage-1`** — базовая рабочая игра (этот код).
|
||||
- **`snake-stage-1`** — базовая рабочая игра.
|
||||
- **`snake-stage-2`** — ускорение: змейка ускоряется с каждой съеденной едой
|
||||
(задержка шага 150 → 60 мс), на экране индикатор «Скорость». Смотри
|
||||
функции `stepDelay()` / `speedLevel()` и игровой цикл в `SnakeGame.kt`.
|
||||
|
||||
Идеи для следующих этапов: ускорение с ростом счёта, сохранение рекорда через
|
||||
`DataStore`, экранные кнопки-стрелки, анимации.
|
||||
Идеи для следующих этапов: сохранение рекорда через `DataStore`,
|
||||
экранные кнопки-стрелки, анимации, звук.
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user