Нажатия на кнопки в электронных играх на Arduino удобно обрабатывать с помощью операторов switch и case. Так же одновременно с операторами switch и case, как правило, используют оператор break. Мы напишем программу заготовку для электронной логической игры с несколькими кнопками и светодиодами. В программе будут использованы операторы switch, case и break.
Switch case - переключатель.
Оператор switch сверяет переменную со списком значений, которые называются cases(случай), находит совпадения и выполняет блок кода в том case, где это совпадение было найдено.
Синтаксис:
switch (var) { case константа: // блок кода break; case константа: // блок кода break; default: // блок кода }
Оператор break позволяет выйти из оператора swich если совпадение было найдено и нет необходимости выполнять код в остальных блоках case. Блок кода в операторах case не заключён в фигурные скобки, а оператор break является завершающим оператором блока кода оператора case.
Блок кода следующий за оператором default выполняется только тогда, когда в операторе switch не было найдено ни одного совпадения.
Ниже приведена принципиальная электрическая схема электронной игры:
Ниже приведена программа обслуживания клавиатуры для электронной игры с использованием оператора switch case:
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); /* Подавление дребезга контактов */ } /* Начало игры */ switch (keyN) { case 0: z[0] = !z[0]; break; case 1: z[1] = !z[1]; break; case 2: z[2] = !z[2]; break; case 3: z[3] = !z[3]; break; case 4: z[4] = !z[4]; break; case 5: z[5] = !z[5]; break; case 6: z[6] = !z[6]; break; case 7: z[7] = !z[7]; break; } /* Включение светодиодов */ for (int n = 0; n < 8; n++) { digitalWrite (y[n], z[n]); } }
Пример монтажа электронной игры:
Выше приведена программа - заготовка к игре. Игру, правила игры и программу Вам предстоит придумать самостоятельно. Например, светодиоды составляют кольцо. Каждая кнопка инвертирует 3 соседних светодиода. Цель игры - зажечь все светодиоды из какой нибудь случайной позиции. Тогда код отвечающий за функции клавиатуры будет следующим:
switch (keyN) { case 0: z[0] = !z[0]; z[1] = !z[1]; z[4] = !z[4]; break; case 1: z[1] = !z[1]; z[2] = !z[2]; z[0] = !z[0]; break; case 2: z[2] = !z[2]; z[3] = !z[3]; z[1] = !z[1]; break; case 3: z[3] = !z[3]; z[7] = !z[7]; z[2] = !z[2]; break; case 4: z[4] = !z[4]; z[5] = !z[5]; z[0] = !z[0]; break; case 5: z[5] = !z[5]; z[6] = !z[6]; z[4] = !z[4]; break; case 6: z[6] = !z[6]; z[7] = !z[7]; z[5] = !z[5]; break; case 7: z[7] = !z[7]; z[3] = !z[3]; z[6] = !z[6]; break; }