Stockfish es uno de los motores mas poderosos de ajedrez, y también es open source.
Me interesa la idea de ejecutar algún código Android que interactúe con el motor.
Una cosa importante para aclarar, es el GUI (Interfaz gráfica) y el UCI (Protocolo de comunicación con el motor) son dos cosas completamente separadas e intercambiables. O sea, con una GUI se puede dialogar con distintos engines a través del UCI y viceversa.
En este post vamos a registrar algunas pruebas sencillas para comprender como funciona el engine stockfish, a través de enviarle comandos que respetan al protocolo UCI
http://support.stockfishchess.org/kb/advanced-topics/compiling-stockfish-on-mac-os-x
Y tenemos el código fuente descargado y compilado en:
O sea, estamos jugando 1. e4 e5 que es la apertura peón rey, peón rey. ¿Como sigue la partida? Demos agregar todas las jugadas.... tal como se muestra en el script a continuación (O sea, el motor no se "acuerda" la posición.... en cada movimiento hay que darle toda la historia de la partida
O sea, si hacemos 2. Cf3 hay que indicar las jugadas anteriores
La respuesta recibida es:bestmove b8c6 ponder f1b5
O sea el motor elige jugar 2... Cc6 y recomienda 3. Ab5 con lo cual
De esta manera, cumplimos un segundo objetivo del post que es jugar contra el stockfish por linea de comandos, para entender el protocolo UCI
por ahora interrumpimos el post en este punto
http://web.comhem.se/petero2home/javachess/index.html
http://web.comhem.se/petero2home/droidfish/index.html
http://talkchess.com/
http://chessprogramming.wikispaces.com/
Me interesa la idea de ejecutar algún código Android que interactúe con el motor.
Una cosa importante para aclarar, es el GUI (Interfaz gráfica) y el UCI (Protocolo de comunicación con el motor) son dos cosas completamente separadas e intercambiables. O sea, con una GUI se puede dialogar con distintos engines a través del UCI y viceversa.
En este post vamos a registrar algunas pruebas sencillas para comprender como funciona el engine stockfish, a través de enviarle comandos que respetan al protocolo UCI
Comencemos
Bajamos y Compilamos el código fuente
Seguimos las instrucciones de:http://support.stockfishchess.org/kb/advanced-topics/compiling-stockfish-on-mac-os-x
Y tenemos el código fuente descargado y compilado en:
/Users/pabloin/Stockfish/src
De los cuales sobresale el binario:
MacBook-Pro-de-Pablo:src pabloin$ ls -la st*
-rwxr-xr-x 1 pabloin staff 262276 Apr 24 2015 stockfish
Este binario es únicamente el ENGINE, o sea el módulo que juega al ajedrez
Para utilizarlo, necesitaríamos tener una interfaz gráfica, o bien utilizar la linea de comandos.
veamos nuestro directorio de trabajo: movemos el binario stockfish y vamos a ejecutar algunos scripts:
La posición FEN del diagrama que se ve en el script, la podemos ver en:
Que es la siguiente siciliana:
Probamos el módulo stockfish, con la linea de comandos
Siguiendo las recomendaciones de
Invocamos al binario stockfish con comandos del protocolo UCI (Universal chess Interface):
(Info oficial sobre el protocolo UCI:
https://en.wikipedia.org/wiki/Universal_Chess_Interface
http://download.shredderchess.com/div/uci.zip)
http://download.shredderchess.com/div/uci.zip)
Y genera la siguiente salida:
Observemos, que el resultado del stockfish es
bestmove c5d4 ponder c2c3
O sea, que con el diagrama FEN precedente sugiere la jugada c5xd4 la cual es la mejor jugada de las negras en esa posición de Siciliana. Además, pareciera que pondera para el blanco la jugada: c2-c3 que es similar al Gambito Morra y una linea fácil de jugar para el blanco por la ventaja que gana de desarrollo y espacio a cambio de un peón...
Al momento, tenemos el primer objetivo cumplido, que es la interacción con el módulo.
Comentarios:
- Se utiliza UCI para "hablar con el módulo"
- Posiciones en formato FEN
- Notación algebraica extendida.
( echo "setoption name Hash value 128" ; echo "setoption name threads value 1" ; echo "setoption name Contempt Factor value 50" ; echo "position fen r1bqkbnr/pp1ppppp/2n5/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq - 0 3" ; echo "go movetime 1000" ; sleep 5 ) | stockfishOtras
( echo "setoption name Hash value 128" ; echo "setoption name threads value 1" ; echo "setoption name Contempt Factor value 50" ; echo "position startpos moves e2e4" ; echo "go movetime 1000" ; sleep 5 ) | stockfish
Jugamos con el módulo stockfish, con la linea de comandos
En el ejemplo anterior partimos de una posición particular (FEN). Si quisiéramos jugar contra el motor, tendríamos:
( echo "setoption name Hash value 128" ; echo "setoption name threads value 1" ; echo "setoption name Contempt Factor value 50" ; echo "position startpos moves e2e4" ; echo "go movetime 1000" ; sleep 5 ) | stockfish
A lo que el motor responde:
bestmove e7e5 ponder b1c3
O sea, estamos jugando 1. e4 e5 que es la apertura peón rey, peón rey. ¿Como sigue la partida? Demos agregar todas las jugadas.... tal como se muestra en el script a continuación (O sea, el motor no se "acuerda" la posición.... en cada movimiento hay que darle toda la historia de la partida
O sea, si hacemos 2. Cf3 hay que indicar las jugadas anteriores
( echo "setoption name Hash value 128" ; echo "setoption name threads value 1" ; echo "setoption name Contempt Factor value 50" ; echo "position startpos moves e2e4 e7e5 g1f3" ; echo "go movetime 1000" ; sleep 5 ) | stockfish
La respuesta recibida es:bestmove b8c6 ponder f1b5
O sea el motor elige jugar 2... Cc6 y recomienda 3. Ab5 con lo cual
De esta manera, cumplimos un segundo objetivo del post que es jugar contra el stockfish por linea de comandos, para entender el protocolo UCI
por ahora interrumpimos el post en este punto
Links
Relacionado a la programación del stockfish y desarrollo sobre chess software
http://web.comhem.se/petero2home/droidfish/index.html
http://talkchess.com/
http://chessprogramming.wikispaces.com/