From 6a1719c148cf157f584e9c0a58b4abd6e5bf495e Mon Sep 17 00:00:00 2001 From: george Date: Wed, 17 Jun 2026 16:54:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=AD=D1=82=D0=B0=D0=BF=202:=20=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D0=B9=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Змейка ускоряется по мере роста счёта: задержка между шагами уменьшается со 150 мс до 60 мс (по 6 мс за каждую съеденную еду). - stepDelay(score) — пересчёт задержки в игровом цикле LaunchedEffect - speedLevel(score) — уровень скорости для индикатора на экране - в шапке добавлен показатель «Скорость» Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 9 ++++--- .../main/java/com/example/snake/SnakeGame.kt | 24 +++++++++++++++---- 2 files changed, 25 insertions(+), 8 deletions(-) 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