Увлекательная электронная логическая игра-головоломка “Инверсия”. Игра собрана на 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. Программа для игры "Инверсия".