diff --git a/README.md b/README.md index 3fe2410..f98e19c 100644 --- a/README.md +++ b/README.md @@ -104,4 +104,9 @@ app/src/main/ В шапке — «Уровень». Смотри `obstacles`/`level`, `addObstacles()`, проверку коллизий и повышение уровня в `step()`. -Идеи для следующих этапов: режим «сквозь стены», два игрока, выбор размера поля. +- **`snake-stage-9`** — сквозь границы (тор): змейка проходит сквозь край + поля и появляется с противоположной стороны; смерть остаётся только от + самой себя и от препятствий. Реализовано %-арифметикой по координатам + головы в `step()`. + +Идеи для следующих этапов: два игрока, выбор размера поля, экран настроек. diff --git a/app/src/main/java/com/example/snake/SnakeGame.kt b/app/src/main/java/com/example/snake/SnakeGame.kt index b505867..6258bb2 100644 --- a/app/src/main/java/com/example/snake/SnakeGame.kt +++ b/app/src/main/java/com/example/snake/SnakeGame.kt @@ -166,10 +166,15 @@ fun SnakeGame() { fun step() { dir = nextDir val head = snake.first() - val nh = Cell(head.x + dir.x, head.y + dir.y) + // этап 9: граница экрана «телепортирует» на противоположную сторону (тор). + // %-арифметика с + COLS/ROWS, чтобы корректно обрабатывать выход за 0. + val nh = Cell( + (head.x + dir.x + COLS) % COLS, + (head.y + dir.y + ROWS) % ROWS + ) - val hitWall = nh.x < 0 || nh.y < 0 || nh.x >= COLS || nh.y >= ROWS - if (hitWall || snake.contains(nh) || nh in obstacles) { + // смерть теперь только от самой себя или от препятствия (не от края) + if (snake.contains(nh) || nh in obstacles) { gameOver = true return }