Construa um Jogo da Velha Touchscreen no Arduino Due
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino Due | 1 |
| Display TFT 2.8" com Touchscreen Resistivo (ILI9341) | 1 |
| Jumpers (fios macho-macho) | 1 kit |
Aplicativos
- Arduino IDE
Sobre o Projeto
Implementação do clássico Jogo da Velha (Tic-Tac-Toe) em tela touchscreen 2.8" com Arduino Due. O jogador compete contra uma IA invencível (algoritmo Minimax). Baseado no projeto de nickthegreek82, com otimizações de código e IA aprimorada (créditos a klauscam).
Bibliotecas Necessárias
- Adafruit GFX Library
- Adafruit ILI9341 Library
- URTouch Library
Ligação (Wiring)
Touchscreen → Arduino Due
- T_IRQ → 22
- T_DO → 24
- T_DIN → 26
- T_CS → 28
- T_CLK → 30
Display → 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
Funcionamento
- Tela inicial: botão "Gamestart".
- Escolha quem começa: "YOU" (você) ou "CPU".
- Tabuleiro 3x3 desenhado com linhas brancas.
- Sua jogada: toque no quadrante desejado (X azul).
- Jogada da CPU: círculo vermelho, calculado por Minimax.
- Detecção de vitória/empate com linha branca sobre a sequência vencedora.
- Fim de jogo: tela "GAME OVER" com resultado (HUMAN WINS, CPU WINS, DRAW) e botão "Again?".
Código
Duas versões disponíveis:
1. Versão Original (IA básica)
// Inclui bibliotecas, define pinos, bitmaps de X e O (PROGMEM)
// Setup: inicializa touch, display, desenha tela inicial, espera toque no botão start.
// Loop: zera tabuleiro, pergunta quem começa, desenha grade, alterna jogadas.
// playerMove(): lê toque, mapeia coordenadas para índice 0-8, desenha X.
// arduinoMove(): estratégia simples – cantos primeiro, centro, bloqueio, aleatório.
// checkWinner(): verifica 8 combinações, desenha linha vencedora.
// waitonetouch(): bloqueia até toque detectado.
2. Versão Otimizada – IA Invencível (Minimax)
// Mesmas bibliotecas, pinos e bitmaps.
// Loop principal:
// - Desenha tela inicial, espera "Gamestart".
// - Pergunta quem começa (botões YOU/CPU).
// - Desenha grade (linhas mais grossas via loop de 7 pixels).
// - For turn = 0 to 8 while win(board)==0:
// if ((turn+player)%2==0) computerMove(board); else playerMove(board);
// - Exibe resultado, espera toque para reiniciar.
// computerMove(): Minimax com poda (depth limitado por 'difficulty').
// Tenta todos os movimentos vazios, chama minimax(board, -1, depth+1),
// escolhe movimento com maior score (pior para oponente).
// minimax(): retorna score terminal (1, -1, 0) ou melhor score recursivo.
// win(board): verifica array wins[8][3] para vitória.
// playerMove(): lê toque, mapeia regiões de toque para índices 0-8.
// drawBitmap(): renderiza bitmap PROGMEM pixel a pixel.
// drawCpuMove()/drawPlayerMove(): chamam drawBitmap nas coordenadas certas.
Esquemático

Processo de manufatura
- Cartão de Visita PCB 4×4 Jogo da Velha Personalizado – Guia de Design, Montagem e Código
- Sensor K30 CO₂: Monitoramento de Qualidade do Ar Interno em Tempo Real
- Facilitando Comunicação Surdo-Cego com 1Sheeld e Arduino
- Mealheiro Inteligente: Controlar Aceitador de Moedas com Arduino Nano
- Controlar um LED via Bluetooth com Arduino – Guia DIY Simples
- Integrando Sensor de Impressão Digital Capacitivo DFRobot com Arduino ou ESP8266
- Projeto HMI Interativo com Nextion, Arduino Mega e Sensores
- Braço Robótico 6 GDL Controlado por Nunchuk com Arduino Mega
- Medição Precisa de Radiação Solar com Arduino UNO e Ethernet Shield
- Sistema Radar Compacto com Arduino Nano, Sensor HC-SR04 e Display 1.8"