Увлекательная электронная логическая игра-головоломка “Инверсия”. Игра собрана на Arduino, содержит минимум деталей: 8 кнопок и 8 светодиодов, монтаж на макетной плате. Идею игры предложил наш соотечественник, автор многих логических игр Сергей Полозков.
Схему и программу на Си мы разработали в ЦМИТ Бионик-лаб. Выставочный вариант игры спроектировал и изготовил Костя Алёшин. Костя участвовал с этой игрой в Московском Дворце пионеров на конкурсе «Техническое моделирование» в рамках Городской конкурсной программы «Новые вершины и занял первое место.
В электронной игре Инверсия прямоугольное игровое поле разбито на 8 квадратов: 4 клетки в 2 ряда. Клетки могут быть только в 2-х состояниях, включено или выключено. В начале игры некоторые клетки включены в случайном порядке. Цель игры включить все клетки.
Управление игрой 8 кнопок, по 1-й для каждой клетки. Но! У кнопок не простой алгоритм работы. Нажатие на кнопку инвертирует не только соответствующую ей клетку, а также инвертирует все клетки в том ряду и в той колонке где она находится. То есть, каждая кнопка инвертирует состояние сразу 5-ти клеток.
Рис. 1. Схема монтажа светодиодов и соответствующих им кнопок.
Если мы будем собирать игру на макетной плате, подойдёт плата Breadboard 400 pin или 830 pin. Светодиоды нужно будет расположить так, чтобы они стояли в 2 ряда по 4, а строго за ними стояли бы кнопки. Пример монтажа светодиодов и кнопок показан на рис. 1. Принципиальная электрическая схема для двух клеток на игровом поле, 2 кнопки и 2 светодиода, показана на рис. 2.
Рис. 2. Принципиальная электрическая схема для двух клеток на игровом поле, 2 кнопки и 2 светодиода, показана на рис. 2.
Рис. 3. Принципиальная электрическая схема электронной игры-головоломки "Инверсия".
Рис. 4 Макет игры "Инверсия", смонтированный на макетной плате breadboard 830 pin.
const int x[8] {3, 5, 7, 9, 12, 14, 16, 18}; /* pin KEY */ const int y[8] {2, 4, 6, 8, 11, 15, 17, 19}; /* pin LED */ bool z[8]; /* LED состояние */ /* Абстрагируемся от физ.реализации */ const bool BTN_ON = 0, BTN_OFF = 1; /* кнопка подключена на минус */ int keyN = 8; /* Номер нажатой клавиши (8 - не нажата ни одна) */ void setup() { for (int n = 0; n < 8; n++) { pinMode(x[n], INPUT_PULLUP); pinMode(y[n], OUTPUT); } } void loop() { /* Обслуживание клавиатуры Если нажата новая клавиша, выход из цикла */ for (int n = 0; n < 8; n++) { if (digitalRead(x[n]) == BTN_ON) { if (keyN != n) { keyN = n; break; } n = -1; } if (n == 7) { keyN = 8; n = -1; } delay (2); /* Подавление дребезга контактов */ } /* Начало игры */ if (keyN < 4) { z[0] = !z[0]; z[1] = !z[1]; z[2] = !z[2]; z[3] = !z[3]; z[keyN + 4] = !z[keyN + 4]; } else { z[4] = !z[4]; z[5] = !z[5]; z[6] = !z[6]; z[7] = !z[7]; z[keyN - 4] = !z[keyN - 4]; } /* Включение светодиодов */ for (int n = 0; n < 8; n++) { digitalWrite (y[n], z[n]); } }
Рис. 5. Программа для игры "Инверсия".