diff --git a/code_mieux/code_mieux.ino b/code_mieux/code_mieux.ino index 296582b..ba190a8 100644 --- a/code_mieux/code_mieux.ino +++ b/code_mieux/code_mieux.ino @@ -1,5 +1,7 @@ #include #include +#include // Pour la fonction rand +#include // Pour la fonction time TFT_eSPI tft = TFT_eSPI(); LIS3DHTR lis; @@ -49,6 +51,8 @@ String levels[3] = {"Novice", "Confirmé", "Expert"}; // Assurez-vous que les ni + + struct Piece { int x; int y; @@ -134,11 +138,10 @@ void setupAccelerometer() { void checkButtonState() { int buttonState = digitalRead(WIO_KEY_B); - Serial.println(buttonState); - if(buttonState == LOW){ - isGameRunning = true; + if(buttonState == LOW && isGameRunning == false){ lastTimeDecrement = millis(); + resetGame(); } } @@ -159,11 +162,11 @@ void updateBallPosition() { // Déplacer la balle en fonction des données de l'accéléromètre ballX += accX * SPEEDGAME; ballY += accY * SPEEDGAME; - // Limiter les positions de la balle à l'intérieur de la zone de jeu - if (ballX < 0 + ballRadius) ballX = ballRadius; - if (ballX > 320 - ballRadius) ballX = 320 - ballRadius; - if (ballY < 40 + ballRadius) ballY = 40 + ballRadius; - if (ballY > 240 - ballRadius) ballY = 240 - ballRadius; + // Si la balle dépasse les limites de l'écran, arrêter le jeu + if (ballX < 0 + ballRadius || ballX > 320 - ballRadius || ballY < 40 + ballRadius || ballY > 240 - ballRadius) { + isGameRunning = false; + return; + } // Dessiner la nouvelle position de la balle tft.fillCircle(ballX, ballY, ballRadius, TFT_RED); // Mettre à jour les anciennes coordonnées de la balle @@ -171,6 +174,7 @@ void updateBallPosition() { oldBallY = ballY; } + void checkTime() { // Gestion du chronomètre if (millis() - lastTimeDecrement >= timeInterval) { @@ -223,7 +227,24 @@ void displayPieces() { tft.setTextColor(oldTextColor); tft.setTextSize(oldTextSize); } +void checkColision() { + for (int i = 0; i < currentPieceCount; i++) { + if (!currentPieces[i].isCollected && distance(ballX, ballY, currentPieces[i].x, currentPieces[i].y) < ballRadius + PIECE_RADIUS) { + + currentPieces[i].isCollected = true; + tft.fillCircle(currentPieces[i].x, currentPieces[i].y, 5, TFT_DARKGREY); + if (currentPieces[i].isBlack) { + timeLeft -= 10; // Enlève 5 secondes + } else { + srand(time(0)); + int points_ajoutes = rand() % 16 + 10; // tire un entier au sort aléatoirement entre 10 et 25 + score += points_ajoutes; //ajoute le score de la pièce au score de la partie + } + } + } + +} void changeLevel() { if (isGameRunning) { // Si le jeu est en cours, ne faites rien et sortez de la fonction return; @@ -255,35 +276,24 @@ void changeLevel() { } } - - -/* -void displayLevel() { - // Vider la zone de jeu - tft.fillRoundRect(0, 40, 320, 200, 0, TFT_DARKGREY); - - Piece* currentPieces; // pointeur vers le tableau des pièces du niveau en cours - - if (level == "Novice") { - currentPieces = piecesNovice; - } else if (level == "Confirmé") { - currentPieces = piecesConfirme; - } else if (level == "Expert") { - currentPieces = piecesExpert; - } - - for (int i = 0; i < PIECE_COUNT; i++) { - if (!currentPieces[i].isCollected) { - tft.fillCircle(currentPieces[i].x, currentPieces[i].y, PIECE_RADIUS, currentPieces[i].color); - if (currentPieces[i].color == TFT_YELLOW) { // seulement dessiner le symbole du dollar pour les pièces jaunes - tft.setTextColor(TFT_BLACK, currentPieces[i].color); - tft.setTextSize(1); - tft.setCursor(currentPieces[i].x - 3, currentPieces[i].y - 3); // Ajuster ces valeurs pour centrer le symbole du dollar - tft.print("$"); - } - } +void resetGame() { + isGameRunning = true; // Ajoutez cette ligne pour redémarrer le jeu + timeLeft = 30; + level = "Novice"; + ballX = 160; + ballY = 120; + oldBallX = ballX; + oldBallY = ballY; + currentLevelIndex = 0; + score = 0; + currentPieces = novicePieces; + currentPieceCount = sizeof(novicePieces) / sizeof(novicePieces[0]); + for (int i = 0; i < currentPieceCount; i++) { + currentPieces[i].isCollected = false; } -}*/ + displayPieces(); + updateBanner(); +} void setup() { @@ -296,23 +306,16 @@ void setup() { void loop() { checkButtonState(); - changeLevel(); + changeLevel(); if(isGameRunning){ updateBallPosition(); checkTime(); } + else tft.fillCircle(ballX, ballY, ballRadius, TFT_RED); updateBanner(); // Mettre à jour le bandeau dans chaque boucle, que le jeu soit en cours ou non - for (int i = 0; i < currentPieceCount; i++) { - if (!currentPieces[i].isCollected && distance(ballX, ballY, currentPieces[i].x, currentPieces[i].y) < ballRadius + PIECE_RADIUS) { - - currentPieces[i].isCollected = true; - tft.fillCircle(currentPieces[i].x, currentPieces[i].y, 5, TFT_DARKGREY); - - score++; // Augmenter le score - } - } + checkColision(); + } -