Движок и игра в «Дурака» на Rust: сильный ИИ-оппонент, веб-интерфейс для игры в браузере, текстовый протокол движка (как UCI у шахмат) и инструмент разбора партий.
Поддерживаются варианты подкидной (podkidnoy) и переводной (perevodnoy).
- ISMCTS (Information Set Monte Carlo Tree Search) — поиск по дереву с детерминизацией скрытой информации (карты соперника и колода неизвестны).
- Точный решатель эндшпиля — когда колода пуста и карт мало, позиция досчитывается точно, а не оценивается эвристикой.
- Эвристическая оценка позиций (
eval) с учётом длинных мастей и старшинства козырей. - Байесовская модель оппонента — движок уточняет распределение карт соперника по его ходам.
- Параллельный поиск на всех ядрах через
rayon— чем мощнее процессор, тем сильнее игра. - Эвристики и параметры поиска подбирались автотюнером (эволюционный поиск с чемпион-гейтингом).
| Крейт | Назначение |
|---|---|
foolfish-core |
Правила игры, состояние стола, генерация ходов, битовые маски карт. |
foolfish-search |
Движок: ISMCTS, решатель эндшпиля, оценка, модель оппонента, арена, тюнер. |
foolfish-cli |
Бинарники: foolfish (движок), serve (веб), play (консоль), analyze (разбор). |
Бинари под Windows x86_64 и Linux x86_64 собираются автоматически на каждый push в main и лежат в релизах: foolfish-x86_64-pc-windows-msvc.zip и foolfish-x86_64-unknown-linux-gnu.tar.gz. Внутри все четыре программы. Под macOS готовых сборок нет — собирай из исходников (см. ниже).
Нужен Rust stable (edition 2021).
cargo build --release
cargo test # прогнать тестыcargo run --release --bin serve # http://localhost:8080
cargo run --release --bin serve 9000 # другой порт
HOST=0.0.0.0 cargo run --release --bin serve # слушать снаружи (см. ниже)Открой http://localhost:8080. Клик по карте в руке — ход; снизу кнопки «Взять» / «Бито».
- 📊 — статистика движка (что считал, насколько уверен).
- 📁 — архив сыгранных партий: реплей по ходам ⏮◀▶⏭ + анализ 📈.
- «Новая игра» — раздать заново.
Партии пишутся в папку games/ рядом с запуском.
⚠️ По умолчаниюserveслушает только127.0.0.1(локально).HOST=0.0.0.0открывает порт наружу — делай это осознанно и только на доверенной машине/сервере: аутентификации у сервера нет.
Текстовый протокол в stdin/stdout (аналог UCI). Команды: ffi, position, go, stop, quit.
ffi
position ffen hand:8c,As table:7c- discard:- opp:6 deck:27 trump:Ks me:defend turn:me variant:podkidnoy
go iters 40000
В ответ — строки info move <ход> score <0..1> visits <n> и финальная bestmove <ход>.
Позиция задаётся в нотации FFEN (hand: / table: / discard: / opp: / deck: / trump: / me: / turn: / variant:).
cargo run --release --bin play -- <seed> [номера ходов...]Показывает стол и список ходов с номерами; ходы передаются их номерами.
cargo run --release --bin analyze -- <seed> <файл-лога.txt>Считает потерю % на каждом твоём ходу, помечает неточности и зевки (то же доступно в вебе кнопкой 📈).