Gin Rummy Engine
Bots and strategy tooling for gin rummy, built on the gin-rummy mechanics crate. Where gin-rummy answers "what moves are legal?", this crate answers "which move should I make?"
The design triangle:
Strategy: a decision procedure for one seat — take or pass the upcard, where to draw, what to shed, whether to knock, what to lay off.View: the information a seat may legally see. The underlyingRoundexposes both hands and the stock order; strategies never touch it. AViewshows only the seat's own hand, the discard pile, the stock count, and what the opponent has revealed (cards taken from the pile, discards, declined upcards).Table: the driver. It owns theRound, tracks each seat's knowledge, asks strategies for decisions, and applies them — so information hygiene holds by construction.
Bots
HeuristicBot: deterministic and fast. Draws from the pile only when that strictly lowers deadwood, sheds the least useful card weighted by how dangerous it is to the opponent, knocks by a configurable threshold, and lays off greedily but never breaks its own melds.MonteCarloBot(featurerand): determinized Monte Carlo. At each decision it samples hidden worlds consistent with theView— opponent hands containing every known card, random stock orders over the unseen cards — rolls each out with the greedy policy, and picks the action with the best expected score.
Quick start
A bot-vs-bot round needs no features:
use ;
use ;
let hands: = ;
# let rest: = .iter.collect;
let = ; // the other 32 cards
let round = from_deal?;
let result = play_round?;
println!;
# Ok::
With the (default) rand feature, deal and settle whole games:
#
#
#
#
Writing your own bot is implementing Strategy's four decisions against a
View; the driver handles all bookkeeping.
Feature flags
rand(default): the Monte Carlo bot,Table::deal,play_game, and the examples. Disable it for a dependency-free heuristic-only build.
Examples
play: play against a bot in the terminal —cargo run --example play(--bot mc,--rules classic, …)arena: bot-vs-bot tournaments with win-rate statistics —cargo run --release --example arena -- --rounds 1000 --p1 greedy --p2 mc:64