Skip to content

Commit

Permalink
refactor: refactor some code
Browse files Browse the repository at this point in the history
  • Loading branch information
ShenMian committed Jan 16, 2024
1 parent 75d2966 commit ef82737
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 22 deletions.
5 changes: 4 additions & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
5 changes: 3 additions & 2 deletions src/resources.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use bevy::prelude::*;
use bevy::time::Stopwatch;
use nalgebra::Vector2;
use serde::{Deserialize, Serialize};

Expand Down Expand Up @@ -72,14 +73,14 @@ impl Default for AutoCratePushState {
#[derive(Resource)]
pub struct SolverState {
pub solver: Mutex<Solver>,
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(),
}
}
}
13 changes: 0 additions & 13 deletions src/systems/input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -310,25 +310,12 @@ pub fn handle_viewport_zoom_action(

pub fn handle_automatic_solution_action(
action_state: Res<ActionState<Action>>,
mut solver_state: ResMut<SolverState>,
board: Query<&Board>,
settings: Res<Settings>,

state: Res<State<AppState>>,
mut next_state: ResMut<NextState<AppState>>,
) {
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);
}
Expand Down
1 change: 0 additions & 1 deletion src/systems/render.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use bevy::prelude::*;
use bevy::winit::WinitWindows;
use itertools::Itertools;

use crate::components::*;
use crate::events::*;
Expand Down
28 changes: 23 additions & 5 deletions src/systems/solver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<SolverState>,
board: Query<&Board>,
settings: Res<Settings>,
) {
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<SolverState>,
mut board: Query<&mut Board>,
Expand All @@ -56,10 +69,11 @@ pub fn update_solver(
mut next_state: ResMut<NextState<AppState>>,
) {
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();
Expand All @@ -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: {}",
Expand All @@ -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());
}
}
}

0 comments on commit ef82737

Please sign in to comment.