diff --git a/include/states.hpp b/include/states.hpp new file mode 100644 index 0000000..3806681 --- /dev/null +++ b/include/states.hpp @@ -0,0 +1,168 @@ +#ifndef __STATES_HPP_ +#define __STATES_HPP_ + +#include +#include + +#include "klotski.hpp" + +using StateGenerator = std::function; + +inline auto state_simple_1r() -> State { + State s = State(4, 5, true); + s.AddBlock(Block(0, 0, 1, 2, true)); + + return s; +} + +inline auto state_simple_1r_wc(const State &state) -> bool { return false; } + +inline auto state_simple_1f() -> State { + State s = State(4, 5, false); + s.AddBlock(Block(0, 0, 1, 2, false)); + + return s; +} + +inline auto state_simple_1f_wc(const State &state) -> bool { return false; } + +inline auto state_simple_2r() -> State { + State s = State(4, 5, true); + s.AddBlock(Block(0, 0, 1, 2, false)); + s.AddBlock(Block(1, 0, 1, 2, false)); + + return s; +} + +inline auto state_simple_2r_wc(const State &state) -> bool { return false; } + +inline auto state_simple_2f() -> State { + State s = State(4, 5, false); + s.AddBlock(Block(0, 0, 1, 2, false)); + s.AddBlock(Block(1, 0, 1, 2, false)); + + return s; +} + +inline auto state_simple_2f_wc(const State &state) -> bool { return false; } + +inline auto state_simple_3r() -> State { + State s = State(4, 5, true); + s.AddBlock(Block(0, 0, 1, 2, false)); + s.AddBlock(Block(1, 0, 1, 2, false)); + s.AddBlock(Block(2, 0, 1, 2, false)); + + return s; +} + +inline auto state_simple_3r_wc(const State &state) -> bool { return false; } + +inline auto state_simple_3f() -> State { + State s = State(4, 5, false); + s.AddBlock(Block(0, 0, 1, 2, false)); + s.AddBlock(Block(1, 0, 1, 2, false)); + s.AddBlock(Block(2, 0, 1, 2, false)); + + return s; +} + +inline auto state_simple_3f_wc(const State &state) -> bool { return false; } + +inline auto state_complex_1r() -> State { + State s = State(6, 6, true); + s.AddBlock(Block(1, 0, 1, 3, false)); + s.AddBlock(Block(3, 0, 2, 1, false)); + s.AddBlock(Block(5, 0, 1, 3, false)); + s.AddBlock(Block(3, 2, 2, 1, true)); + s.AddBlock(Block(3, 3, 1, 2, false)); + s.AddBlock(Block(4, 4, 2, 1, false)); + + return s; +} + +inline auto state_complex_1r_wc(const State &state) -> bool { + return state.GetBlockAt(4, 2) == "ba"; +} + +inline auto state_complex_2r() -> State { + State s = State(6, 6, true); + s.AddBlock(Block(2, 0, 1, 3, false)); + s.AddBlock(Block(0, 2, 2, 1, true)); + s.AddBlock(Block(1, 3, 2, 1, false)); + s.AddBlock(Block(1, 4, 2, 1, false)); + s.AddBlock(Block(5, 4, 1, 2, false)); + s.AddBlock(Block(0, 5, 3, 1, false)); + + return s; +} + +inline auto state_complex_2r_wc(const State &state) -> bool { + return state.GetBlockAt(4, 2) == "ba"; +} + +inline auto state_complex_3r() -> State { + State s = State(6, 6, true); + s.AddBlock(Block(0, 0, 3, 1, false)); + s.AddBlock(Block(5, 0, 1, 3, false)); + s.AddBlock(Block(2, 2, 1, 2, false)); + s.AddBlock(Block(3, 2, 2, 1, true)); + s.AddBlock(Block(3, 3, 1, 2, false)); + s.AddBlock(Block(4, 3, 2, 1, false)); + s.AddBlock(Block(0, 4, 1, 2, false)); + s.AddBlock(Block(2, 4, 1, 2, false)); + s.AddBlock(Block(4, 4, 2, 1, false)); + s.AddBlock(Block(3, 5, 3, 1, false)); + + return s; +} + +inline auto state_complex_3r_wc(const State &state) -> bool { + return state.GetBlockAt(4, 2) == "ba"; +} + +inline auto state_complex_4f() -> State { + State s = State(4, 4, false); + s.AddBlock(Block(0, 0, 2, 1, false)); + s.AddBlock(Block(3, 0, 1, 1, false)); + s.AddBlock(Block(0, 1, 1, 2, false)); + s.AddBlock(Block(1, 1, 2, 2, false)); + s.AddBlock(Block(3, 1, 1, 1, false)); + s.AddBlock(Block(3, 2, 1, 1, false)); + s.AddBlock(Block(0, 3, 1, 1, false)); + s.AddBlock(Block(1, 3, 1, 1, false)); + + return s; +} + +inline auto state_complex_4f_wc(const State &state) -> bool { return false; } + +inline auto state_klotski() -> State { + State s = State(4, 5, false); + s.AddBlock(Block(0, 0, 1, 2, false)); + s.AddBlock(Block(1, 0, 2, 2, true)); + s.AddBlock(Block(3, 0, 1, 2, false)); + s.AddBlock(Block(0, 2, 1, 2, false)); + s.AddBlock(Block(1, 2, 2, 1, false)); + s.AddBlock(Block(3, 2, 1, 2, false)); + s.AddBlock(Block(1, 3, 1, 1, false)); + s.AddBlock(Block(2, 3, 1, 1, false)); + s.AddBlock(Block(0, 4, 1, 1, false)); + s.AddBlock(Block(3, 4, 1, 1, false)); + + return s; +} + +inline auto state_klotski_wc(const State &state) -> bool { + return state.GetBlockAt(1, 3) == "bb"; +} + +std::vector generators{ + state_simple_1r, state_simple_2r, state_simple_3r, state_complex_1r, + state_complex_2r, state_complex_3r, state_complex_4f, state_klotski}; + +std::vector win_conditions{ + state_simple_1r_wc, state_simple_2r_wc, state_simple_3r_wc, + state_complex_1r_wc, state_complex_2r_wc, state_complex_3r_wc, + state_complex_4f_wc, state_klotski_wc}; + +#endif diff --git a/src/main.cpp b/src/main.cpp index 474bf93..4728568 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,6 @@ #define VERLET_UPDATE #include -#include #include #include #include @@ -12,165 +11,8 @@ #include "klotski.hpp" #include "mass_springs.hpp" #include "renderer.hpp" +#include "states.hpp" -using StateGenerator = std::function; - -auto state_simple_1r() -> State { - State s = State(4, 5, true); - s.AddBlock(Block(0, 0, 1, 2, true)); - - return s; -} - -auto state_simple_1r_wc(const State &state) -> bool { return false; } - -auto state_simple_1f() -> State { - State s = State(4, 5, false); - s.AddBlock(Block(0, 0, 1, 2, false)); - - return s; -} - -auto state_simple_1f_wc(const State &state) -> bool { return false; } - -auto state_simple_2r() -> State { - State s = State(4, 5, true); - s.AddBlock(Block(0, 0, 1, 2, false)); - s.AddBlock(Block(1, 0, 1, 2, false)); - - return s; -} - -auto state_simple_2r_wc(const State &state) -> bool { return false; } - -auto state_simple_2f() -> State { - State s = State(4, 5, false); - s.AddBlock(Block(0, 0, 1, 2, false)); - s.AddBlock(Block(1, 0, 1, 2, false)); - - return s; -} - -auto state_simple_2f_wc(const State &state) -> bool { return false; } - -auto state_simple_3r() -> State { - State s = State(4, 5, true); - s.AddBlock(Block(0, 0, 1, 2, false)); - s.AddBlock(Block(1, 0, 1, 2, false)); - s.AddBlock(Block(2, 0, 1, 2, false)); - - return s; -} - -auto state_simple_3r_wc(const State &state) -> bool { return false; } - -auto state_simple_3f() -> State { - State s = State(4, 5, false); - s.AddBlock(Block(0, 0, 1, 2, false)); - s.AddBlock(Block(1, 0, 1, 2, false)); - s.AddBlock(Block(2, 0, 1, 2, false)); - - return s; -} - -auto state_simple_3f_wc(const State &state) -> bool { return false; } - -auto state_complex_1r() -> State { - State s = State(6, 6, true); - s.AddBlock(Block(1, 0, 1, 3, false)); - s.AddBlock(Block(3, 0, 2, 1, false)); - s.AddBlock(Block(5, 0, 1, 3, false)); - s.AddBlock(Block(3, 2, 2, 1, true)); - s.AddBlock(Block(3, 3, 1, 2, false)); - s.AddBlock(Block(4, 4, 2, 1, false)); - - return s; -} - -auto state_complex_1r_wc(const State &state) -> bool { - return state.GetBlockAt(4, 2) == "ba"; -} - -auto state_complex_2r() -> State { - State s = State(6, 6, true); - s.AddBlock(Block(2, 0, 1, 3, false)); - s.AddBlock(Block(0, 2, 2, 1, true)); - s.AddBlock(Block(1, 3, 2, 1, false)); - s.AddBlock(Block(1, 4, 2, 1, false)); - s.AddBlock(Block(5, 4, 1, 2, false)); - s.AddBlock(Block(0, 5, 3, 1, false)); - - return s; -} - -auto state_complex_2r_wc(const State &state) -> bool { - return state.GetBlockAt(4, 2) == "ba"; -} - -auto state_complex_3r() -> State { - State s = State(6, 6, true); - s.AddBlock(Block(0, 0, 3, 1, false)); - s.AddBlock(Block(5, 0, 1, 3, false)); - s.AddBlock(Block(2, 2, 1, 2, false)); - s.AddBlock(Block(3, 2, 2, 1, true)); - s.AddBlock(Block(3, 3, 1, 2, false)); - s.AddBlock(Block(4, 3, 2, 1, false)); - s.AddBlock(Block(0, 4, 1, 2, false)); - s.AddBlock(Block(2, 4, 1, 2, false)); - s.AddBlock(Block(4, 4, 2, 1, false)); - s.AddBlock(Block(3, 5, 3, 1, false)); - - return s; -} - -auto state_complex_3r_wc(const State &state) -> bool { - return state.GetBlockAt(4, 2) == "ba"; -} - -auto state_complex_4f() -> State { - State s = State(4, 4, false); - s.AddBlock(Block(0, 0, 2, 1, false)); - s.AddBlock(Block(3, 0, 1, 1, false)); - s.AddBlock(Block(0, 1, 1, 2, false)); - s.AddBlock(Block(1, 1, 2, 2, false)); - s.AddBlock(Block(3, 1, 1, 1, false)); - s.AddBlock(Block(3, 2, 1, 1, false)); - s.AddBlock(Block(0, 3, 1, 1, false)); - s.AddBlock(Block(1, 3, 1, 1, false)); - - return s; -} - -auto state_complex_4f_wc(const State &state) -> bool { return false; } - -auto state_klotski() -> State { - State s = State(4, 5, false); - s.AddBlock(Block(0, 0, 1, 2, false)); - s.AddBlock(Block(1, 0, 2, 2, true)); - s.AddBlock(Block(3, 0, 1, 2, false)); - s.AddBlock(Block(0, 2, 1, 2, false)); - s.AddBlock(Block(1, 2, 2, 1, false)); - s.AddBlock(Block(3, 2, 1, 2, false)); - s.AddBlock(Block(1, 3, 1, 1, false)); - s.AddBlock(Block(2, 3, 1, 1, false)); - s.AddBlock(Block(0, 4, 1, 1, false)); - s.AddBlock(Block(3, 4, 1, 1, false)); - - return s; -} - -auto state_klotski_wc(const State &state) -> bool { - return state.GetBlockAt(1, 3) == "bb"; -} - -std::array generators{ - state_simple_1r, state_simple_2r, state_simple_3r, state_complex_1r, - state_complex_2r, state_complex_3r, state_complex_4f, state_klotski}; - -std::array win_conditions{ - state_simple_1r_wc, state_simple_2r_wc, state_simple_3r_wc, - state_complex_1r_wc, state_complex_2r_wc, state_complex_3r_wc, - state_complex_4f_wc, state_klotski_wc}; auto apply_state(MassSpringSystem &mass_springs, StateGenerator generator) -> State {