mark visited and starting states

This commit is contained in:
2026-02-23 14:38:53 +01:00
parent 6698ace0c6
commit 4f6e98bae8
5 changed files with 30 additions and 6 deletions

View File

@ -71,8 +71,9 @@ public:
auto UpdateTextureSizes() -> void; auto UpdateTextureSizes() -> void;
auto DrawMassSprings(const MassSpringSystem &mass_springs, auto DrawMassSprings(const MassSpringSystem &mass_springs,
const State &current_state, const State &current_state, const State &starting_state,
const std::unordered_set<State> &winning_states) -> void; const std::unordered_set<State> &winning_states,
const std::unordered_set<State> &visited_states) -> void;
auto DrawKlotski(const State &state, int hov_x, int hov_y, int sel_x, auto DrawKlotski(const State &state, int hov_x, int hov_y, int sel_x,
int sel_y, int block_add_x, int block_add_y, int sel_y, int block_add_x, int block_add_y,

View File

@ -19,6 +19,7 @@ public:
bool edited = false; bool edited = false;
std::unordered_set<State> winning_states; std::unordered_set<State> winning_states;
std::unordered_set<State> visited_states;
public: public:
StateManager(MassSpringSystem &mass_springs) StateManager(MassSpringSystem &mass_springs)
@ -52,6 +53,8 @@ public:
auto FindWinningStates() -> void; auto FindWinningStates() -> void;
auto CurrentGenerator() -> StateGenerator;
auto CurrentWinCondition() -> WinCondition; auto CurrentWinCondition() -> WinCondition;
}; };

View File

@ -23,8 +23,6 @@
// - Click states to display them in the board // - Click states to display them in the board
// - Find shortest path to any winning state and mark it in the graph // - Find shortest path to any winning state and mark it in the graph
// - Also mark the next move along the path on the board // - Also mark the next move along the path on the board
// TODO: Mark the starting state
// TODO: Mark the visited states
auto main(int argc, char *argv[]) -> int { auto main(int argc, char *argv[]) -> int {
// if (argc < 2) { // if (argc < 2) {
@ -103,7 +101,8 @@ auto main(int argc, char *argv[]) -> int {
renderer.UpdateTextureSizes(); renderer.UpdateTextureSizes();
renderer.DrawMassSprings(mass_springs, state.current_state, renderer.DrawMassSprings(mass_springs, state.current_state,
state.winning_states); state.CurrentGenerator()(), state.winning_states,
state.visited_states);
renderer.DrawKlotski(state.current_state, input.hov_x, input.hov_y, renderer.DrawKlotski(state.current_state, input.hov_x, input.hov_y,
input.sel_x, input.sel_y, input.block_add_x, input.sel_x, input.sel_y, input.block_add_x,

View File

@ -63,7 +63,9 @@ auto Renderer::ReallocateGraphInstancingIfNecessary(
auto Renderer::DrawMassSprings(const MassSpringSystem &mass_springs, auto Renderer::DrawMassSprings(const MassSpringSystem &mass_springs,
const State &current_state, const State &current_state,
const std::unordered_set<State> &winning_states) const State &starting_state,
const std::unordered_set<State> &winning_states,
const std::unordered_set<State> &visited_states)
-> void { -> void {
ZoneScoped; ZoneScoped;
@ -124,6 +126,19 @@ auto Renderer::DrawMassSprings(const MassSpringSystem &mass_springs,
} }
} }
// Mark visited states
for (const auto &state : visited_states) {
const Mass &visited_mass = mass_springs.GetMass(state);
DrawCube(visited_mass.position, VERTEX_SIZE * 1.5, VERTEX_SIZE * 1.5,
VERTEX_SIZE * 1.5, PURPLE);
}
// Mark starting state
const Mass &starting_mass = mass_springs.GetMass(starting_state);
DrawCube(starting_mass.position, VERTEX_SIZE * 2, VERTEX_SIZE * 2,
VERTEX_SIZE * 2, ORANGE);
// Mark current state // Mark current state
const Mass &current_mass = mass_springs.GetMass(current_state); const Mass &current_mass = mass_springs.GetMass(current_state);
DrawCube(current_mass.position, VERTEX_SIZE * 2, VERTEX_SIZE * 2, DrawCube(current_mass.position, VERTEX_SIZE * 2, VERTEX_SIZE * 2,

View File

@ -64,11 +64,13 @@ auto StateManager::UpdateGraph() -> void {
if (win_conditions[current_preset](current_state)) { if (win_conditions[current_preset](current_state)) {
winning_states.insert(current_state); winning_states.insert(current_state);
} }
visited_states.insert(current_state);
} }
} }
auto StateManager::ClearGraph() -> void { auto StateManager::ClearGraph() -> void {
winning_states.clear(); winning_states.clear();
visited_states.clear();
mass_springs.Clear(); mass_springs.Clear();
mass_springs.AddMass(MASS, false, current_state); mass_springs.AddMass(MASS, false, current_state);
@ -88,6 +90,10 @@ auto StateManager::FindWinningStates() -> void {
<< std::endl; << std::endl;
} }
auto StateManager::CurrentGenerator() -> StateGenerator {
return generators[current_preset];
}
auto StateManager::CurrentWinCondition() -> WinCondition { auto StateManager::CurrentWinCondition() -> WinCondition {
return win_conditions[current_preset]; return win_conditions[current_preset];
} }