From ef827371593fe2c5c87bb2cf966b8644a9325146 Mon Sep 17 00:00:00 2001 From: ShenMian Date: Wed, 17 Jan 2024 02:12:51 +0800 Subject: [PATCH] refactor: refactor some code --- src/main.rs | 5 ++++- src/resources.rs | 5 +++-- src/systems/input.rs | 13 ------------- src/systems/render.rs | 1 - src/systems/solver.rs | 28 +++++++++++++++++++++++----- 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7233b54..c763ce4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -122,7 +122,10 @@ fn main() { app.add_systems( OnEnter(AppState::AutoSolve), - (spawn_lowerbound_marks, clear_action_state), + ( + (setup_solver, spawn_lowerbound_marks).chain(), + clear_action_state, + ), ) .add_systems(Update, update_solver.run_if(in_state(AppState::AutoSolve))) .add_systems(OnExit(AppState::AutoSolve), despawn_lowerbound_marks) diff --git a/src/resources.rs b/src/resources.rs index 4288714..f2a96aa 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -1,4 +1,5 @@ use bevy::prelude::*; +use bevy::time::Stopwatch; use nalgebra::Vector2; use serde::{Deserialize, Serialize}; @@ -72,14 +73,14 @@ impl Default for AutoCratePushState { #[derive(Resource)] pub struct SolverState { pub solver: Mutex, - pub timer: std::time::Instant, + pub stopwatch: Stopwatch, } impl Default for SolverState { fn default() -> Self { Self { solver: Mutex::new(Solver::new(Level::empty())), - timer: std::time::Instant::now(), + stopwatch: Stopwatch::new(), } } } diff --git a/src/systems/input.rs b/src/systems/input.rs index 72b2c1a..41229e9 100644 --- a/src/systems/input.rs +++ b/src/systems/input.rs @@ -310,25 +310,12 @@ pub fn handle_viewport_zoom_action( pub fn handle_automatic_solution_action( action_state: Res>, - mut solver_state: ResMut, - board: Query<&Board>, - settings: Res, - state: Res>, mut next_state: ResMut>, ) { if action_state.just_pressed(Action::AutomaticSolution) { - let board = &board.single().board; - - let SolverState { solver, timer } = &mut *solver_state; - if *state == AppState::Main { - let mut solver = solver.lock().unwrap(); - *solver = Solver::new(board.level.clone()); - solver.initial(settings.solver.strategy, settings.solver.lower_bound_method); - next_state.set(AppState::AutoSolve); - *timer = std::time::Instant::now(); } else { next_state.set(AppState::Main); } diff --git a/src/systems/render.rs b/src/systems/render.rs index 6febb47..afc7fbd 100644 --- a/src/systems/render.rs +++ b/src/systems/render.rs @@ -1,6 +1,5 @@ use bevy::prelude::*; use bevy::winit::WinitWindows; -use itertools::Itertools; use crate::components::*; use crate::events::*; diff --git a/src/systems/solver.rs b/src/systems/solver.rs index cf29cb5..7bdc299 100644 --- a/src/systems/solver.rs +++ b/src/systems/solver.rs @@ -48,6 +48,19 @@ pub fn despawn_lowerbound_marks( marks.for_each(|entity| commands.entity(entity).despawn()); } +pub fn setup_solver( + mut solver_state: ResMut, + board: Query<&Board>, + settings: Res, +) { + let board = &board.single().board; + let SolverState { solver, stopwatch } = &mut *solver_state; + let mut solver = solver.lock().unwrap(); + *solver = Solver::new(board.level.clone()); + solver.initial(settings.solver.strategy, settings.solver.lower_bound_method); + stopwatch.reset(); +} + pub fn update_solver( mut solver_state: ResMut, mut board: Query<&mut Board>, @@ -56,10 +69,11 @@ pub fn update_solver( mut next_state: ResMut>, ) { let board = &mut board.single_mut().board; - let SolverState { solver, timer } = &mut *solver_state; + let SolverState { solver, stopwatch } = &mut *solver_state; let mut solver = solver.lock().unwrap(); - let timeout = std::time::Duration::from_millis(100); + let timeout = std::time::Duration::from_millis(50); + let timer = std::time::Instant::now(); match solver.solve(timeout) { Ok(solution) => { let mut verify_board = board.clone(); @@ -68,9 +82,10 @@ pub fn update_solver( } assert!(verify_board.is_solved()); + stopwatch.tick(timer.elapsed()); info!( "Solver: Solved ({} sec)", - timer.elapsed().as_millis() as f32 / 1000.0 + stopwatch.elapsed().as_millis() as f32 / 1000.0 ); info!( " Moves: {}, pushes: {}", @@ -85,12 +100,15 @@ pub fn update_solver( next_state.set(AppState::Main); } Err(SolveError::NoSolution) => { + stopwatch.tick(timer.elapsed()); info!( "Solver: No solution ({} sec)", - timer.elapsed().as_millis() as f32 / 1000.0 + stopwatch.elapsed().as_millis() as f32 / 1000.0 ); next_state.set(AppState::Main); } - Err(SolveError::Timeout) => (), + Err(SolveError::Timeout) => { + let _ = stopwatch.tick(timer.elapsed()); + } } }