git repos / sago_multi_scrambler_puzzle2

commit ac5cac2f

Poul Sander · 2023-02-18 18:25
ac5cac2ff5deebec42eaf68f68ca8667a4139306 patch · browse files
parent 11229dd422cfbbb28a3663d2e647af27e00e048c

Add the option for a flip puzzle instead of a swap puzzle

Changed files

M src/PuzzleSingleImageState.cpp before
M src/PuzzleSingleImageState.hpp before
diff --git a/src/PuzzleSingleImageState.cpp b/src/PuzzleSingleImageState.cpp index 66d1227..378038f 100644 --- a/src/PuzzleSingleImageState.cpp +++ b/src/PuzzleSingleImageState.cpp
@@ -65,7 +65,14 @@ void PuzzleSingleImageState::Draw(SDL_Renderer* target) {
source.y = double(source.y)*scale;
source.w = double(source.w)*scale;
source.h = double(source.h)*scale;
- SDL_RenderCopy(target, this->pictureTex, &source, &destination);
+ int flip = static_cast<int>(SDL_FLIP_NONE);
+ if (rotated_pieces[i] == 1 || rotated_pieces[i] == 3) {
+ flip |= SDL_FLIP_HORIZONTAL;
+ }
+ if (rotated_pieces[i] == 2 || rotated_pieces[i] == 3) {
+ flip |= SDL_FLIP_VERTICAL;
+ }
+ SDL_RenderCopyEx(target, this->pictureTex, &source, &destination, 0, nullptr, static_cast<SDL_RendererFlip>(flip) );
}
for (size_t i = 0; i < pieces.size(); ++i) {
const SDL_Rect& piece = pieces[i];
@@ -101,15 +108,20 @@ void PuzzleSingleImageState::Update() {
const SDL_Rect& piece = pieces[i];
bool clicked = (globalData.mousex > rect.x+piece.x && globalData.mousex < rect.x+piece.x + piece.w && globalData.mousey > rect.y+piece.y && globalData.mousey < rect.y+piece.y + piece.h);
if (clicked) {
- if (i != marked_piece && marked_piece > -1 && marked_piece < pieces.size()) {
- std::swap(shuffeled_pieces[i], shuffeled_pieces[marked_piece]);
- marked_piece = -1;
- }
- else if (i == marked_piece) {
- marked_piece = -1;
+ if (flipMode) {
+ rotated_pieces[i] = (rotated_pieces[i]+1)%4;
}
else {
- marked_piece = i;
+ if (i != marked_piece && marked_piece > -1 && marked_piece < pieces.size()) {
+ std::swap(shuffeled_pieces[i], shuffeled_pieces[marked_piece]);
+ marked_piece = -1;
+ }
+ else if (i == marked_piece) {
+ marked_piece = -1;
+ }
+ else {
+ marked_piece = i;
+ }
}
}
}
@@ -208,13 +220,21 @@ void PuzzleSingleImageState::ClearPicture() {
void PuzzleSingleImageState::Shuffle() {
size_t number_of_peices = pieces.size();
shuffeled_pieces.resize(number_of_peices);
+ rotated_pieces.resize(number_of_peices);
for (size_t i = 0; i< shuffeled_pieces.size(); ++i) {
shuffeled_pieces.at(i) = i;
}
- for (int i = 0 ; i < 100; ++i) {
- size_t first = rand()%number_of_peices;
- size_t second = rand()%number_of_peices;
- std::swap(shuffeled_pieces[first], shuffeled_pieces[second]);
+ if (flipMode) {
+ for (size_t i = 0; i< shuffeled_pieces.size(); ++i) {
+ rotated_pieces.at(i) = rand()%4;
+ }
+ }
+ else {
+ for (int i = 0 ; i < 100; ++i) {
+ size_t first = rand()%number_of_peices;
+ size_t second = rand()%number_of_peices;
+ std::swap(shuffeled_pieces[first], shuffeled_pieces[second]);
+ }
}
shuffeled = true;
}
@@ -222,6 +242,9 @@ void PuzzleSingleImageState::Shuffle() {
void PuzzleSingleImageState::CheckSolved() {
for (size_t i=0; i < shuffeled_pieces.size(); ++i) {
+ if (rotated_pieces[i] != 0) {
+ return;
+ }
if (shuffeled_pieces[i] != i) {
return;
}
diff --git a/src/PuzzleSingleImageState.hpp b/src/PuzzleSingleImageState.hpp index ec44361..afc5521 100644 --- a/src/PuzzleSingleImageState.hpp +++ b/src/PuzzleSingleImageState.hpp
@@ -45,6 +45,8 @@ public:
void SplitPieceHorisontal(size_t piece_number);
void Shuffle();
void CheckSolved();
+
+ bool flipMode = false;
private:
void ClearPicture();
@@ -60,5 +62,6 @@ private:
int min_piece_size = 120;
bool shuffeled = false;
std::vector<size_t> shuffeled_pieces;
+ std::vector<size_t> rotated_pieces;
int marked_piece = -1;
};