From 0ddc597a0f2eeb0dc49f8a6ab4a8af0d615b6ece Mon Sep 17 00:00:00 2001 From: scratko Date: Sat, 9 Nov 2024 23:56:45 +0300 Subject: Checking the solvability of puzzles --- puzzle.cpp | 20 +++++++++++++++++++- puzzle.hpp | 2 ++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/puzzle.cpp b/puzzle.cpp index 0e3574b..50b32af 100644 --- a/puzzle.cpp +++ b/puzzle.cpp @@ -35,7 +35,7 @@ static void find_path_to_picture(std::string& path, int number) std::to_string(number % puzzles_per_side) + ".jpg"; } -void GameParams::CreateNewPuzzles() +void GameParams::NextUntestedPuzzles() { int idx_random_puzzle; std::unique_ptr tmp_puzzle; @@ -65,6 +65,24 @@ void GameParams::CreateNewPuzzles() tmp_puzzle->callback(press_button_callback, this); puzzles.push_back(std::move(tmp_puzzle)); } + ResetFreePuzzles(); +} + +bool GameParams::IsSolvability() +{ + int counter = 0; + for(size_t i = 0; i < puzzles.size(); ++i) + for(size_t j = i+1; j < puzzles.size(); ++j) + if(puzzles[i]->sequence_number > puzzles[j]->sequence_number) + ++counter; + return counter % 2 == 0; +} + +void GameParams::CreateNewPuzzles() +{ + do { + NextUntestedPuzzles(); + } while(!IsSolvability()); } void GameParams::NewGame() diff --git a/puzzle.hpp b/puzzle.hpp index 5b2b2ab..5f51877 100644 --- a/puzzle.hpp +++ b/puzzle.hpp @@ -36,6 +36,8 @@ private: GameParams() {} void CalculateStandardPuzzlePos(); void ResetFreePuzzles(); + void NextUntestedPuzzles(); + bool IsSolvability(); void CreateNewPuzzles(); public: void NewGame(); -- cgit v1.2.3