Working wasm
This commit is contained in:
+21
-29
@@ -1,14 +1,13 @@
|
||||
use std::{fmt::Display, time::Duration};
|
||||
use std::fmt::Display;
|
||||
|
||||
use crate::{
|
||||
board::{piece::Piece, Board},
|
||||
solver::Solver,
|
||||
};
|
||||
use indicatif::ProgressBar;
|
||||
use rand::{seq::*, Rng};
|
||||
|
||||
use macroquad::{prelude::rand, time};
|
||||
|
||||
pub fn generate(num_pieces: u32, num_solutions: u32) -> GenerateStats {
|
||||
let rand = rand::thread_rng();
|
||||
let candidate_pieces = vec![
|
||||
Piece::Pawn,
|
||||
Piece::Pawn,
|
||||
@@ -34,31 +33,23 @@ pub fn generate(num_pieces: u32, num_solutions: u32) -> GenerateStats {
|
||||
}
|
||||
|
||||
let attempts: u32 = 1000;
|
||||
let bar = ProgressBar::new_spinner();
|
||||
bar.enable_steady_tick(Duration::from_millis(100));
|
||||
let mut overall_stats = GenerateStats::new(0, 0, 0, 0, None);
|
||||
let mut overall_stats = GenerateStats::new(0, 0, 0, 0., None);
|
||||
for _ in 0..attempts {
|
||||
let stats = try_generate(
|
||||
num_pieces,
|
||||
num_solutions,
|
||||
candidate_pieces.clone(),
|
||||
rand.clone(),
|
||||
);
|
||||
let stats = try_generate(num_pieces, num_solutions, candidate_pieces.clone());
|
||||
overall_stats.piece_total += stats.piece_total;
|
||||
overall_stats.piece_success += stats.piece_success;
|
||||
overall_stats.total += stats.total;
|
||||
overall_stats.total_millis += stats.total_millis;
|
||||
overall_stats.total_seconds += stats.total_seconds;
|
||||
overall_stats.board = stats.board;
|
||||
bar.set_message(format!(
|
||||
println!(
|
||||
"Generating puzzle.. Elapsed: {}s",
|
||||
overall_stats.total_millis / 1000
|
||||
));
|
||||
overall_stats.total_seconds,
|
||||
);
|
||||
if overall_stats.board.is_some() {
|
||||
return overall_stats;
|
||||
}
|
||||
}
|
||||
|
||||
bar.finish_and_clear();
|
||||
overall_stats
|
||||
}
|
||||
|
||||
@@ -66,7 +57,7 @@ pub struct GenerateStats {
|
||||
piece_total: u32,
|
||||
piece_success: u32,
|
||||
total: u32,
|
||||
total_millis: u128,
|
||||
total_seconds: f64,
|
||||
board: Option<Board>,
|
||||
}
|
||||
|
||||
@@ -75,14 +66,14 @@ impl GenerateStats {
|
||||
piece_total: u32,
|
||||
piece_success: u32,
|
||||
total: u32,
|
||||
total_millis: u128,
|
||||
total_millis: f64,
|
||||
board: Option<Board>,
|
||||
) -> Self {
|
||||
Self {
|
||||
piece_total,
|
||||
piece_success,
|
||||
total,
|
||||
total_millis,
|
||||
total_seconds: total_millis,
|
||||
board,
|
||||
}
|
||||
}
|
||||
@@ -92,7 +83,7 @@ impl GenerateStats {
|
||||
add_stat(&mut stats, "Total attempts", self.total);
|
||||
add_stat(&mut stats, "Total pieces placed", self.piece_total);
|
||||
add_stat(&mut stats, "Success pieces placed", self.piece_success);
|
||||
add_stat(&mut stats, "Total time (ms)", self.total_millis);
|
||||
add_stat(&mut stats, "Total time (ms)", self.total_seconds);
|
||||
|
||||
println!("{}", stats);
|
||||
}
|
||||
@@ -113,28 +104,28 @@ fn try_generate(
|
||||
num_pieces: u32,
|
||||
num_solutions: u32,
|
||||
mut candidate_pieces: Vec<Piece>,
|
||||
mut rand: rand::prelude::ThreadRng,
|
||||
) -> GenerateStats {
|
||||
let mut board = Board::new();
|
||||
let mut piece_total = 0;
|
||||
let mut piece_success = 0;
|
||||
let now = std::time::Instant::now();
|
||||
let now = time::get_time();
|
||||
for _ in 0..num_pieces {
|
||||
let mut placed = false;
|
||||
let empty_squares = board.empty_squares();
|
||||
let mut attempts = 15;
|
||||
while !placed {
|
||||
if attempts == 0 {
|
||||
let elapsed = now.elapsed().as_millis();
|
||||
let elapsed = time::get_time() - now;
|
||||
return GenerateStats::new(piece_total, piece_success, 1, elapsed, None);
|
||||
}
|
||||
|
||||
attempts -= 1;
|
||||
piece_total += 1;
|
||||
|
||||
let index = rand.gen_range(0..candidate_pieces.len());
|
||||
let index = rand::gen_range(0, candidate_pieces.len());
|
||||
let piece = candidate_pieces[index];
|
||||
let mut random_square = empty_squares.choose(&mut rand).unwrap().clone();
|
||||
let square_index = rand::gen_range(0, empty_squares.len());
|
||||
let mut random_square = empty_squares[square_index].clone();
|
||||
random_square.piece = Some(piece);
|
||||
board.set(random_square.clone());
|
||||
let solutions = Solver::new(board.clone()).solve();
|
||||
@@ -151,7 +142,7 @@ fn try_generate(
|
||||
}
|
||||
|
||||
let solutions = Solver::new(board.clone()).solve();
|
||||
let elapsed = now.elapsed().as_millis();
|
||||
let elapsed = time::get_time() - now;
|
||||
if solutions.len() > num_solutions as usize {
|
||||
GenerateStats::new(piece_total, piece_success, 1, elapsed, None)
|
||||
} else {
|
||||
@@ -165,7 +156,8 @@ mod tests {
|
||||
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
// Figure out a way to remove the macroquad dependencies from this package
|
||||
// #[test]
|
||||
fn generator_smoke() {
|
||||
for _ in 0..10 {
|
||||
let gen_stats = generate(5, 5);
|
||||
|
||||
Reference in New Issue
Block a user