¿Qué sucede cuando enfrentas dos lógicas de programación distintas en un entorno de reglas estrictas? Para responder esto, desarrollé un proyecto en Python que funciona como un entorno de ejecución (Engine) donde diferentes scripts de IA pueden competir entre sí.
En este post, explico cómo diseñé el tablero, las reglas y el experimento de enfrentar a white.py contra black.py.
1. El Árbitro: Un motor de reglas puras
A diferencia de otros proyectos, aquí el "motor" no es quien juega. Su única misión es ser el sistema operativo del tablero. Está programado para:
Validar movimientos legales: Asegurar que ninguna IA intente saltarse las reglas.
Gestionar el estado: Controlar enroques, capturas al paso y promociones.
Detectar el final: Aplicar las reglas de tablas por insuficiencia de material, triple repetición y la regla de los 50 movimientos.
2. El Experimento: white.py vs. black.py
La verdadera magia ocurre en los archivos externos. El motor actúa como un "Coliseo" que le entrega el estado actual del tablero a cada archivo y espera una respuesta.
Esto permite realizar experimentos de Benchmarking de IA:
Lógica de Búsqueda: ¿Quién calcula mejor, un script basado en Minimax o uno basado en heurísticas experimentales?
Optimización: Cómo afecta el tiempo de respuesta (
time.time()) en la calidad de la jugada devuelta.Heurísticas de Evaluación: Comparar cómo diferentes algoritmos valoran la posición de las piezas en el tablero.
3. Anatomía del Motor (The Backbone)
El código está diseñado para ser modular y transparente. Algunos puntos clave de la implementación:
Clonación de Tablero: El motor permite a las IAs clonar el estado actual para simular jugadas futuras sin afectar la partida real.
PGN Builder: Generación automática de notación estándar para que las partidas puedan ser analizadas en visores externos.
Visualización en Consola: Un sistema de renderizado ASCII que permite seguir la "pelea" en tiempo real desde la terminal.
4. ¿Por qué separar el tablero de la lógica?
Separar el motor de los jugadores (white.py y black.py) ofrece ventajas críticas para el desarrollo de software:
Modularidad: Puedes cambiar la lógica de una IA sin tocar una sola línea de código de las reglas del ajedrez.
Imparcialidad: Ambos scripts reciben exactamente la misma información del estado del juego (
get_state()).Escalabilidad: Es fácil añadir nuevos "jugadores" y enfrentarlos en un torneo tipo Round Robin.
El experimento: Crónica de una masacre algorítmica
El desarrollo de este coliseo no fue lineal; fue una evolución de "supervivencia del más apto". En las primeras pruebas, GPT, utilizando un prompt inicial optimizado, barrió completamente con las versiones básicas de Gemini y superó con claridad a DeepSeek. Parecía que el trono estaba definido.
Sin embargo, el panorama cambió cuando entró Claude en escena. Con una lógica de cálculo mucho más profunda y una gestión del árbol de decisiones superior, Claude destronó a GPT y "destrozó" a todos los demás competidores sin piedad.
Lo más interesante del experimento vino después: al aplicar los principios de optimización y la estructura de código que usaba Claude a las otras IAs, lograron una nivelación. Aunque seguían jugando con menos precisión, estas versiones mejoradas pudieron empezar a forzar tablas por repetición. Pasaron de suicidios tácticos a partidas donde la defensa era lo suficientemente sólida para no perder.
Del código al tablero: ¿Cómo se genera el PGN?
Para que estas partidas no se queden solo en líneas de log en la terminal, el software implementa un PGN Builder. El PGN (Portable Game Notation) es el estándar universal para registrar partidas de ajedrez.
¿Cómo funciona el flujo de datos?
Captura del movimiento: Cada vez que
white.pyoblack.pydeciden una jugada, el motor registra la casilla de origen, la de destino y si hubo captura o promoción.Traducción a Notación Algebraica: El motor convierte las coordenadas internas del array (ej.
[7, 4]) a notación estándar (ej.e1).Detección de estados especiales: El software verifica si el movimiento resultó en jaque (+), jaque mate (#) o si fue un enroque (O-O).
Exportación: Al finalizar el juego, todos estos strings se concatenan siguiendo el formato:
1. e4 e5 2. Nf3 Nc6....
Visualización en Chess.com o Lichess
El resultado final es un bloque de texto que puedes copiar y pegar directamente en herramientas como el Analizador de Chess.com o Chess Compass. Estas plataformas leen el archivo PGN, reconstruyen la partida visualmente y te permiten usar motores como Stockfish para ver exactamente en qué jugada Claude le ganó la partida a Gemini.
Desafío Open Source
He subido este entorno de competencia a mi repositorio. Si eres desarrollador y quieres probar tu propia lógica de ajedrez, solo tienes que crear tu propio script y enfrentarlo en el tablero.
Repositorio del proyecto: https://github.com/davdomin/chess_motor
¿Qué estrategia usarías para ganar: un ataque agresivo basado en material o una defensa sólida basada en posición? Te leo en los comentarios.

