Нажатия на кнопки в электронных играх на 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;
  }