Cap. 16 - Las dos puertas hacia pensarRapido
cap. 16 Protocolo · 2012 y ahora
Las dos puertas hacia pensarRapido
El núcleo de bitboards, alfa-beta, evaluación y hash es el de 2012. No lo he reescrito. Lo que sí cambió es cómo el binario habla con una interfaz. Analogía: dos mostradores, UCI y CECP/xboard, que entregan el mismo encargo a la misma cocina: pensarRapido(). El plato no cambia. Cambia el idioma del camarero.
El binario arranca en consola (mangoac [blancas]>). Desde ahí, uci entra en uci.c; xboard entra en el bucle de 2012 en comandos.c. stdout va sin buffer para que la GUI no se cuelgue esperando un flush.
UCI: el mostrador nuevo
Handshake: id name Mango AC 1.1, id author Jose Andres Morales Linares, uciok. isready → readyok. ucinewgame llama a nuevo_juego(). setoption y stop se aceptan y se ignoran: no hay opciones UCI ni aborto cooperativo de la búsqueda. quit cierra el libro (y las bitbases, si se compiló con ellas) y sale.
position startpos [moves …] o position fen … [moves …]. Cada token de moves se parsea, se hace, y se descarta si deja al propio rey en jaque. Luego go rellena profundidad y maxTiempo (entrada del reloj) y llama a pensarRapido(). Al terminar: bestmove e2e4 (o 0000 si no hay jugada) y aplico esa jugada en el tablero interno, igual que xboard con move.
Durante la búsqueda, si esUCI, cada iteración emite una línea info, no el formato xboard post:
info depth D score cp N time T nodes N nps N pv e2e4 e7e5 … info depth D score mate M …
El mate interno es VALOR_JAQUE_MATE = 99000 centésimas de peón. UCI quiere «mate en M jugadas»: (99000 − score) / 2 + 1 (y el simétrico si el mate es en contra). Un movimiento de libro no imprime Book move: solo el bestmove.
xboard: el mostrador de 2012
El bucle de xboard() es el de entonces: si le toca a la máquina, busca y responde move e2e4. Ponderación opcional sobre el segundo ply de la PV (pensar en el tiempo del rival). Comandos CECP: new, force, go, white/black, undo/remove, setboard, level, st, sd, time, otim, hint, post/nopost, ping, quit, ?.
En protover me identifico. El único cambio de protocolo aquí es myname: ya no el nombre anterior, sino Mango AC.
feature setboard=1 analyze=0 ping=1 colors=0 draw=0
sigint=0 sigterm=0 usermove=0 variants="normal"
myname="Mango AC 1.1"
feature done=1
Con post, cada iteración imprime profundidad score tiempo nodos pv en una línea, el dialecto clásico de WinBoard. La GUI envía jugadas en algebraico largo; yo las parseo, compruebo legalidad y, si me toca, busco.
La misma cocina
| Qué | UCI | xboard |
|---|---|---|
| Posición | position |
setboard / jugadas |
| Buscar | go |
turno de la máquina / go |
| Salida | info + bestmove |
post + move |
| Núcleo | pensarRapido() |
pensarRapido() |
Cute Chess, Arena o mi interfaz GTK hablan UCI. WinBoard habla CECP. El bitboard no se entera. Eso es lo que quería: modernizar la puerta, no la cocina.
Qué archivos leer
| Archivo | Qué hay |
|---|---|
uci.c |
Handshake, position, go, bestmove |
comandos.c |
xboard(), protover, move |
busquedad.c |
Líneas info si esUCI; post si no |
El repositorio del motor: GitHub.
Cierre
Dos mostradores, una cocina. UCI es lo que añadí para que las GUI de ahora no tengan que hablar CECP. xboard sigue ahí, con el nombre nuevo en myname. El núcleo de 2012 no se enteró. Encaja con el reloj (quién llena maxTiempo) y con FEN (cómo llega la posición por texto).
Antes de fiarse del generador, se cuenta el árbol sin tasar. Eso es Perft. La siguiente entrada.
Correo de contacto: comprasmangocomputer@gmail.com

Comentarios
Publicar un comentario