Programación

DENTRO DE UN MOTOR DE AJEDREZ

El objetivo de estas lecciones es comprender profundamente como está hecho un motor de ajedrez e iniciarse en el conocimiento del lenguaje de programación C necesario para ello (la mayoría de motores están construidos en este lenguaje). El curso va dirigido a todas aquellas personas aficionadas al ajedrez y a la informática que seguro que tienen esa curiosidad (no siendo necesario conocimientos previos de programación) y espero que sea de utilidad para nuevos programadores.

Para las lecciones voy a utilizar el código fuente de mi propio motor, DanaSah, pero si un día termino estas lecciones y las sigues espero que a partir de entonces no solo puedas entender como funciona mi motor sino también otros e incluso animarte a comenzar el tuyo.

DanaSah es un motor de ajedrez con protocolo xboard y que podrá jugar en aquellos GUIS que soporten dicho protocolo, como el propio Winboard (Windows) y xboard (Linux), Arena, ChessGUI e incluso Chessmaster. También mediante un adaptador llamado WB2UCI podrá jugar en GUIS que soporten el protocolo UCI como son Fritz, Shredder, etc.

DanaSah es un programa de código abierto y con licencia GPL, así que es posible descargarte gratuitamente el programa e incluso ver el código fuente utilizado para hacer el motor. El código fuente suele estar en una carpeta llamada src, en dicha carpeta encontrarás varios archivos con extensiones h y c. Todo el código del programa podría estar en un único archivo, pero al estar dividido en varios archivos la cosa está mejor organizada, vamos a encontrar más rápido el código que queremos ver o modificar y también lo harán otras personas. Si te fijas en los nombres de los archivos, estos están en castellano, la mayoría de programadores influenciados por programas de código abierto o páginas que hablan de detalles de programación en ajedrez utilizan nombres para los archivos (y para el código) en ingles. Para comprender un día esos programas es importante que vayamos conociendo también terminología en inglés, por ejemplo en castellano utilizamos búsqueda, en inglés search.

Una vez que tenemos la carpeta src con el código, ¿Qué archivo empezamos a estudiar y que orden seguimos? La verdad es que no hay establecido ningún orden, pero parece lógico comenzar por el archivo “definiciones.h”.

Para la lección 1 (14-02-2012) descarga el archivo "definiciones.h" (definiciones y estructuras), es un archivo que contiene código, lo bueno sería abrirlo con un programa para escribir código en lenguaje C, pero si no tenemos uno instalado lo podemos abrir con el bloc de notas (también os podéis instalar el notepad++). La explicación de dicho código la tendremos en el archivo pdf MOTOR_AJEDREZ_1.

Para la lección 2 (20-02-2012) descarga los archivos "variables.c" y "variables.h" (variables globales), la explicación de lo que es una variable, los diferentes tipos que tenemos, como crearlas y cuales utiliza nuestro motor lo tenemos en el archivo pdf MOTOR_AJEDREZ_2.

Para la lección 3 (25-02-2012) descarga los archivos "funciones.h" (pototipo de funciones) y "danasah.c" (función principal), en el archivo pdf MOTOR_AJEDREZ_3 encontraréis lo que es una función, lo que es un prototipo de función y lo que es la función main.

Si no has programado anteriormente, descarga el archivo pdf IDE (28-02-2012) para encontrar información sobre entornos integrados de desarrollo gratuitos para el lenguaje C, verás lo sencillo que es crear un ejecutable a partir del código fuente de un motor y podrás utilizar el IDE para empezar a realizar prácticas sobre dicho lenguaje. Como complemento al archivo pdf tenemos 2 vídeos:

El primero muestra qué sencillo es descargarse un entorno integrado de desarrollo y configurarlo (DEV-C++ portable). También se descargan 3 motores de ajedrez y se procede a crear un ejecutable para cada uno de ellos. El vídeo ha quedado un poco largo, unos 45 minutos, en parte por utilizar 3 motores en lugar de 1, pero de esta forma comprobáis que no solo funciona con DanaSah.

http://www.dailymotion.com/video/xpfeth_dev-c-and-chess-engines_tech

El segundo vídeo muestra como es posible crear ejecutables de 32 y 64 bit (64 bit siempre que hayamos descargado la versión de 64 bit y luego tengáis un sistema operativo de 64 bit para poder ejecutar el motor creado). También se ve como se pueden cambiar algunas opciones del compilador para crear ejecutables más rápidos. Este segundo vídeo tiene una duración de unos 23 minutos.

http://www.dailymotion.com/video/xphvs7_dev-c-ejecutables-rapidos-de-32-y-64-bit-para-tscp_tech

Para la lección 4 (01-03-2012) utiliza el archivo "danasah.c", en el archivo pdf MOTOR_AJEDREZ_4 encontraremos información de las instrucciones necesarias para comprender el código de la función main (también utilizadas en el resto de archivos) y tendremos una explicación de dicho código. Seguramente es una lección dura para aquellas personas que no han programado nunca, de golpe se enseñan unas 7 instrucciones, pero es algo necesario si queremos comprender el código o tener la opción de crear nuestro motor. Si superamos esta lección y la comprendemos, el resto creo que serán sencillas de comprender.

Para la lección 5 (05-03-2012) descarga los archivo "leer_archivo_ini.c" y "danasah.ini", el archivo "leer_archivo_ini.c" contiene el código necesario para abrir el archivo de configuración "danasah.ini", buscar dónde están los parámetros que ha definido el usuario y asignar el valor de dichos parámetros a las variables adecuadas, la explicación del código lo encontraremos en el archivo pdf MOTOR_AJEDREZ_5, que además de hablar del archivo de configuración explicará un segundo método para configurar los parámetros de un motor con protocolo xboard, la línea de comandos.

Para la lección 6 (06-03-2012) descarga el archivo "xboard.c", dicho archivo contiene el código sobre el protocolo xboard que nos permite comunicar el GUI con el motor. En el archivo pdf MOTOR_AJEDREZ_6 encontraremos la explicación sobre los protocolos y especialmente sobre el xboard y encontraremos la explicación de la función xboard().

Para la lección 7 (12-03-2012) descarga el archivo "fen.c", dicho archivo contiene el código de la función SetBoard(string) que permite iniciar las variables del motor de acuerdo a una posición entrada en formato FEN. El código de dicha función y el formato FEN están explicados en el archivo pdf MOTOR_AJEDREZ_7.

Para la lección 8 (20-03-2012) descarga el archivo "fen.c" que contiene la función Tablero_FEN(EPD) para convertir la posición interna de DanaSah al formato FEN y el archivo "libro.c" que contiene las funciones necesarias para manejar el libro de aperturas, cuando llamamos al libro de aperturas pasamos la posición en el formato FEN. El código de la función Tablero_FEN(EPD) e información sobre los libros de aperturas lo encontraremos en el archivo pdf MOTOR_AJEDREZ_8.

Para la lección 9 (29-03-2012) descarga el archivo "egbb.c" que contiene el código de acceso a las bitbases de Scorpio, en el archivo pdf MOTOR_AJEDREZ_9 encontramos información sobre el código además de información sobre bases de datos de finales.

Para la lección 10 (02-04-2012) descarga los archivos "entradas.c" y "salidas.c" que contienen el código para comprobar si recibimos un movimiento del contrario y si es el final de partida. La explicación del código lo tenemos en el archivo pdf MOTOR_AJEDREZ_10.

Para la lección 11 (13-04-2012) descarga el archivo "generarmovimiento.c" que contiene el código para generar todos los posibles movimientos para una posición. La explicación del código la tenemos en el archivo pdf MOTOR_AJEDREZ_11.

Para la lección 12 (28-04-2012) utiliza el archivo "generarmovimiento.c" que contiene el código para la función Hacer_movimiento() y Deshacer(). La explicación del código la tenemos en el archivo pdf MOTOR_AJEDREZ_12.

Para la lección 13 (10-05-2012) utiliza el archivo "atacado.c" que contiene el código para las funciones atacado() y EstaEnJaque(). La explicación del código la tenemos en el archivo pdf MOTOR_AJEDREZ_13.

Para la lección 14 (07-06-2012) utiliza los archivos "busqueda.c" y "entradas.c" que contienen el código para las funciones MotorPiensa() y get-ms() respectivamente. La explicación del código la tenemos en el archivo pdf MOTOR_AJEDREZ_14.