README.md (10244B)
1 # Ajedrez en C — terminal, gráfico, online y PicoCalc 2 3 Ajedrez completo (reglas FIDE) escrito en C99 portable, el port del ajedrez en 4 Bash (`../ajedrez/`). El mismo núcleo corre en: 5 6 - **la terminal** (ncurses, casillas de color y piezas Unicode), 7 - **una ventana gráfica** (SDL3, piezas en pixel art), 8 - **un servidor** para tu VPS (partidas en vivo o **por correspondencia**, que sobreviven reinicios), 9 - **la PicoCalc** (Raspberry Pi Pico 1), con **cable 1v1** entre dos PicoCalc. 10 11 Trae su propio motor, así que no hace falta Stockfish (si está, se usa como nivel 12 extra y para el análisis). Usa la biblioteca 13 compartida `../comun/` (la misma de Catan). 14 15 ## Compilar 16 17 Dependencias: `gcc`/`clang`, `make`, `ncursesw`, `SDL3` (para la GUI y el simulador). 18 19 ```sh 20 make # ajedrez, ajedrez-server, ajedrez-picosim 21 make test # pruebas del núcleo + 100 partidas motor contra motor 22 make pico # firmware PicoCalc (ver más abajo) 23 ``` 24 25 ## Jugar 26 27 ```sh 28 ./ajedrez # menú (terminal) 29 ./ajedrez-gui # lo mismo, en ventana gráfica (= ./ajedrez --gui) 30 ./ajedrez-picosim --scale 3 # simulador de la PicoCalc en la PC 31 32 ./ajedrez ai # contra la máquina 33 ./ajedrez hotseat # dos personas en la misma compu 34 ./ajedrez watch # máquina contra máquina 35 ./ajedrez puzzle # puzzles 36 ./ajedrez resume # retomar la última partida 37 ./ajedrez import [archivo] # importar una partida (PGN o FEN) y seguirla, o verla en el visor 38 ./ajedrez pgn partida.pgn # visor de PGN (← → para moverse, p para jugar desde ahí) 39 ./ajedrez fen "FEN" # jugar desde una posición 40 ./ajedrez online mivps.com # mis partidas en el servidor 41 ./ajedrez host # crear partida en red local 42 ./ajedrez join 192.168.0.10 # unirse a una partida en red local 43 ``` 44 45 Opciones: `--gui`, `--layout wide|compact`, `--scale N`, `--lang es|en`. 46 Las partidas se guardan solas en `~/.local/share/ajedrez/saves/` (y se exportan a 47 PGN o FEN desde el menú de la partida). 48 49 **PGN automático:** después de cada jugada se escribe el PGN de la partida al lado 50 del guardado (`saves/<fecha>.pgn`) y una copia en `~/.local/share/ajedrez/ultima.pgn`. 51 La ruta aparece en el menú de la partida (`m`) y se imprime al salir. Lo podés 52 editar y volver a cargar con "Importar partida". 53 54 **Deshacer después del final:** si la partida terminó por el tablero (mate, ahogado, 55 repeticiones, 75 jugadas, material insuficiente) y se permite deshacer, `u` la 56 revive. Sirve para probar jugadas. Por abandono, tiempo o acuerdo no se deshace. 57 58 **Importar:** en el menú, "Importar partida". Pegás un PGN (o solo la lista de 59 jugadas, en SAN o UCI) o un FEN, o abrís un archivo. Después podés seguirla de a 60 dos o contra la máquina (eligiendo tu color), o mirarla en el visor. 61 62 **Stockfish (opcional, solo Linux):** si hay un Stockfish, aparece el nivel 63 "Stockfish" (1 s por jugada, fuerza completa) y el "Analizar la partida" lo usa 64 en vez del motor propio. Se busca en `$CHESS_STOCKFISH`, en `engine/stockfish` 65 al lado del ejecutable, en `../ajedrez/engine/stockfish` (el que baja 66 `get-stockfish.sh` del bash) y en el PATH. Si no arranca, juega el nivel Máximo. 67 68 **El motor como UCI:** `./ajedrez --uci` habla UCI por stdin/stdout, para usarlo 69 desde cutechess, fastchess, python-chess o una interfaz gráfica. La opción 70 `Level` (0..4) elige el nivel; `go` a secas usa los límites del nivel, y 71 `movetime`, `wtime/btime`, `depth`, `nodes` e `infinite` los pisan. 72 73 **Fuerza de los niveles** (2026-09-29, `tools/match.py` contra Stockfish 18 con 74 `UCI_Elo`, 40 partidas por cruce; es Elo de la escala CCRL Blitz de Stockfish, no 75 FIDE, y arriba de 2400 esa escala probablemente infla): Fácil ~880, Principiante 76 ~1200, Medio ~1550, Difícil ~1750, Máximo ~2600 (1,5 s por jugada; con 4 s daba 77 apenas ~50 más). 78 79 - **En la terminal:** la pantalla se suelta un momento; pegás y terminás con Ctrl-D. 80 - **En la GUI:** se toma del portapapeles. 81 82 ### Controles 83 84 | Tecla | Acción | 85 |---|---| 86 | Flechas / hjkl | mover el cursor por el tablero | 87 | Enter / Espacio | elegir la pieza (se marcan sus destinos) y después el destino | 88 | Tab | siguiente pieza que se puede mover (o siguiente destino) | 89 | `:` | escribir la jugada (SAN como `Nf3`, `exd5`, `O-O`, o UCI como `g1f3`) | 90 | Esc | cancelar la elección / menú de la partida | 91 | `m` | menú de la partida: tablas, deshacer, abandonar, girar, tema, exportar, análisis | 92 | `u` `d` `c` `r` | pedir deshacer, ofrecer tablas, reclamar tablas, abandonar | 93 | `a` / `n` | aceptar / rechazar una oferta del rival | 94 | `f` `t` `e` | girar el tablero, cambiar de tema, barra de evaluación | 95 | `?` `L` `q` | ayuda, idioma, salir (la partida queda guardada) | 96 97 Con mouse (terminal o GUI) se hace clic en la pieza y en el destino. Al coronar se 98 elige la pieza (←→ o `d`/`t`/`a`/`c`, en inglés `q`/`r`/`b`/`n`). 99 100 ## Reglas 101 102 Todas las de la FIDE: enroque, captura al paso, coronación, jaque mate y ahogado. 103 Las tablas son así: 104 105 - Por **3 repeticiones** o **50 jugadas** se reclaman (`c`). 106 - Por **5 repeticiones** o **75 jugadas** terminan solas. 107 - También terminan solas por **material insuficiente**, o si al rival se le cae la 108 bandera y no tenés material para dar mate. 109 - Hay tablas de común acuerdo. 110 111 Reloj: presets 1, 3, 5, 10 y 15 minutos, más 3+2, 5+5, 10+5 y 15+10. En online hay 112 además **correspondencia**: 1, 3 o 7 días por jugada. 113 114 ## La máquina 115 116 Motor propio: 117 118 - **Búsqueda:** alfa-beta con profundización iterativa, búsqueda de quietud, tabla 119 de transposición, killers, movida nula y reducciones. 120 - **Evaluación:** tablas pieza-casilla PeSTO, pareja de alfiles y peones pasados. 121 - **Aperturas:** abre con el libro que viene de `../ajedrez/lib/openings.tsv`. 122 123 Hay 5 niveles. Los bajos eligen al azar entre jugadas parecidas, para equivocarse 124 como una persona. En la PC el nivel máximo juega bastante fuerte. 125 126 - **Análisis:** al terminar la partida, en el menú de la partida, marca las 127 imprecisiones (?!), los errores (?) y los errores graves (??) con la jugada mejor. 128 - **Evaluación:** la barra se prende y se apaga con `e`. 129 130 ## Puzzles 131 132 Los puzzles de `puzzles.tsv` se compilan dentro del programa (así andan también en 133 la PicoCalc). Cada uno está verificado: la solución es legal, los mates terminan en 134 mate y el motor encuentra la primera jugada. Los del ajedrez en Bash tenían errores 135 (jugadas ilegales, FEN inválidos) y no se usan. 136 137 ## Online: servidor en tu VPS 138 139 ```sh 140 make ajedrez-server-static 141 scp ajedrez-server ../comun/deploy/install-vps.sh root@mivps:/tmp/ 142 ssh root@mivps sh /tmp/install-vps.sh ajedrez 7374 /tmp/ajedrez-server "Servidor de ajedrez" 143 ``` 144 145 Eso crea el usuario `ajedrez`, guarda las partidas en `/var/lib/ajedrez` y lo deja 146 corriendo con systemd en el puerto **7374** (abrilo en el firewall). Puede convivir 147 con el de Catan (7373) en el mismo VPS. 148 149 - **Crear partida:** eligen color, reloj (o días por jugada), si se puede deshacer 150 y contra quién (una persona o la máquina, que juega en el servidor). Te da un 151 **código** de 6 letras para pasarle a tu rival. 152 - **Mis partidas:** muestra las tuyas, primero las que dicen **¡TE TOCA!**. 153 - **El reloj lo lleva el servidor**, que también hace caer la bandera. 154 - **En vivo y por correspondencia son lo mismo:** cerrá cuando quieras y retomá 155 otro día. 156 157 Cada asiento tiene un token secreto en `~/.local/share/ajedrez/online` (no hay cuentas). 158 159 ## PicoCalc 160 161 ```sh 162 make pico # arma la carpeta sd/ lista para copiar 163 ``` 164 165 Copiá a la tarjeta SD lo que corresponda a tu cargador: 166 167 - **Bootloader v0.5 de ClockworkPi:** `sd/firmware/Ajedrez.bin` a `firmware/`. 168 - **uf2loader:** `sd/pico1-apps/Ajedrez.uf2` a `pico1-apps/`. 169 170 Además, `sd/AJEDREZ.SAV` (la partida guardada) y `sd/AJEDREZ.LOG` (el diagnóstico 171 del arranque) van a la raíz de la SD **solo la primera vez**. La flash de la Pico 172 no se escribe nunca. 173 174 Menú: 175 - contra la máquina, dos jugadores, máquina contra máquina y puzzles; 176 - continuar la partida guardada; 177 - **cable 1v1**: una PicoCalc crea (A) y la otra se une (B). Es el mismo cable que 178 Catan (J703: pin 4 ↔ 5, 5 ↔ 4, 8 ↔ 8). 179 180 **"Prueba: velocidad y puzzles"** mide la velocidad del motor en el aparato y deja 181 el resultado en pantalla y en `AJEDREZ.LOG`. Mientras la máquina piensa, **Esc** la 182 hace jugar lo que tenga. 183 184 ## Cómo está hecho 185 186 ``` 187 core/ reglas, notación, PGN, partida, motor, aperturas, puzzles, controlador de UI 188 (C99 sin malloc ni stdio: compila igual para Linux y el RP2040) 189 gfx/ dibujo en pixeles: tablero, piezas (generadas de DejaVu Sans), pantallas 190 linux/ cliente: TUI, GUI, menús, sesión (el motor piensa en otro hilo), red, pruebas 191 server/ el ajedrez como módulo del servidor de comun/ (también embebido en `ajedrez host`) 192 pico/ firmware PicoCalc: app.c (portable, corre igual en el simulador) 193 tools/ generadores de book_data.c, puzzles_data.c y pieces.c; match.py (partidas contra Stockfish) 194 ``` 195 196 La idea central es la misma que en Catan: **una partida es la posición inicial más 197 el log de acciones**: 198 199 - **Acciones:** jugadas (con los milisegundos usados), ofertas de tablas, 200 deshacer, abandono y caída de bandera. 201 - **La autoridad** valida cada acción y pone el tiempo. Según el modo es el 202 servidor, el host, la PicoCalc A o el propio programa en una partida local. 203 - **Lo que sale de eso:** guardar, retomar, reconectar, deshacer (devuelve el 204 tiempo) y la correspondencia. 205 206 ### Pruebas 207 208 ```sh 209 ./ajedrez --selftest # perft, reglas, FEN, SAN, PGN, reloj, deshacer, motor, puzzles 210 ./ajedrez --selftest --deep # perft completo (millones de nodos) en 6 posiciones de referencia 211 ./ajedrez --sim 200 1 # 200 partidas motor contra motor con jugadas al azar: legalidad, 212 # hash incremental, que toda partida termine, ida y vuelta por PGN 213 ./ajedrez --perft 5 [FEN] # perft por jugada 214 ./ajedrez --bench # velocidad del motor 215 ./ajedrez --uci # el motor como motor UCI 216 tools/match.py --level 4 --elo 2200 --games 40 --concurrency 6 # contra Stockfish limitado (python-chess) 217 make debug && make test # con AddressSanitizer / UBSan 218 ```