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

commit 72bcacb84c7d742562b2f0532735a5ff438adcac
parent b3fe0cc2d8a0082da393cc0f272487f54bf5c384
Author: Francisco Armando Rosmino <franciscorosmino@rosmino.com.ar>
Date:   Mon,  5 Oct 2026 12:31:55 -0300

catan-duel: search_old.c en duel/, fuera del core que recorre el CMake de la Pico

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Diffstat:
M.gitignore | 3+--
MCLAUDE.md | 2+-
Mcatan/Makefile | 16+++++++++-------
3 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -29,5 +29,4 @@ ajedrez/engine/stockfish kit-picocalc.zip catan/release/ catan/catan-duel -catan/core/search_old.c -catan/core/search_old.o +catan/duel/ diff --git a/CLAUDE.md b/CLAUDE.md @@ -66,7 +66,7 @@ Al correr pruebas o el binario, aislar `XDG_CONFIG_HOME`/`XDG_DATA_HOME` en un d - `ctrl.c`: máquina de estados de interacción **compartida** por TUI, GUI y PicoCalc (teclas abstractas / clicks resueltos → `Move`). - i18n: `strings.h` es una X-macro `X(id, es, en)`; todo texto visible va ahí y se lee con `tr()`. - Reglas configurables en `Opts` (variante 2p, ladrón amable, fichas, etc.). - - Bots: tres niveles, todos ISMCTS (`search.c`, `search_decide` + `SearchCfg` en `Host.bot`) con distinta cantidad de iteraciones: fácil 25 (empata con el bot de reglas), medio 300 (le gana ~57 %), difícil 30000 en la PC / 20000 en el servidor (`bot_iters` en `linux/session.c`; config `bot_level`). `bot.c` es el bot de reglas: ya no es un nivel, queda para los playouts, las ausencias y el fallback (iters 0). Determiniza solo lo oculto para ese asiento, candidatas podadas con `bot_int.h`, playouts con `bot_decide`, horizonte 8 + evaluación. Árbol estático (`SEARCH_NODES`, 1024 en la Pico): una búsqueda a la vez. Corta por tiempo: 300 ms Linux (`sess_set_bots`), 150 ms servidor, 1200 ms Pico. **Todo cambio de bots se mide nueva contra vieja**: `make catan-duel` (lleva además la `search.c` de `DUEL_BASE`, por defecto el último tag, con el símbolo renombrado a `search_old_decide`) y `./catan-duel --duel 80 4 100 8 - <semilla>` enfrenta la búsqueda nueva contra la vieja en la misma partida rotando asientos (base 25 % con 4 jugadores; correr dos semillas, el ruido con 80 partidas es ±8 puntos). `--duel` en `./catan` sigue siendo contra los heurísticos y solo sirve de sanidad. + - Bots: tres niveles, todos ISMCTS (`search.c`, `search_decide` + `SearchCfg` en `Host.bot`) con distinta cantidad de iteraciones: fácil 25 (empata con el bot de reglas), medio 300 (le gana ~57 %), difícil 30000 en la PC / 20000 en el servidor (`bot_iters` en `linux/session.c`; config `bot_level`). `bot.c` es el bot de reglas: ya no es un nivel, queda para los playouts, las ausencias y el fallback (iters 0). Determiniza solo lo oculto para ese asiento, candidatas podadas con `bot_int.h`, playouts con `bot_decide`, horizonte 8 + evaluación. Árbol estático (`SEARCH_NODES`, 1024 en la Pico): una búsqueda a la vez. Corta por tiempo: 300 ms Linux (`sess_set_bots`), 150 ms servidor, 1200 ms Pico. **Todo cambio de bots se mide nueva contra vieja**: `make catan-duel` (lleva además la `search.c` de `DUEL_BASE`, por defecto el último tag, en `duel/search_old.c` con el símbolo renombrado a `search_old_decide`) y `./catan-duel --duel 80 4 100 8 - <semilla>` enfrenta la búsqueda nueva contra la vieja en la misma partida rotando asientos (base 25 % con 4 jugadores; correr dos semillas, el ruido con 80 partidas es ±8 puntos). `--duel` en `./catan` sigue siendo contra los heurísticos y solo sirve de sanidad. - **`gfx/`** (`catan_gfx.h`): tablero y pantallas de Catan en píxeles (layouts compact 320x320 y wide) sobre `comun/gfx`. `geom_fit(geo, game, ...)` encuadra cualquier tablero por los límites de sus vértices. Panel ancho: con más de 4 jugadores las filas son más bajas; acciones y costos van en dos columnas. - **GUI ancha**: lienzo lógico de 640x360 (16:9) con escala **entera** (`gk_open_fluid` en `comun/linux/guikit.c`: 2x en 720p, 3x en 1080p; un factor no entero deja la letra despareja). Pensada para 720p/1080p (los amigos de Pancho juegan en Windows con `catan.exe`). Fuentes en `comun/gfx/font.c`, generadas por `comun/tools/mkfont.py` desde `comun/tools/fonts/`: Terminus 6x12 (normal, y engrosada a 7x12 como negrita) y Spleen 5x8 (chica, con los acentos del castellano agregados). - **`linux/`**: cliente. `frontend.h` define la interfaz TUI (`tui.c`, sobre `comun/linux/tuikit`; colores opacos propios — el usuario no quiere depender de la transparencia de su terminal) / GUI (`gui_sdl.c`, sobre `guikit`). `app.c` menús y bucle, `session.c` guardado, `net.c`/`online.c` red (sobre `netline`). diff --git a/catan/Makefile b/catan/Makefile @@ -10,7 +10,7 @@ CPPFLAGS += -I. $(COMUN_INC) -DFORM_MAX_FIELDS=32 VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev) $(shell printf '#define APP_VERSION "%s"\n' '$(VERSION)' > linux/version.h.tmp; \ cmp -s linux/version.h.tmp linux/version.h || mv linux/version.h.tmp linux/version.h; rm -f linux/version.h.tmp) -CORE := $(filter-out core/search_old.c,$(wildcard core/*.c)) # search_old.c es solo de catan-duel +CORE := $(wildcard core/*.c) GFX := $(wildcard gfx/*.c) LINUX := $(wildcard linux/*.c) SERVER := server/catan_game.c server/export.c @@ -128,13 +128,15 @@ pico: # Duelo nueva vs vieja: catan-duel lleva ademas la search.c de DUEL_BASE (un tag o commit # del git) con el simbolo renombrado; --duel ahi enfrenta la busqueda nueva contra la vieja # en la misma partida, rotando asientos. Asi se ve si un cambio del bot es positivo. -DUEL_BASE ?= v1.1.1 -core/search_old.c: FORCE +# (va en duel/, no en core/: core/*.c lo recorren este Makefile y el CMake de la Pico) +DUEL_BASE ?= $(shell git describe --tags --abbrev=0 2>/dev/null || echo v1.1.2) +duel/search_old.c: FORCE + mkdir -p duel git show $(DUEL_BASE):catan/core/search.c > $@ -core/search_old.o: core/search_old.c $(HDRS) - $(CC) $(CPPFLAGS) $(CFLAGS) -Dsearch_decide=search_old_decide -c $< -o $@ -catan-duel: $(CLIENT_SRC) $(HDRS) core/search_old.o - $(CC) $(CPPFLAGS) $(CFLAGS) -DDUEL_OLD -o $@ $(CLIENT_SRC) core/search_old.o $(LDLIBS) +duel/search_old.o: duel/search_old.c $(HDRS) + $(CC) $(CPPFLAGS) -Icore $(CFLAGS) -Dsearch_decide=search_old_decide -c $< -o $@ +catan-duel: $(CLIENT_SRC) $(HDRS) duel/search_old.o + $(CC) $(CPPFLAGS) $(CFLAGS) -DDUEL_OLD -o $@ $(CLIENT_SRC) duel/search_old.o $(LDLIBS) FORCE: debug: