juegos

Juegos de terminal de Pancho: Catan (TUI, GUI, web, servidor, PicoCalc), ajedrez, calculadora y minijuegos
git clone https://git.lu3dhn.xyz/juegos.git
Log | Files | Refs

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 ```