Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Создание игры «Крестики-нолики» на Arduino с сенсорным экраном: пошаговое руководство

Необходимые компоненты

Приблизительная стоимость проекта: $15.

Необходимое ПО

О проекте

В этом подробном уроке мы создадим игру «Крестики-нолики» на Arduino с сенсорным управлением. Вы будете играть против компьютера. Несмотря на простоту игры, она отлично вводит в программирование игр и основы искусственного интеллекта. Мы не используем сложные алгоритмы ИИ, но поймём, почему они необходимы в более сложных играх.

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

Шаг 1: Подготовка компонентов

Вам понадобятся только Arduino Uno и 2.8" сенсорный экран. Перед сборкой рекомендую посмотреть видеоурок по калибровке дисплея — это сэкономит время при отладке.

Шаг 2: Особенности 2.8" TFT-шилда

Дисплей с разрешением 320×240 пикселей подключается как шилд, что сильно упрощает монтаж. Он занимает почти все цифровые и аналоговые выводы Uno, оставляя только 2 цифровых и 1 аналоговый пин. При необходимости можно использовать Arduino Mega. Дисплей несовместим с Arduino Due и Wemos D1 ESP8266. На плате есть слот для microSD.

Шаг 3: Сборка и тестирование

После подключения экрана загрузите скетч и начинайте играть. Нажмите «Start Game» — Arduino ходит первым. Ваши ходы делаются касанием экрана. Побеждает тот, кто первым выстроит три знака в ряд по горизонтали, вертикали или диагонали. После окончания партии появляется экран «Game Over» с кнопкой рестарта.

Алгоритм Arduino достаточно силен: он выигрывает большинство партий или играет вничью. Я намеренно добавил ошибки, чтобы дать человеку шанс. Две строки кода могут сделать алгоритм непобедимым. Но как $2 чип обыгрывает человеческий мозг? Ответ в следующем разделе.

Шаг 4: Игровой алгоритм

Компьютер всегда ходит первым — это уже даёт преимущество. Первый ход — случайный угол. Второй — тоже случайный свободный угол, игнорируя ход игрока. Далее алгоритм:

  1. Проверяет, может ли игрок выиграть следующим ходом — блокирует эту клетку.
  2. Если угрозы нет — занимает свободный угол или случайную клетку.

Этот простой эвристический алгоритм гарантирует победу или ничью. Для «Крестиков-ноликов» дерево игры мало, его можно полностью разобрать. В шахматах дерево слишком велико — нужны ИИ и огромная вычислительная мощность.

Шаг 5: Код проекта

Для компиляции нужны три библиотеки:

Скетч занимает более 600 строк. Разберём ключевые фрагменты.

Первые ходы компьютера

int firstMoves[] = {0, 2, 6, 8}; // углы доски
for (counter = 0; counter < 4; counter++) {
  if (board[firstMoves[counter]] != 0) movesPlayed++;
}
do {
  if (moves <= 2) {
    int randomMove = random(4);
    int c = firstMoves[randomMove];
    if (board[c] == 0) {
      delay(1000);
      board[c] = 2; // 2 — компьютер
      drawCpuMove(firstMoves[randomMove]);
      b = 1;
    }
  }
} while (!b);

Проверка угрозы со стороны игрока

int checkOpponent() {
  // Проверка всех выигрышных комбинаций для игрока (1)
  if (board[0]==1 && board[1]==1 && board[2]==0) return 2;
  else if (board[0]==1 && board[1]==0 && board[2]==1) return 1;
  else if (board[1]==1 && board[2]==1 && board[0]==0) return 0;
  else if (board[3]==1 && board[4]==1 && board[5]==0) return 5;
  else if (board[4]==1 && board[5]==1 && board[3]==0) return 3;
  else if (board[3]==1 && board[4]==0 && board[5]==1) return 4;
  else if (board[1]==0 && board[4]==1 && board[7]==1) return 1;
  else return 100; // угрозы нет
}

Функция возвращает индекс клетки для блокировки или 100, если угрозы нет. Не все угрозы блокируются — это даёт шанс игроку. Найдёте, какие?

Важно: Если код не работает, в Banggood продаются дисплеи с разными драйверами. Замените инициализацию на:

void initDisplay() {
  tft.reset();
  tft.begin(0x9341);
  tft.setRotation(3);
}

Шаг 6: Заключение и идеи для улучшения

Даже на Arduino Uno можно реализовать непобедимый алгоритм для простых игр. Этот проект — отличный старт для изучения ИИ и геймдева. В будущем планирую более сложные проекты на Raspberry Pi. Делитесь мнением в комментариях!

Схемы и код

Полный код и схемы доступны в репозитории GitHub. Файлы: graphics.c, TicTacToeEasy.ino.

Производственный процесс

  1. Шахматы: от древних корней к современному производству — экспертный обзор
  2. Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
  3. Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
  4. Создание портативного ёмкостного сенсорного пианино на Arduino: пошаговое руководство
  5. DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
  6. Сборка консоли Pong 24×16 на Arduino Nano и MAX7219
  7. Arduino Breakout на сенсорном TFT 2.4″: классическая аркада своими руками
  8. Гигантский анимированный LEGO-человечек: игра «Операция» на Arduino
  9. Pixel Chaser: игра на один тап с NeoPixel Ring и Arduino Nano
  10. Автоматизация игры «Динозавр» в Chrome на Arduino и LDR с Python