From c874f8b5171940f655fcc2ad869c66c4b8f457ea Mon Sep 17 00:00:00 2001 From: PapiBigSzill <04andrei22@gmail.com> Date: Mon, 1 Dec 2025 12:57:11 +0100 Subject: [PATCH] =?UTF-8?q?Menu=20f=C3=BCr=203,=206=20Paare=20hingef=C3=BC?= =?UTF-8?q?gt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 8196 bytes .gitignore | 1 + CMakeLists.txt | 31 +++--- src/main.cpp | 291 +++++++++++++++++++++++++++++++------------------ 4 files changed, 197 insertions(+), 126 deletions(-) create mode 100644 .gitignore diff --git a/.DS_Store b/.DS_Store index a9921da2bb36b884333134329ddda31ade067b0a..c5dea7b42732e9265c9357a6064f583fe48a9fa1 100644 GIT binary patch literal 8196 zcmeHM&1(}u6o1pE&BkI$L8S=7qSqQ*Vn4u3OyfcPK$@ZlmAIP?Y3ODrXFs1BQYBg#o;?g;*or`)btG zh5^ICSTZ1<4>pR>1+Du^%SQ()nF2tk&@Bb+tY|>nS{JnLD~%BdQ&4CHWje)R3XXnT z+ZD9#E3M$fbn?OU%uHt}OwJDfwlpVJP}Wf4?6cYw}Xb z^|^~a>(_pG*Dim(9v}CP9dB(#z74Q9fYKaQsYwoPQ;jZ@OFgW?Cl758J>t54)8|z^ zs|f55D7oKKgaewTb-JTH+y=TsU6dT^9qPuh>_P&Y!Ymvs=p^i3C+sZv4PfVEJz`x+ z`=1H>DOd_bk9OjoN$~Y9vih{#eU&QML7SQhYq8g3te=+KfzN|Fti&Vn$kz_7(MsHx z+lB^#Lvgjqx$hpd9ru2t7FM!n)_Kr%8bPfs0S&JPlSdC4fycul?*(2* zV#{j4%2=67_T297;)0!DTisi*cUSYv3-;Cg%HCeaI(zBLwT;TQ-wgOma06lbwLz!V z^a)p@g6MCy(STx~zF_*{ z>r5P!Y20{+p2wFc1VSACC}I-f*QRRRN*pCN8#(wH z1SkS&bg+s*k0Iu069@z~*;JBY+mmYw&@(dJV;<5J%CHnc9}WaDb{?}9Y#K2PoM;9n z)$Zm+{(oci_x}^kf!Um4VB8sCsZzOA1Pcd0l9GgoT-!!@f+9rN^_7+oR5BfhmgzY3 f;U9)*+b|WFg4TVd(F6JS9|Fw#UlMPsv1Z^8^afwK delta 170 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5sJ6q~50$jGxXU^g=(&tx8f>dB@;qLamh z>>0OD4ihR=6R)l|Ha65zFg2~!QK+^wGSE>lH!`TL<>U}m*0&Cd&(6us%kP~0Mo6Bq zYjUHo#AFrW8yizv7#Fj1a0oI3?EnG+ZXn?bvTkGIcjn3bGM*sI8JHjr0lAG~b3D%+ FW&j #include +#include +#include "raylib.h" // Stellen Sie sicher, dass raylib.h hier oder in gamecube.h inkludiert ist + // ----------------------------------------------------------- // 3D Memory Game – Hauptprogramm // ----------------------------------------------------------- + +enum GameScreen {MENU = 0, GAMEPLAY}; + + +void SetupGame(std::vector& cubes, int pairs) +{ + cubes.clear(); + Color colors[] = {RED, GREEN, BLUE, YELLOW, ORANGE, PURPLE, WHITE, SKYBLUE}; + std::vector positions; + + int count = pairs * 2; + int cols = 3; + int rows = 2; + if (count > 6) { + cols = 4; + rows = 3; + } + int index = 0; + // Generiert Positionen basierend auf der Größe + for (int r = 0; r < rows && index < count; ++r) { + for (int c = 0; c < cols && index < count; ++c) { + // Zentriert die Würfel um (0,0,0) + positions.push_back({(float)c * 2.0f - (cols -1 ), 0.0f, (float)r * 2.0f - (rows -1)}); + index++; + } + } + + std::vector colorPool; + for (int i = 0; i < pairs; i++) { + colorPool.push_back(colors[i]); + colorPool.push_back(colors[i]); + } + + // Fisher-Yates Shuffle + for (int i= colorPool.size() -1; i > 0; --i) { + int j = rand() % (i + 1); + std::swap(colorPool[i], colorPool[j]); + } + + // Würfel erstellen + for (int i = 0; i < count; i++) + cubes.emplace_back(positions[i], colorPool[i]); + +} + int main() { // Zufall initialisieren#include "gamecube.h" @@ -148,6 +196,15 @@ int main() double endTime = 0.0; bool timerStarted = false; + GameScreen currentScreen = MENU; + int selectedPairs = 3; + + // 1. SPIELSPEZIFISCHE VARIABLEN HIER DEKLARIEREN (ohne Initialisierung) + std::vector cubes; + gamecube* first = nullptr; + gamecube* second = nullptr; + float flipSpeed = 5.0f; // Drehgeschwindigkeit + bool gameWon = false; // Fenster und Kamera InitWindow(800, 600, "3D Memory Game with Matrix3D Library"); @@ -160,133 +217,151 @@ int main() camera.fovy = 45.0f; camera.projection = CAMERA_PERSPECTIVE; - // Nur 3 Farben für 3 Paare - Color colors[] = { RED, GREEN, BLUE }; - - // 6 Karten-Positionen im 3x2 Raster - std::vector positions = {{-2, 0, -2}, {0, 0, -2}, {2, 0, -2},{-2, 0, 0}, {0, 0, 0}, {2, 0, 0}}; - - // Farben doppelt in einen Pool legen und mischen - std::vector colorPool; - for (int i = 0; i < 3; i++) - { - colorPool.push_back(colors[i]); - colorPool.push_back(colors[i]); - } - - // Fisher-Yates Shuffle mit rand() - for (int i = colorPool.size() - 1; i > 0; --i) - { - int j = rand() % (i + 1); // Zufallsindex von 0 bis i - std::swap(colorPool[i], colorPool[j]); - } - - // Karten/Würfel erstellen - std::vector cubes; - for (int i = 0; i < 6; i++) - cubes.emplace_back(positions[i], colorPool[i]); - - gamecube* first = nullptr; - gamecube* second = nullptr; - float flipSpeed = 5.0f; // Drehgeschwindigkeit - bool gameWon = false; - // ----------------------------------------------------------- // Hauptspielschleife // ----------------------------------------------------------- while (!WindowShouldClose()) { - if (!timerStarted) + // ------------------------------------------------------- + // UPDATE-LOGIK NACH ZUSTAND + // ------------------------------------------------------- + switch (currentScreen) { - startTime = GetTime(); - timerStarted = true; - } - // Klick-Erkennung - if (!gameWon && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - Vector2 mouse = GetMousePosition(); - - for (auto &c : cubes) + case MENU: { - if (!c.IsFlipped() && !c.IsMatched()) - { - Vector2 screenPos = GetWorldToScreen({c.GetPosition().x, c.GetPosition().y, c.GetPosition().z}, camera); - - if (fabs(mouse.x - screenPos.x) < 40 && fabs(mouse.y - screenPos.y) < 40) - c.FlipForward(); + // Menü-Abfrage: Auf Tastendruck warten + if (IsKeyPressed(KEY_THREE)) { + selectedPairs = 3; // 6 Würfel + SetupGame(cubes, selectedPairs); + gameWon = false; + first = second = nullptr; + currentScreen = GAMEPLAY; + timerStarted = false; // Timer-Reset + } else if (IsKeyPressed(KEY_SIX)) { + selectedPairs = 6; // 12 Würfel + SetupGame(cubes, selectedPairs); + gameWon = false; + first = second = nullptr; + currentScreen = GAMEPLAY; + timerStarted = false; // Timer-Reset } + break; } + + case GAMEPLAY: + { + // Timer starten + if (!timerStarted) + { + startTime = GetTime(); + timerStarted = true; + } + + // Klick-Erkennung + if (!gameWon && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + Vector2 mouse = GetMousePosition(); + for (auto &c : cubes) + { + if (!c.IsFlipped() && !c.IsMatched()) + { + Vector2 screenPos = GetWorldToScreen({c.GetPosition().x, c.GetPosition().y, c.GetPosition().z}, camera); + if (fabs(mouse.x - screenPos.x) < 40 && fabs(mouse.y - screenPos.y) < 40) + c.FlipForward(); + } + } + } + + // Animation aller Würfel + for (auto &c : cubes) + { + c.Update(flipSpeed); + if (c.IsFlipped() && !c.IsMatched()) + { + if (!first) first = &c; + else if (!second && &c != first) second = &c; + } + } + + // Matching-Logik + if (first && second) + { + Color col1 = first->GetColor(); + Color col2 = second->GetColor(); + + if (col1.r == col2.r && col1.g == col2.g && col1.b == col2.b) + { + first->SetMatched(true); + second->SetMatched(true); + } + else + { + first->FlipBackward(); + second->FlipBackward(); + } + first = second = nullptr; + } + + // Gewinnprüfung + if (!gameWon) + { + // Prüft, ob ALLE Würfel gematcht sind + gameWon = std::all_of(cubes.begin(), cubes.end(), [](const gamecube &c){ return c.IsMatched(); }); + if (gameWon) + { + endTime = GetTime() - startTime; + } + } + break; + } // ENDE GAMEPLAY UPDATE } - // Animation aller Würfel - for (auto &c : cubes) - { - c.Update(flipSpeed); - - // Sobald ein Würfel vollständig umgedreht ist → merken - if (c.IsFlipped() && !c.IsMatched()) - { - if (!first) first = &c; - else if (!second && &c != first) second = &c; - } - } - - // Matching-Logik - if (first && second) - { - Color col1 = first->GetColor(); - Color col2 = second->GetColor(); - - if (col1.r == col2.r && col1.g == col2.g && col1.b == col2.b) - { - first->SetMatched(true); - second->SetMatched(true); - } - else - { - first->FlipBackward(); - second->FlipBackward(); - } - - first = second = nullptr; - } - - // Gewinnprüfung - if (!gameWon) - { - gameWon = std::all_of(cubes.begin(), cubes.end(), [](const gamecube &c){ return c.IsMatched(); }); - if (gameWon) - { - endTime = GetTime() - startTime; - } - } // ----------------------------------------------------------- - // Zeichnen + // ZEICHNEN NACH ZUSTAND // ----------------------------------------------------------- BeginDrawing(); ClearBackground(RAYWHITE); - BeginMode3D(camera); - for (auto &c : cubes) - c.Draw(); - - EndMode3D(); - - if (gameWon) + switch (currentScreen) { - DrawText("Congrats! You found all pairs!", 150, 260, 30, DARKBLUE); + case MENU: + { + // Menü-Darstellung + DrawText("3D MEMORY SPIEL", GetScreenWidth() / 2 - MeasureText("3D MEMORY SPIEL", 50) / 2, 80, 50, DARKGRAY); + DrawText("Waehlen Sie die Spielgroesse:", 50, 200, 25, BLACK); + DrawText("Druecken Sie [3] fuer 3 Paare (6 Wuerfel)", 50, 240, 20, BLUE); + DrawText("Druecken Sie [6] fuer 6 Paare (12 Wuerfel)", 50, 280, 20, BLUE); + break; + } - char buffer[64]; - sprintf(buffer, "Cleared in %.2f seconds", endTime); - DrawText(buffer, 150, 300, 28, DARKGREEN); - } - else - { - DrawText("Flip 2 cubes - find matching pairs!", 10, 10, 20, DARKGRAY); - char liveBuf[64]; - sprintf(liveBuf, "Time: %.2f", GetTime() - startTime); - DrawText(liveBuf, 10, 40, 20, DARKGRAY); + case GAMEPLAY: + { + // Spiel-Darstellung + BeginMode3D(camera); + + for (auto &c : cubes) + c.Draw(); + + EndMode3D(); + + if (gameWon) + { + DrawText("Congrats! You found all pairs!", 150, 260, 30, DARKBLUE); + char buffer[64]; + sprintf(buffer, "Cleared in %.2f seconds", endTime); + DrawText(buffer, 150, 300, 28, DARKGREEN); + } + else + { + DrawText("Flip 2 cubes - find matching pairs!", 10, 10, 20, DARKGRAY); + char liveBuf[64]; + sprintf(liveBuf, "Time: %.2f", GetTime() - startTime); + DrawText(liveBuf, 10, 40, 20, DARKGRAY); + } + break; + } // ENDE GAMEPLAY DRAW } + EndDrawing(); }