move board state presets to separate file
This commit is contained in:
168
include/states.hpp
Normal file
168
include/states.hpp
Normal file
@ -0,0 +1,168 @@
|
||||
#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_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_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_klotski_wc};
|
||||
|
||||
#endif
|
||||
160
src/main.cpp
160
src/main.cpp
@ -1,7 +1,6 @@
|
||||
#define VERLET_UPDATE
|
||||
|
||||
#include <chrono>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <omp.h>
|
||||
#include <ratio>
|
||||
@ -12,165 +11,8 @@
|
||||
#include "klotski.hpp"
|
||||
#include "mass_springs.hpp"
|
||||
#include "renderer.hpp"
|
||||
#include "states.hpp"
|
||||
|
||||
using StateGenerator = std::function<State(void)>;
|
||||
|
||||
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<StateGenerator, 8> 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<WinCondition, 8> 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 {
|
||||
|
||||
Reference in New Issue
Block a user