Создание игры «Крестики-нолики» на Arduino с сенсорным экраном: пошаговое руководство
Необходимые компоненты
- Arduino UNO — 1 шт.
- 2.8" сенсорный TFT-дисплей (шилд) — 1 шт.
Приблизительная стоимость проекта: $15.
Необходимое ПО
- Arduino IDE
О проекте
В этом подробном уроке мы создадим игру «Крестики-нолики» на 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: Игровой алгоритм
Компьютер всегда ходит первым — это уже даёт преимущество. Первый ход — случайный угол. Второй — тоже случайный свободный угол, игнорируя ход игрока. Далее алгоритм:
- Проверяет, может ли игрок выиграть следующим ходом — блокирует эту клетку.
- Если угрозы нет — занимает свободный угол или случайную клетку.
Этот простой эвристический алгоритм гарантирует победу или ничью. Для «Крестиков-ноликов» дерево игры мало, его можно полностью разобрать. В шахматах дерево слишком велико — нужны ИИ и огромная вычислительная мощность.
Шаг 5: Код проекта
Для компиляции нужны три библиотеки:
- Modified Adafruit TFTLCD
- Adafruit GFX
- Touchscreen
Скетч занимает более 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.
Производственный процесс
- Шахматы: от древних корней к современному производству — экспертный обзор
- Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
- Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
- Создание портативного ёмкостного сенсорного пианино на Arduino: пошаговое руководство
- DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
- Сборка консоли Pong 24×16 на Arduino Nano и MAX7219
- Arduino Breakout на сенсорном TFT 2.4″: классическая аркада своими руками
- Гигантский анимированный LEGO-человечек: игра «Операция» на Arduino
- Pixel Chaser: игра на один тап с NeoPixel Ring и Arduino Nano
- Автоматизация игры «Динозавр» в Chrome на Arduino и LDR с Python