#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_complex_5r() -> State { return State("R6x6:31....12....1221......12..ba..1212..21..12....12......21.." "....21..21...."); } inline auto state_complex_5r_wc(const State &state) -> bool { // R6x6:................................ba...................................... return state.GetBlockAt(4, 2) == "ba"; } 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_complex_5r, 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_complex_5r_wc, state_klotski_wc}; #endif