Skip to content

М19. Тетрис: вершина «от NAND до игры»

Паспорт модуля

ПараметрЗначение
Аудитория🔴 (команда 2–3 чел.); пройдены М14, М17, М18; 🟡 — тир Б
Аутентичная задачадовести систему до состояния «в это можно играть» и выдержать стресс-тест жюри: зажатые кнопки, вращение у стенки, одновременное сжигание линий
Объём6 занятий × 90 мин + шоу-демонстрация
Оборудованиетир А: связка М17+М18, 5 кнопок (влево/вправо/поворот/сброс/пауза) через debounce М15; тир Б: LED-матрица 8×32 на MAX7219 или WS2812 + любой CPU линии (честная оговорка: макеточной машине на герцах игра не по силам — Тетрис живёт на ПЛИС-CPU или, в тире Б, на RP2350 как референс-платформе)
ОграниченияТБ WS2812: расчёт тока ленты (до 60 мА/пиксель на белом), питание — отдельной шиной, не от дока ПЛИС
Аутентичная задача. После модуля обучающиеся смогут: показать играбельный Тетрис, целиком собранный из артефактов курса — своей ISA, своего ассемблера, своего CPU и своего видеотракта, — и защитить каждое проектное решение под вопросы жюри.

Цели

Обучающиеся …Блум—АндерсонМиллерПроверка
1проектируют представление состояния: поле 10×20 в памяти, фигура = таблица смещенийсоздаватьделаетревью структуры данных до кода
2реализуют игровой цикл: ввод → проверка коллизии → фиксация → сжигание линий → гравитациясоздаватьделаетфункциональный чек-лист (ниже)
3тестируют игру системно: составляют и прогоняют стресс-сценарииоцениватьделаетпротокол стресс-теста
4распределяют работу в команде и держат интеграционные интерфейсыприменятьделаетретроспектива + работающая интеграция

Проектный worked example (разбирается ДО кодирования)

Представление: поле — байтовая матрица в RAM/BRAM (клетка = код тайла); фигура — 4 пары смещений (x,y) от опорной точки; поворот — либо 4 предвычисленные ориентации в таблице (путь курса: таблица вместо формулы — та же философия, что знакогенератор М2 и микрокод М12), либо матричный поворот для желающих. Коллизия — единственная функция-предикат fits(фигура, ориентация, x, y): выход за границы или занятая клетка. Всё остальное (сдвиг, поворот у стенки, посадка) — вызовы этого предиката: одна проверка, много применений — обсудить как принцип проектирования.

    flowchart TB
    T[Тик таймера/кнопка] --> IN[Считать ввод]
    IN --> TRY{fits?}
    TRY -- да --> MOVE[Применить ход]
    TRY -- нет, ход вниз --> LOCK[Зафиксировать фигуру в поле]
    LOCK --> LINES{Полные линии?}
    LINES -- да --> BURN[Сжечь, сдвинуть, счёт]
    LINES -- нет --> SPAWN[Новая фигура]
    SPAWN --> OVER{Помещается?}
    OVER -- нет --> GAMEOVER
    BURN --> SPAWN
    MOVE --> T
  

Функциональный чек-лист приёмки (публикуется заранее — это и есть критерии жюри): фигура не проходит сквозь стенки и стакан; поворот у стенки не телепортирует; одновременное сжигание 2–4 линий корректно сдвигает всё выше; ускорение падения растёт со счётом; game over определяется честно; зажатая кнопка не ломает состояние (авто-повтор с периодом, а не «на каждый опрос»).

Честная инженерная развилка тира А: писать всю игру на ассемблере Я74-ISA — героично, но 8-битная аккумуляторная машина без индексной адресации делает работу с матрицей мучительной. Курс предлагает выбор с обоснованием: (а) расширить ISA индексной командой LDA (addr+X) — сквозная правка ассемблер/эмулятор/FSM, цена изменения контракта уже знакома по М17; (б) вынести отрисовку в аппаратный тайловый движок М18, оставив CPU только логику. Выбор и его защита — оцениваемая часть работы: правильного ответа нет, есть аргументы.
Типичные ошибки: состояние размазано по флагам и «глобалкам» — после первого же бага вводится единая структура состояния (боль запланирована); сжигание линий сдвигает вниз, затирая проверяемую строку (классика — проверять снизу вверх или собирать в новый буфер); ввод читается чаще, чем тик игры, и фигура «летает» — разделить частоты опроса и логики; в тире Б — питание WS2812 от 3,3-В пина: лента недополучает, ПЛИС перегружена.

Оценивание

Итог линии В и де-факто генеральная репетиция конференции: 10-минутная демонстрация (живая игра + рассказ «путь от NAND до этого экрана» с показом артефактов каждого модуля) + стресс-тест по чек-листу руками «жюри» (другая команда) + вопросы на глубину (случайный модуль из М1–М18 — кумулятивное оценивание всей программы, объявлено заранее: это делает retrieval-подготовку к защите неизбежной).

Уровни

Глоссарий