From e84ffa754d51f7c9061c1a45101752582aa1b9c1 Mon Sep 17 00:00:00 2001 From: george Date: Wed, 17 Jun 2026 18:34:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=AD=D1=82=D0=B0=D0=BF=209:=20=D1=81=D0=BA?= =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D1=8C=20=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D1=8B=20(=D1=82=D0=BE=D1=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Змейка проходит сквозь край поля и появляется с противоположной стороны. - координаты головы считаются по модулю: (x+dx+COLS)%COLS, (y+dy+ROWS)%ROWS - столкновение с краем больше не убивает; смерть только от себя/препятствий Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 7 ++++++- app/src/main/java/com/example/snake/SnakeGame.kt | 11 ++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) 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 }