#include "game.h" #include "menu.h" #include "files.h" //global struct for storing all data of the 10 best players playerScore_t topScores[]; int recordsInFile; //========================== //==== savePlayerScores ==== //========================== void savePlayerScore(const char *filename/*int score, int difficulty, const char *playerName, const char *map*/) { playerScore_t playerScore; // copy data into struct playerScore.score = game.snake.length - config.snakeDefaultLength; playerScore.difficulty = config.difficulty; strcpy(playerScore.playerName, ttlStorage.userName); //strcpy(playerScore.map, "testmap"); strcpy(playerScore.map, storedMaps[ttlStorage.userSelectedMap - 1]->name); FILE *file; // open file file = fopen(filename, "ab"); // write data in file if (file != NULL) { fwrite(&playerScore, sizeof(playerScore_t), 1, file); fclose(file); LOGI("Spielergebnis wurde erfolgreich in die Binaerdatei gespeichert.\n"); } else { LOGI("Fehler beim Öffnen der Datei!\n"); } } //========================== //==== readTopScores ====== //========================== // number of reads depends on 'MAX_PRINTED_SCORES' void readTopScores(const char *filename) { FILE *filePtr; playerScore_t tempPlayerScore; int highestPlayerScore = 0; int count = 0; // increase up to 'MAX_PRINTED_SCORES' // determine the number of contents in the file recordsInFile = countRecordsInFile(filename); // if failure if(recordsInFile == -1) { game.gameState = EXIT; return; } filePtr = fopen(filename, "rb"); // fail with file opening if (filePtr == NULL) { LOGI("Datei: Fehler beim Öffnen der Datei für die besten 10 Ergebnisse!\n"); game.gameState = EXIT; return; } LOGI("Datei: Datensaetze in Datei: %d\n", recordsInFile); //---- search for the highest score------ for (int i = 0; i < recordsInFile; i++) { fread(&tempPlayerScore, sizeof(playerScore_t), 1, filePtr); if(tempPlayerScore.score > highestPlayerScore) { highestPlayerScore = tempPlayerScore.score; } } //--- decrease highest score ----- while((count < MAX_PRINTED_SCORES) && (count < recordsInFile)) { // set file pointer to start of the file rewind(filePtr); // search for the highest score and then save it in topScores for (int i = 0; i < recordsInFile; i++) { // read record from the file fread(&tempPlayerScore, sizeof(playerScore_t), 1, filePtr); // current highscore found if(tempPlayerScore.score == highestPlayerScore) { topScores[count] = tempPlayerScore; LOGI("Datei: score: %d name: %s schwierigkeit: %d map: %s\n", topScores[count].score, topScores[count].playerName, topScores[count].difficulty, topScores[count].map); count++; } // leave if limit is reached if(count >= recordsInFile || count >= MAX_PRINTED_SCORES) { break; } } highestPlayerScore--; } fclose(filePtr); } //========================== //==== readTop10Scores ===== //========================== // return the number of various scores of the file int countRecordsInFile(const char *filename) { FILE *file; file = fopen(filename, "rb"); // failure if (file == NULL) { LOGI("Datei: Fehler beim Öffnen der Datei!\n"); return -1; } fseek(file, 0, SEEK_END); // Gehe zum Dateiende long fileSize = ftell(file); // Hole die Größe der Datei in Bytes fclose(file); int recordSize = sizeof(playerScore_t); int numberOfRecords = fileSize / recordSize; // Berechne die Anzahl der Datensätze return numberOfRecords; }