#include "level.h" using namespace std; const int Level::MAX_LEVEL = 4; const int Level::MIN_LEVEL = 0; default_random_engine Level::generator = default_random_engine{}; map<int,discrete_distribution<int>> Level::distributions = { {1, discrete_distribution<int>{2,2,2,2,1,1,2}}, {2, discrete_distribution<int>{1,1,1,1,1,1,1}}, {3, discrete_distribution<int>{1,1,1,1,2,2,1}}, {4, discrete_distribution<int>{1,1,1,1,2,2,1}} }; map<int, char> Level::blockTypes = { {0, 'I'}, {1, 'J'}, {2, 'L'}, {3, 'O'}, {4, 'S'}, {5, 'Z'}, {6, 'T'} }; Level::Level(int level, int seed, std::string file) : level{level}, isRandom{true}, defaultFile{file} { defaultStream.open(file); generator.seed(seed); } Level::~Level() { defaultStream.close(); sequenceStream.close(); } char Level::nextBlock() { char type; if (level == 0) { if (!(defaultStream >> type)) { defaultStream.close(); defaultStream.open(defaultFile); defaultStream >> type; } return type; } else if (level >= 3 && !isRandom) { if (!(sequenceStream >> type)) { sequenceStream.close(); sequenceStream.open(sequenceFile); sequenceStream >> type; } return type; } else { const int random = distributions.find(level)->second(generator); return blockTypes.find(random)->second; } } void Level::setRandom(bool active) { this->isRandom = active; } void Level::setSequence(std::string file) { this->sequenceFile = file; sequenceStream.close(); sequenceStream.open(file); } void Level::levelUp() { if (level == MAX_LEVEL) return; ++level; } void Level::levelDown() { if (level == MIN_LEVEL) return; --level; }