Найти тему
Terrabyte

Пишем игру "Змейка" для игровой консоли на ATtiny13: вызов для программиста - 4

Игра Змейка для игровой консоли на ATtiny13
Игра Змейка для игровой консоли на ATtiny13

Змейка (или Питон) - одна из классических игрушек, увидевших свет на заре персональных компьютеров. Создана еще в до-тетрисные времена и несомненно может считаться классикой аркадного жанра. Сам я впервые увидел эту игрушку в конце 80-х годов, на персональном компьютере "Партнер", который был модернизированным клоном эпохального "Радио-86". Кстати, в журнале Радио даже код HEX-дампа этой игры публиковали. Те счастливцы, которые чудом смогли раздобыть набор деталей, справиться с изготовлением печатной платы и стать счастливыми обладателями потрясающего устройства, смогли этот код набрать и насладиться приключениями ненасытного пресмыкающегося. Однако, даже в те времена для этого отводилось не менее 16 килобайт памяти!

А что у нас? А у нас все гораздо интереснее. В прошлом материале я рассказал как буквально на коленке собрать простейшую игровую консоль на одном из самых слабых микроконтроллеров компании Atmel - ATtiny13.

Тогда же я объяснил, что делаю это (игровую консоль с 1 килобайтом памяти программ и 64 байтами ОЗУ) из чисто спортивного интереса. Во-первых, мне хотелось посмотреть, что можно выжать из этого чипа, а во-вторых, что, как не решение сложных задач, повышает тонус нашей мыслительной системы!

Первой игрой, которую я презентовал в качестве техно-демки для консоли, стал теннис со стенкой. Во время его разработки у меня появилось множество идей, которые я буду постепенно реализовывать. Вообще, на семейство ATtiny у меня очень большие планы. Впереди запись звука, синтез музыки, новые игры... Если Вам интересно, подписывайтесь! Так вот, одна из игрушек, написать которую у меня просто руки чесались и была Змейка.

Сегодня я с чистой совестью могу сказать, что у меня получилось реализовать игровую механику этой игры. Не сразу, но все же я смог втиснуть все в 1024 байта. Ровно! А главное, обойтись 64 байтами оперативной памяти.

Игра Змейка: результат компиляции!
Игра Змейка: результат компиляции!

Змейка ползает, ест кроликов, удлиняется... Управляется двумя кнопками, которые задают направление ее движения. Вот пожалуй и все. Если змейка натыкается на край экрана или на себя саму, то игра останавливается и спустя пару секунд запускается снова. Подсчет очков и различные красивости пока в память не втискиваются, но, все равно играть интересно!

Как обычно, в конце статьи я с удовольствием поделюсь ссылкой на скетч с исходным текстом программы, который я постарался снабдить подробными комментариями. Также в конце статьи будет короткое видео с иллюстрацией геймплея.

Особенности программы

Я не буду описывать все подробно. Надеюсь, что комментарии в коде помогут желающим разобраться. Здесь же я прокомментирую те задачи, которые пришлось решить и основные трудности, с которыми пришлось столкнуться.

Программа, как и ранее, написана на языке Си в среде Arduino IDE.

Задача вывода изображения на OLED-дисплей с контроллером 1306 по последовательному протоколу I2C решается программным способом. Аппаратной поддержки этого протокола у ATtiny13 нет. Тем не менее код получился очень компактный, около 50 байт. Этот подход я успешно использовал ранее в проектах микро-FM радио и устройства воспроизведения звука на той же ATtiny13.

Управление змейкой осуществляется двумя кнопками. Напомню, у нас в консоли их две. Есть возможность добавить, но пока потребности не появилось. Решим в ходе разработки других программ. Левая кнопка отвечает за поворот змейки налево, правая - направо. Управление двумя кнопками, вообще-то усложняет жизнь. Насколько я помню, змейка всегда управлялась четырьмя кнопками. Влево, вверх, вправо, вниз. Такая раскладка сильно облегчает задачу контроля. Например, чтобы повернуть влево всегда надо жать кнопку влево. В случае двух кнопок направление, в котором змейка поползет зависит от того куда она ползет! Другими словами, в случае 4-кнопочного управления мы управляем в абсолютных координатах экрана, а в случае 2-кнопочного контроля в относительных, относительно движения головы змейки (как будто крутим рулем находясь в автомобиле).

Одна из основных проблем организации памяти в игре - проблема хранения информации о самой змейке. По-сути, змейка - это последовательность связных сегментов, каждый из которых хранит ссылку на координаты соседнего. Это если решать задачу в лоб. Такой подход требует много памяти. Игровое поле в игре имеет размер 16x8 ячеек. Даже если хранить обе координаты в одном байте, потребуется 128 байт. Напомню, у нас всего 64 байта оперативной памяти.

Я решил сделать по-другому. Для хранения информации о соседнем сегменте я использовал только 2 бита. Комбинация этих бит указывает на направление, в котором расположен следующий от хвоста сегмент. 00 - справа, 01 - снизу, 10 - слева, 11 - сверху (см. рисунок ниже). То есть хранится информация об относительном смещении. Тогда в один байт можно упихать информацию о 4 ячейках змейки. Для хранения 128 ячеек при этом потребуется лишь 32 байта. Это конечно уже половина всего доступного ОЗУ, но что делать - на змейке экономить не приходится!

-3

Для управления временем в игре используется встроенный таймер, который работает в режиме CTC (clear timer on compare - сброс по переполнению регистра сравнения). Меняя значение, которое заносится в регистр сравнения можно менять темп игры. Только вот нужно ли? Игра и так сложная, как по мне - мозги не успевают поворачиваться за змейкой!

Наибольший объем кода занимают различные условные операторы. Особенно операторы, связанные с прямым сравнением величин или сравнения с константой. Например.

Игра змейка: использование условий
Игра змейка: использование условий

В этом куске кода происходит расчет новых координат головы в зависимости от направления ее движения. Хотелось бы заменить подобные участки кода например, вычислением логических выражений.

То есть, потенциал для улучшений и, соответственно, уменьшения размера кода есть!

Что еще? Да пожалуй все! Если эти пояснения или комментарии в коде будут не вполне понятными - спрашивайте, я поясню более детально.

В свою очередь буду крайне признателен за любые комментарии, замечания и предложения по усовершенствованию.

Как обещал, ссылка на архив с исходником игры и небольшое видео геймплея.

Спасибо, что читаете-смотрите Terrabyte! Подписывайтесь, если вам интересна радиолюбительская тематика, микроконтроллеры, мини-ПК, необычные компьютерные решения и инновационные разработки! Спасибо всем, кто нас поддерживает своими комментариями и лайками!

Наша группа ВК: https://vk.com/terrabyte

Наш канал на VK-Video: https://vk.com/video/@terrabyte/all

Наука
7 млн интересуются