Files
card_game/klondike-bench/src/main.rs
T
Quaternions 64a94c6072 Implement improved scoring (#13)
Closes #10

Reviewed-on: #13
Co-authored-by: Rhys Lloyd <krakow20@gmail.com>
Co-committed-by: Rhys Lloyd <krakow20@gmail.com>
2026-05-29 20:18:57 +00:00

49 lines
1.5 KiB
Rust

use card_game::Game;
use klondike::{Klondike, KlondikeConfig, KlondikeStats, Rng, ScoringConfig};
const MAX_MOVES: usize = 250;
fn play_to_win(rng: &mut Rng) -> Option<KlondikeStats> {
// create game session
let mut game = Klondike::with_rng(rng);
let mut stats = KlondikeStats::new();
const CONFIG: KlondikeConfig = KlondikeConfig {
draw_stock: klondike::DrawStockConfig::DrawOne,
move_from_foundation: klondike::MoveFromFoundationConfig::Allowed,
scoring: ScoringConfig::DEFAULT,
};
// play game a bit
while let Some(instruction) = game.get_auto_move(&CONFIG)
&& !game.is_win()
{
// quit before 250 moves
if (MAX_MOVES as u32) < stats.moves() + 1 {
return None;
}
game.process_instruction(&mut stats, &CONFIG, instruction);
}
game.is_win().then_some(stats)
}
fn main() {
use rand::SeedableRng;
let mut rng = Rng::seed_from_u64(0);
const GAMES: u32 = 1000;
let mut wins = 0;
let mut score_tally = [0usize; MAX_MOVES * 10 / 5];
let mut recycle_tally = [0usize; MAX_MOVES];
let mut moves_tally = [0usize; MAX_MOVES];
for _ in 0..GAMES {
if let Some(stats) = play_to_win(&mut rng) {
wins += 1;
score_tally[(stats.score(&ScoringConfig::DEFAULT) / 5) as usize] += 1;
recycle_tally[stats.recycle_count() as usize] += 1;
moves_tally[stats.moves() as usize] += 1;
}
}
println!("score_tally={score_tally:?}");
println!("recycle_tally={recycle_tally:?}");
println!("moves_tally={moves_tally:?}");
println!("wins = {wins}/{GAMES} win_rate = {}%", wins * 100 / GAMES);
}