From 6bfa05c292931da0a96b851387701015a823bf3c Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 18 May 2026 15:57:53 -0700 Subject: [PATCH] add benchmark --- Cargo.lock | 9 +++++++++ Cargo.toml | 1 + klondike-bench/Cargo.toml | 12 ++++++++++++ klondike-bench/src/main.rs | 30 ++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 klondike-bench/Cargo.toml create mode 100644 klondike-bench/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index ee32cd3..527dd87 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,6 +132,15 @@ dependencies = [ "rand", ] +[[package]] +name = "klondike-bench" +version = "0.1.0" +dependencies = [ + "card_game", + "klondike", + "rand", +] + [[package]] name = "klondike-cli" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 9a21340..e3ed5fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ members = [ "card_game", "klondike", + "klondike-bench", "klondike-cli", ] resolver = "3" diff --git a/klondike-bench/Cargo.toml b/klondike-bench/Cargo.toml new file mode 100644 index 0000000..ac98652 --- /dev/null +++ b/klondike-bench/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "klondike-bench" +version = "0.1.0" +edition = "2024" + +[dependencies] +card_game.workspace = true +klondike.workspace = true +rand = { version = "0.10.1", default-features = false } + +[lints] +workspace = true diff --git a/klondike-bench/src/main.rs b/klondike-bench/src/main.rs new file mode 100644 index 0000000..d6a790d --- /dev/null +++ b/klondike-bench/src/main.rs @@ -0,0 +1,30 @@ +use card_game::Game; +use klondike::{Klondike, KlondikeConfig, KlondikeStats, Rng}; + +fn play_to_win(rng: &mut Rng) -> bool { + // create game session + let mut game = Klondike::with_rng(rng); + let mut stats = KlondikeStats::new(); + const CONFIG: KlondikeConfig = KlondikeConfig { + draw_stock: klondike::DrawStockConfig::DrawOne, + }; + // play game a bit + while let Some(instruction) = game.get_auto_move() + && !game.is_win() + { + game.process_instruction(&mut stats, &CONFIG, instruction); + + // quit after 250 moves + if 250 < stats.moves() { + return false; + } + } + game.is_win() +} +fn main() { + use rand::SeedableRng; + let mut rng = Rng::seed_from_u64(0); + const GAMES: u32 = 10000; + let wins: u32 = (0..GAMES).map(|_| play_to_win(&mut rng) as u32).sum(); + println!("wins = {wins}/{GAMES} win_rate = {}%", wins * 100 / GAMES); +}