180 lines
4.9 KiB
C++
180 lines
4.9 KiB
C++
#ifndef __STATES_HPP_
|
|
#define __STATES_HPP_
|
|
|
|
#include <functional>
|
|
#include <vector>
|
|
|
|
#include "klotski.hpp"
|
|
|
|
using StateGenerator = std::function<State(void)>;
|
|
|
|
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<StateGenerator> 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<WinCondition> 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
|