Этап 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 COLS = 20
|
||||||
private const val ROWS = 30
|
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). */
|
/** Клетка поля / сегмент змейки. Direction тоже храним как Cell (dx, dy). */
|
||||||
private data class Cell(val x: Int, val y: Int)
|
private data class Cell(val x: Int, val y: Int)
|
||||||
@ -92,10 +104,12 @@ fun SnakeGame() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Игровой цикл на корутине — пока компонент в композиции
|
// Игровой цикл на корутине — пока компонент в композиции.
|
||||||
|
// Задержка пересчитывается каждый шаг из текущего счёта, поэтому
|
||||||
|
// змейка плавно ускоряется по мере поедания еды.
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
while (true) {
|
while (true) {
|
||||||
delay(STEP_MS)
|
delay(stepDelay(score))
|
||||||
if (started && !gameOver) step()
|
if (started && !gameOver) step()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -145,9 +159,9 @@ fun SnakeGame() {
|
|||||||
drawBoard(snake, food)
|
drawBoard(snake, food)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Счёт сверху
|
// Счёт сверху (+ индикатор скорости — видно ускорение)
|
||||||
Text(
|
Text(
|
||||||
text = "Счёт: $score Рекорд: $best",
|
text = "Счёт: $score Рекорд: $best Скорость: ${speedLevel(score)}",
|
||||||
color = Color.White,
|
color = Color.White,
|
||||||
fontSize = 20.sp,
|
fontSize = 20.sp,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user