1
Fork 0

Cleans up project and fixes some warnings

This commit is contained in:
Joshua Moerman 2014-02-18 16:45:51 +01:00
parent 9e2c8f0c5c
commit 570bc18976
7 changed files with 34 additions and 48 deletions

View file

@ -19,7 +19,7 @@ struct AnalyzedGrid {
private: private:
friend class boost::serialization::access; friend class boost::serialization::access;
template<class Archive> template<class Archive>
void serialize(Archive & ar, const unsigned int version){ void serialize(Archive & ar, const unsigned int /*version*/){
ar & grid & analysis.solution_traces; ar & grid & analysis.solution_traces;
} }
}; };

View file

@ -92,7 +92,7 @@ private:
//! \brief Serializes the grid //! \brief Serializes the grid
template<class Archive> template<class Archive>
void serialize(Archive & ar, const unsigned int version){ void serialize(Archive & ar, const unsigned int /*version*/){
ar & W & H & grid & positions; ar & W & H & grid & positions;
// archiving positions is redundant (I'm being lazy here) // archiving positions is redundant (I'm being lazy here)
// consider make_nvp for readable json // consider make_nvp for readable json

View file

@ -1,20 +0,0 @@
#pragma once
#include "grid.hpp"
#include <random>
namespace detail {
template <int W, int H, typename URNG, size_t... I>
auto random_field(URNG&& r, std::index_sequence<I...>){
std::uniform_int_distribution<int> dis(1, 2);
return create_rectangular_field<W, H>({
((void)I, dis(r))...
});
}
}
template <int W, int H, typename URNG>
auto random_field(URNG&& r){
using Indices = std::make_index_sequence<W*H>;
return detail::random_field<W, H>(r, Indices{});
}

View file

@ -19,7 +19,7 @@ private:
friend class boost::serialization::access; friend class boost::serialization::access;
template<class Archive> template<class Archive>
void serialize(Archive & ar, const unsigned int version){ void serialize(Archive & ar, const unsigned int /*version*/){
ar & min_size; ar & min_size;
} }
}; };

View file

@ -150,3 +150,19 @@ template <int W, int H, typename T>
auto create_rectangular_field(std::initializer_list<T> grid){ auto create_rectangular_field(std::initializer_list<T> grid){
return Grid<W, H, T>(grid); return Grid<W, H, T>(grid);
} }
namespace detail {
template <int W, int H, typename URNG, size_t... I>
auto random_field(URNG&& r, std::index_sequence<I...>){
std::uniform_int_distribution<int> dis(1, 2);
return create_rectangular_field<W, H>({
((void)I, dis(r))...
});
}
}
template <int W, int H, typename URNG>
auto random_static_grid(URNG&& r){
using Indices = std::make_index_sequence<W*H>;
return detail::random_field<W, H>(r, Indices{});
}

View file

@ -15,8 +15,8 @@ int main(int argc, char** argv){
int w = 5; int w = 5;
int h = 5; int h = 5;
int c = 3; int c = 3;
int explosion_size = 3; unsigned int explosion_size = 3;
int n = 1000; unsigned int n = 1000;
// Describe program options // Describe program options
po::options_description opts; po::options_description opts;
@ -47,37 +47,31 @@ int main(int argc, char** argv){
BasicRules rules(explosion_size); BasicRules rules(explosion_size);
int solvable = 0; unsigned int solvable = 0;
int unsolvable = 0; unsigned int unsolvable = 0;
while(n--){ while(n--){
auto field = random_dynamic_grid(w, h, c, gen); auto field = random_dynamic_grid(w, h, c, gen);
if(verbose){
std::cout << "= Puzzle " << n << " =\n";
field.print(std::cout);
}
auto solution = solve(field, rules); auto solution = solve(field, rules);
if(!solution.solution_traces.empty()){ if(!solution.solution_traces.empty()){
++solvable; ++solvable;
if(verbose){
std::cout << solution.solution_traces.size() << " solutions\n";
}
} else { } else {
++unsolvable; ++unsolvable;
if(verbose){
std::cout << "no solutions\n";
}
} }
std::string s = solution.solution_traces.empty() ? "u" : "s"; std::string s = solution.solution_traces.empty() ? "u" : "s";
std::string filename = "levels/" + std::to_string(w) + "_" + std::to_string(h) + "_" + std::to_string(c) + "_" + s + "_" + std::to_string(field.hash()) + ".lvl"; std::string filename = "levels/" + std::to_string(w) + "_" + std::to_string(h) + "_" + std::to_string(c) + "_" + s + "_" + std::to_string(field.hash()) + ".lvl";
grid_to_file({std::move(field), std::move(solution), rules}, filename);
if(verbose){ if(verbose){
std::cout << "= Puzzle " << n << " =\n";
field.print(std::cout);
std::cout << solution.solution_traces.size() << " solutions\n";
std::cout << filename << "\n\n"; std::cout << filename << "\n\n";
} }
grid_to_file({std::move(field), std::move(solution), rules}, filename);
} }
std::cout << solvable << " solvable\n"; std::cout << solvable << " solvable (= " << 100 * solvable / double(solvable + unsolvable) << "%)\n";
std::cout << unsolvable << " unsolvable\n"; std::cout << unsolvable << " unsolvable (= " << 100 * unsolvable / double(solvable + unsolvable) << "%)\n";
} }

View file

@ -32,13 +32,9 @@ int main(int argc, char** argv){
std::cout << "= The puzzle =\n"; std::cout << "= The puzzle =\n";
auto level = grid_from_file(vm["file"].as<std::string>()); auto level = grid_from_file(vm["file"].as<std::string>());
level.grid.print(std::cout); level.grid.print(std::cout);
if(level.analysis.solution_traces.empty()){ std::cout << "has " << level.analysis.solution_traces.size() << " solutions\n\n";
std::cout << "has no solutions\n";
} else {
std::cout << "has " << level.analysis.solution_traces.size() << " solutions\n\n";
}
int count = 0; int count = 1;
for(auto && solution : level.analysis.solution_traces){ for(auto && solution : level.analysis.solution_traces){
std::cout << "= Solution " << count++ << " =\n"; std::cout << "= Solution " << count++ << " =\n";