From afc66d3013b7d47c6c22d6a99809bc3e7d1ff0dc Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Thu, 24 Oct 2024 14:44:20 +0200 Subject: implement breadth-first search pathfinding --- PathfindingContext.cpp | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) (limited to 'PathfindingContext.cpp') diff --git a/PathfindingContext.cpp b/PathfindingContext.cpp index cfebb44..bcc9f37 100644 --- a/PathfindingContext.cpp +++ b/PathfindingContext.cpp @@ -2,19 +2,36 @@ #include "XY.h" #include "Museum.h" #include "NullTileBehavior.h" +#include "ToggleMuseumPauseCommand.h" + +#include "DijkstraPathfinder.h" +#include "BreadthFirstPathfinder.h" using namespace std; -PathfindingContext::PathfindingContext(Museum & m) : museum(m) {} +PathfindingContext::PathfindingContext(Museum & m) : museum(m) { + // this->solvers.push_back(unique_ptr(new DijkstraPathfinder(m))); + this->solvers.push_back(unique_ptr(new BreadthFirstPathfinder(m))); +} + +void PathfindingContext::cycle_solver() { + this->solver_index = (this->solver_index + 1) % this->solvers.size(); +} + +Pathfinder & PathfindingContext::get_solver() { + return *this->solvers[this->solver_index]; +} void PathfindingContext::set_start(const XY & point) { - if (!this->valid_point(point)) return; + if (!this->valid_point(point)) return; this->start_point = point; + this->update(); } void PathfindingContext::set_end(const XY & point) { - if (!this->valid_point(point)) return; + if (!this->valid_point(point)) return; this->end_point = point; + this->update(); } bool PathfindingContext::valid_point(const XY & point) { @@ -31,3 +48,20 @@ bool PathfindingContext::valid_point(const XY & point) { return true; } +void PathfindingContext::update() { + bool valid = true; + if (!this->valid_point(this->start_point)) { + this->start_point = { -1, -1 }; + valid = false; + } + if (!this->valid_point(this->end_point)) { + this->end_point = { -1, -1 }; + valid = false; + } + if (!valid) return; + + ToggleMuseumPauseCommand(this->museum, true).execute(); + Pathfinder & solver = this->get_solver(); + solver.find_between(this->start_point, this->end_point); +} + -- cgit v1.2.3