Создание сенсорной игры «Крестики-нолики» на Arduino Due
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino Due | 1 |
| TFT LCD 2.8" с сенсорной панелью (ILI9341 + XPT2046) | 1 |
| Перемычки | 1 комплект |
Приложения и сервисы
- Arduino IDE
О проекте
Описание
Проект основан на работе nickthegreek82 (arduino-touch-tic-tac-toe-game). Реализована игра «Крестики-нолики» против компьютера с ИИ на сенсорном TFT-дисплее 2.8".
Необходимые библиотеки
- Adafruit GFX Library
- Adafruit ILI9341 Library
- URTouch Library
Подключение (Wiring)
Сенсорная панель → Arduino Due
- T_IRQ → 22
- T_DO → 24
- T_DIN → 26
- T_CS → 28
- T_CLK → 30
Дисплей → Arduino Due
- SDO (MISO) → A.25
- LED → 3.3V
- SCK → A.27
- SDI (MOSI) → A.26
- DC → 9
- RESET → 8
- CS → 10
- GND → GND
- VCC → 3.3V
История версий
- 08.22.2017 — улучшение ИИ и оптимизация кода.
- 08.26.2017 — дальнейшая оптимизация.
- 08.27.2017 — вызов: можете ли вы обыграть CPU?
- 03.13.2018 — внедрен улучшенный алгоритм ИИ (спасибо klauscam: GitHub).
Код
Две версии скетча:
1. Базовая версия (TIC TAC TOE)
Простая игра против компьютера с базовым ИИ. Использует битмапы для отрисовки X и O.
// Основные определения пинов и библиотеки
#define TFT_RST 8
#define TFT_DC 9
#define TFT_CS 10
#define TOUCH_ORIENTATION LANDSCAPE
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
Adafruit_GFX_Button buttons[9];
URTouch myTouch(30, 28, 26, 24, 22);
// Игровая логика: массив board[9], проверка победителя, ходы игрока и CPU
// CPU использует эвристику: центр, углы, блокировка двойных угроз, случайный ход
// Отрисовка через drawBitmap() из PROGMEM массивов circle[] и x_bitmap[]
// Меню: кто начинает, экран Game Over с кнопкой "Again?"
Полный код объемный — см. раздел Code исходника.
2. Улучшенная версия (TicTacToe_new) — непобедимый ИИ на Minimax
Реализован алгоритм Minimax с альфа-бета отсечением (глубина difficulty=8). CPU играет идеально — ничью гарантированно, выигрыш только при ошибке игрока.
// Ключевые отличия:
int minimax(int board[9], int player, int depth) {
int winner = win(board);
if(winner != 0) return winner * player;
int move = -1, score = -2;
for(int i=0; i<9; ++i) if(board[i]==0) {
board[i] = player;
int thisScore = (depth < difficulty) ? -minimax(board, -player, depth+1) : 0;
board[i] = 0;
if(thisScore > score) { score = thisScore; move = i; }
}
return (move==-1) ? 0 : score;
}
void computerMove(int board[9]) {
// перебор всех ходов, выбор с лучшим minimax score
// board: 1 = CPU (O), -1 = Human (X)
}
Отрисовка сетки линиями, координаты тача маппятся на 9 клеток. В меню выбора первого хода — кнопки YOU / CPU. После партии — экран результата (HUMAN WINS / CPU WINS / DRAW) и кнопка Again.
Схемы

Производственный процесс
- Визитка-PCB с игрой «Крестики-нолики» 4×4: руководство по проектированию, сборке и программированию
- Датчик CO2 K30: мониторинг качества воздуха в реальном времени на Arduino
- Устройство для общения глухосліпых людей с помощью 1Sheeld и Arduino
- Умная копилка: управление монетоприёмником на Arduino Nano
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- Интеграция ёмкостного сканера отпечатков DFRobot с Arduino или ESP8266
- Интерактивный HMI-проект на Nextion с Arduino Mega и датчиками
- Роботизированная рука 6 степеней свободы на Arduino Mega с управлением через Nunchuk
- Измерение солнечной радиации на Arduino UNO с Ethernet Shield
- Компактный радар на Arduino Nano с HC-SR04 и дисплеем 1.8"