Классическая игра Змейка
Cценарий реализует классическую игру “Змейка”.
Сценарий предназначен для демонстрации возможностей контроллера Telematic.


Алгоритм
Игра отображается на виртуальном дисплее, где змейка перемещается по сетке клеток, собирая случайно появляющиеся яблоки. При каждом шаге змейка движется в выбранном направлении, и при поедании яблока длина змейки увеличивается, а новое яблоко появляется в случайной позиции, не занятой змейкой.
Возможности
Сценарий предоставляет возможности управления направлением движения змейки через веб-интерфейс, используя радиокнопки для выбора направления вверх, вниз, влево или вправо. Обновление экрана происходит каждые полсекунды, обеспечивая плавную анимацию движения змейки. Дополнительно, сценарий обрабатывает границы экрана, позволяя змейке “проталкиваться” через одну сторону экрана и появляться с противоположной стороны.
Производительность
Замеры осуществлялись на тестовом образце
Время компиляции | 26 мс |
Среднее время выполнения тела цикла | <1 мс |
Использование стека | 504 байт (6.1%) |
Использование кучи | 1808 байт (3.0%) |
Сценарий
# Игра "Змейка" на контроллере Telematic
from dev import count, webconf, Reg, run # Импорт модулей для работы с регистрами и запуском цикла
from display import update, rect, rectfull, WIDTH, HEIGHT # Импорт функций для работы с дисплеем
from random import randint # Импорт функции для генерации случайных чисел
# Константы игрового поля
CELL_SIZE = const(6) # Размер одной клетки в пикселях (6x6)
X_MIN = const(0) # Минимальная координата X
Y_MIN = const(0) # Минимальная координата Y
X_MAX = (WIDTH - CELL_SIZE) // CELL_SIZE # Максимальная координата X (в клетках)
Y_MAX = (HEIGHT - CELL_SIZE) // CELL_SIZE # Максимальная координата Y (в клетках)
# Список направлений движения: [вверх, вниз, влево, вправо] в формате [dx, dy]
dirs = [[0, 1], [0, -1], [-1, 0], [1, 0]]
# Начальная позиция "яблока" (еды) — случайные координаты в пределах поля
apple = [randint(0, X_MAX), randint(0, Y_MAX)]
# Начальная позиция змейки — центр поля, список координат [x, y]
snake = [[X_MAX // 2, Y_MAX // 2]]
def step():
"""Основная функция шага игры, выполняется каждые 0.5 секунды."""
global apple, snake # Глобальные переменные для змейки и яблока
# Текущие координаты головы змейки
x, y = snake[0]
# Получение направления движения из регистра (0=вверх, 1=вниз, 2=влево, 3=вправо)
direction = rDirection.val()
# Обновление координат головы в зависимости от направления
x += dirs[direction][0]
y += dirs[direction][1]
# Обработка выхода за границы поля: змейка появляется с противоположной стороны
x = X_MIN if x >= X_MAX else X_MAX if x < X_MIN else x
y = Y_MIN if y >= Y_MAX else Y_MAX if y < Y_MIN else y
# Проверка столкновений
if [x, y] == apple: # Если голова достигла яблока
# Генерация нового яблока в случайной точке
apple = [randint(0, X_MAX), randint(0, Y_MAX)]
# Убедимся, что яблоко не появилось на теле змейки
while apple in snake:
apple = [randint(0, X_MAX), randint(0, Y_MAX)]
elif [x, y] in snake: # Если голова столкнулась с телом змейки
snake = [] # Сброс змейки (игра начинается заново)
else: # Если нет столкновений
snake.pop() # Удаление последнего сегмента хвоста
# Добавление новой головы в начало списка
snake.insert(0, [x, y])
# Отрисовка змейки: каждый сегмент — пустой прямоугольник
for x, y in snake:
rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE)
# Отрисовка яблока: закрашенный прямоугольник
rectfull(apple[0] * CELL_SIZE, apple[1] * CELL_SIZE, CELL_SIZE, CELL_SIZE)
# Обновление дисплея для отображения изменений
update()
# Конфигурация контроллера: 1 регистр для управления
count(Reg=1)
# Настройка веб-интерфейса: включён регистр и дисплей, консоль отключена
webconf(Reg=1, Pin=0, Display=1, Console=0)
# Создание регистра для выбора направления движения
rDirection = Reg(0).conf(
type='enum', # Тип данных — перечисление
name="", # Без названия (отображается только список направлений)
items=['Вверх', 'Вниз', 'Влево', 'Вправо'], # Варианты выбора
web='radio', # Отображение в веб-интерфейсе как радиокнопки
default=1 # Начальное направление — "Вниз"
)
# Запуск игрового цикла с интервалом 0.5 секунды
run(step, 0.5)