Construye un Tres en Raya (Tic-Tac-Toe) Táctil en Arduino Due
Componentes y Suministros
| Arduino Due | × | 1 |
| Pantalla TFT 2,8" ILI9341 con pantalla táctil resistiva | × | 1 |
| Cables jumpers | × | 1 |
Aplicaciones y Servicios Online
- Arduino IDE
Sobre el Proyecto
Implementación del clásico Tres en Raya (Tic-Tac-Toe) en pantalla táctil 2,8" ILI9341 controlada por Arduino Due. Incluye dos versiones de IA: una básica y otra invencible basada en algoritmo Minimax. Requiere librerías Adafruit_GFX, Adafruit_ILI9341 y URTouch.
Cableado
Pantalla Táctil (URTouch) → Arduino Due
- T_IRQ → Pin 22
- T_DO → Pin 24
- T_DIN → Pin 26
- T_CS → Pin 28
- T_CLK → Pin 30
Pantalla TFT (SPI) → Arduino Due
- SDO (MISO) → Pin A.25 (Digital 25)
- LED → 3,3 V
- SCK → Pin A.27 (Digital 27)
- SDI (MOSI) → Pin A.26 (Digital 26)
- DC → Pin 9
- RESET → Pin 8
- CS → Pin 10
- GND → GND
- VCC → 3,3 V
Nota: El Arduino Due trabaja a 3,3 V; no alimentes la pantalla a 5 V.
Evolución del Código
- 08/2017: Versión inicial basada en nickthegreek82.
- 08/22/2017: Mejora de IA y optimización.
- 08/26/2017: Optimización adicional.
- 08/27/2017: ¿Puedes ganar a la CPU?
- 03/13/2018: IA mejorada (Minimax) gracias a klauscam.
Código
Versión 1 – IA Básica (Estrategia Heurística)
Comprueba líneas de dos fichas propias para ganar, bloquea al rival, ocupa centro, esquinas y finally aleatorio. Incluye bitmaps PROGMEM para X (azul) y O (rojo) de 65×65 px.
// Incluye librerías, define pines, bitmaps PROGMEM...
void setup() {
myTouch.InitTouch(); myTouch.setPrecision(PREC_HI);
tft.begin(); tft.setRotation(3);
// Pantalla de inicio, botón "Gamestart", selección quién empieza...
}
void loop() {
// Bucle principal: alterna playerMove() / arduinoMove()
// checkWinner() detecta 3 en raya y dibuja línea ganadora.
// Fin de partida: muestra resultado y botón "Again?".
}
// Funciones: playerMove(), arduinoMove(), checkOpponent(), checkWinner(),
// drawX(), drawCircle(), waitonetouch()...
Versión 2 – IA Invencible (Minimax)
Implementa Minimax con poda de profundidad configurable (difficulty). La CPU nunca pierde; lo mejor es empate. Código más limpio, usa win(board) para evaluar tablero y minimax(board, player, depth) para elegir jugada óptima.
int minimax(int board[9], int player, int depth) {
int winner = win(board);
if (winner != 0) return winner * player;
int bestScore = -2, move = -1;
for (int i=0; i<9; ++i) if (board[i]==0) {
board[i] = player;
int score = (depth<difficulty) ? -minimax(board, -player, depth+1) : 0;
board[i] = 0;
if (score > bestScore) { bestScore = score; move = i; }
}
return (move==-1) ? 0 : bestScore;
}
void computerMove(int board[9]) {
int bestScore=-2, move=-1;
for(int i=0;i<9;++i) if(board[i]==0){
board[i]=1;
int s=-minimax(board,-1,0);
board[i]=0;
if(s>bestScore){bestScore=s; move=i;}
}
board[move]=1; drawCpuMove(move); delay(100);
}
Esquemático

Proceso de manufactura
- Tarjeta de visita PCB 4×4 Tic Tac Toe personalizada – Guía de diseño, construcción y código
- Sensor K30 CO₂: Monitorización en tiempo real de la calidad del aire interior
- Facilitar la comunicación sordo‑ciego usando 1Sheeld y Arduino
- Alcancía Inteligente: Controla un Aceptador de Monedas con Arduino Nano
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Integración del sensor de huella capacitivo DFRobot (ID809) con Arduino o ESP8266
- Proyecto HMI Interactivo con Nextion, Arduino Mega y Múltiples Sensores
- Brazo Robótico de 6 Grados de Libertad Controlado por Nunchuk con Arduino
- Medición Precisa de Radiación Solar con Arduino UNO y Shield Ethernet
- Sistema Radar Compacto con Arduino Nano, Sensor HC-SR04 y Pantalla 1.8"
- Genera Tonos Musicales con Arduino: Guía Paso a Paso