A minesweeper solver (and soon, engine). Still WIP, and rest of this doc is Claude.
use demine::board::Board;
use demine::solver::Solver;
use rand::SeedableRng;
use rand::rngs::SmallRng;
let (w, h, n_mines) = (8, 8, 10);
let mut rng = SmallRng::seed_from_u64(0);
// Generate a random board and reveal one safe cell to get started.
let mut board = Board::random_mines(w, h, n_mines, &mut rng);
board.reveal_random_non_mine(&mut rng);
// Ask the solver for a guaranteed-safe cell given the current known state.
let mut solver = Solver::new(w, h, 0);
let mut view = solver.with_known(board.known(), Some(n_mines)).unwrap();
let (row, col) = view.find_safe_cell().unwrap();
println!("safe cell: ({row}, {col})");board— board state, cell references, reveal / mine-set primitives.generator— mine placement and board generation.solver— solver entry point; deeper logic lives insrc/solver/.utils— shared helpers (parsing, neighbor iteration, formatting).
use-mimalloc— swap the global allocator to mimalloc (v3). Off by default; enable for benchmarks and release runs where allocator wins matter.
release— max optimizations (fat LTO, single codegen unit).testing— release-optimized but withdebug_assertionson; used by thecargo test-allalias to catch UB / overflow in hot paths.profiling— release + debug symbols, for perf tools (samply, Instruments).