1
Fork 0
This repository has been archived on 2025-04-09. You can view files and clone it, but cannot push or open issues or pull requests.
puzzle-wuzzle-generator/main.cpp
2014-02-14 15:31:27 +01:00

77 lines
1.8 KiB
C++

#include "dynamic_grid.hpp"
#include "clusters.hpp"
#include "solver.hpp"
#include "generator.hpp"
#include "rules.hpp"
#include <boost/program_options.hpp>
#include <iostream>
#include <random>
#include <chrono>
#include <thread>
#include <algorithm>
int main(int argc, char** argv){
namespace po = boost::program_options;
int w = 5;
int h = 5;
int c = 3;
int explosion_size = 3;
// Describe program options
po::options_description opts;
opts.add_options()
("w", po::value(&w), "width of puzzles")
("h", po::value(&h), "height of puzzles")
("c", po::value(&c), "number of colors")
("explosion_size", po::value(&explosion_size), "minimum explosion size")
("help", po::bool_switch(), "show this help");
// Parse and store them in a vm
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, opts), vm);
po::notify(vm);
if(vm["help"].as<bool>()){
std::cout << "Puzzle Wuzzle Generator, version " << __DATE__ << std::endl;
std::cout << opts << std::endl;
return 0;
}
#define OUT(x) std::cout << #x << " = " << x << "\n"
OUT(w); OUT(h); OUT(c); OUT(explosion_size);
#undef OUT
std::random_device rd;
std::mt19937 gen(rd());
BasicRules rules(explosion_size);
int count = 50000;
int solvable = 0;
int unsolvable = 0;
while(--count){
auto field = random_dynamic_grid(w, h, c, gen);
// std::cout << "\n= puzzle " << count << " =\n";
// field.print(std::cout);
auto solution = solve(field, rules);
if(!solution.solution_traces.empty()){
++solvable;
// std::cout << solution.solution_traces.size() << " solutions\n";
// for(auto&& t : solution.solution_traces[0]){
// std::cout << "(" << t.first << ", " << t.second << ")\n";
// }
} else {
++unsolvable;
// std::cout << "no solutions\n";
}
}
std::cout << solvable << " solvable\n";
std::cout << unsolvable << " unsolvable\n";
}