Commit 36f00daa authored by vautrin33u's avatar vautrin33u
Browse files

Affichage du tableau de score

parent 65f0e3f7
This diff is collapsed.
......@@ -206,4 +206,16 @@ enum cuisson {INCONCERNE, FRIGO, SALE, PROPRE, CUIT, CRU, JETE};
*/
#define TEMPS_DE_PARTIE 120000
/**
* @brief Taille du tableau des scores
*
*/
#define TAILLE_HIGHSCORE 10
/**
* @brief Emplacement du fichier regroupant les meilleurs scores des joueurs
*
*/
#define EMPLACEMENT_SCORE "Ressources/highscore.txt"
#endif
\ No newline at end of file
......@@ -169,44 +169,97 @@ char** init_map (){
return tab;
}
char* recuperer_highscore(const char* nomFichier){
void recuperer_highscore(const char* nomFichier, int* highscore){
//Récupère le tableau des scores et le retransmets
char* tableau[10];
//Initialisation du tableau
for (int i=0; i<10; i++){
tableau[i] = NULL;
//initialiser tab
for (int i=0; i<TAILLE_HIGHSCORE; i++){
highscore[i]=0;
}
FILE* fichier = NULL;
fichier = fopen(nomFichier, "r");
if (fichier == NULL){
int i=0;
char c = '\0';
while ((c = fgetc(fichier)) != NULL){
printf("%s", tableau[i]);
i++;
if (fichier != NULL){
//Lecture fichier
for (int i=0; i<TAILLE_HIGHSCORE; i++){
fscanf(fichier, "%d\n", &highscore[i]);
}
fclose(fichier);
}else{
//Pas de fichier trouvé, on en génère un sans score
fichier = fopen(nomFichier, "w");
for (int i=0; i<TAILLE_HIGHSCORE; i++){
fprintf(fichier, "%d\n", highscore[i]);
}
fclose(fichier);
}
return tableau;
}
void trier_highscore (char* highscore, int score_entrant){
void trier_highscore (int* highscore, int score_entrant){
//Trie les scores du plus grand au plus petit
//traduction char->int
int* tab[10];
for (int i=0; i<10; i++){
tab[i] = atoi(highscore[i]);
int indice = -1;
int ind_dec = 0;
// La nouvelle valeur entre dans le tableau
for (int i=0; i<TAILLE_HIGHSCORE; i++){
if (score_entrant >= highscore[i]){
indice = i;
break;
}
}
// Cas où le score entrant n'entre pas dans le tableau
if (indice == -1) return;
ind_dec = TAILLE_HIGHSCORE-1;
//trie
//traduction int->char
for (int i=0; i<10; i++){
sprintf(highscore[i], "%d", tab[i]);
while (ind_dec > indice){
highscore[ind_dec] = highscore[ind_dec-1];
ind_dec--;
}
highscore[indice] = score_entrant;
}
void ecrire_highscore(const char* nomFichier, char* highscore){
void ecrire_highscore(const char* nomFichier, int* highscore){
//ecrire le tableau de score trié et à jour dans le bon fichier
}
\ No newline at end of file
FILE* fichier = NULL;
fichier = fopen(nomFichier, "w");
if (fichier ==NULL){
printf("\n Echec ouverture du fichier %s.", nomFichier);
return;
}
for (int i=0; i<TAILLE_HIGHSCORE; i++){
fprintf(fichier, "%d\n", highscore[i]);
}
fclose(fichier);
}
/*
int* tri_tableau (int* tab[], int taille, int indice){
if (!est_mal_triee(tab, taille)){
return tab;
}
if
if (indice+1 < taille){
return tri_tableau(tab, taille, indice++);
}else{
return tri_tableau(tab, taille, 0);
}
}
int est_mal_triee(int *tab, int taille){
//Vérifie si le tableau est triée
for (int i=0; i<taille-1; i++){
if (tab[i]<tab[i+1]){
return 1;
}
}
return 0;
}
*/
......@@ -66,9 +66,9 @@ void genere_fichier (const char* nomFichier, char** source, int ligne, int colon
* @brief écupère le tableau des scores et le retransmets
*
* @param nomFichier Adresse du fichier
* @return char* tableau de score
* @param highscore tableau de score
*/
char* recuperer_highscore(const char* nomFichier);
void recuperer_highscore(const char* nomFichier, int* highscore);
/**
......@@ -77,13 +77,13 @@ char* recuperer_highscore(const char* nomFichier);
* @param highscore tableau de scores
* @param score_entrant score de la partie actuelle
*/
void trier_highscore (char* highscore, int score_entrant);
void trier_highscore (int* highscore, int score_entrant);
/**
* @brief ecrire le tableau de score trié et à jour dans le bon fichier
*
* @param nomFichier Adresse du fichier de score
* @param highscore tableau de score
*/
void ecrire_highscore(const char* nomFichier, char* highscore);
void ecrire_highscore(const char* nomFichier, int* highscore);
#endif
\ No newline at end of file
......@@ -66,6 +66,19 @@ void clean_textures(textures_t *textures){
if (textures->police != NULL){
TTF_CloseFont(textures->police);
}
if (textures->controle != NULL){
SDL_DestroyTexture(textures->controle);
}
if (textures->controle2 != NULL){
SDL_DestroyTexture(textures->controle2);
}
if (textures->best != NULL){
SDL_DestroyTexture(textures->best);
}
if (textures->score != NULL){
SDL_DestroyTexture(textures->score);
}
}
void nettoyage_graphisme (SDL_Renderer *renderer, textures_t *textures, SDL_Window *fenetre){
......@@ -95,6 +108,10 @@ void init_textures (SDL_Renderer *renderer, textures_t *textures, TTF_Font *font
textures->option1 = NULL;
textures->option2 = NULL;
textures->option3 = NULL;
textures->controle = NULL;
textures->controle2 = NULL;
textures->best = NULL;
textures->score = NULL;
}
void apply_graphics (SDL_Renderer *renderer, textures_t *textures, world_t *world){
......@@ -235,7 +252,7 @@ void apply_texte (SDL_Renderer* renderer, world_t* world, textures_t* textures){
buffer[2] = '\0';
}
//printf("timer: %s \n", buffer);
//Concernant le score
//Concernant le score : taille de présentation
if (get_score(world)<100){
zone_score = create_SDL_rect(90, 555, 40, 40);
}else if (get_score(world)<10000){
......@@ -257,6 +274,7 @@ void apply_texte (SDL_Renderer* renderer, world_t* world, textures_t* textures){
void apply_graphics_menu (SDL_Renderer *renderer, textures_t *textures, menu_t* menu){
//Affichage du menu
if (textures->menu !=NULL){
//Affichage du fond du menu
SDL_RenderCopy(renderer, textures->menu, NULL, NULL);
......@@ -273,26 +291,97 @@ void apply_graphics_menu (SDL_Renderer *renderer, textures_t *textures, menu_t*
SDL_Color color = { 255, 255, 0, 0 };
//Textes à afficher
char title[15] = TITRE;
char begin[20] = "Nouvelle partie";
char continuer[20] = "Continuer la partie";
char quit[10] = "Quitter";
char title[] = TITRE;
char begin[] = "Nouvelle partie";
//char continuer[] = "Continuer la partie";
char quit[] = "Quitter";
char controle[] = "Deplacez vous avec les fleches / Espace : recupere 1 ingredient du frigo";
char controle2[] = "ou permet de poser des objets / Enter : reprendre les ingredients.";
//Génération des textures
textures->titre = charger_texte(title, renderer, textures->police, color);
textures->option1 = charger_texte(begin, renderer, textures->police, color);
textures->option2 = charger_texte(continuer, renderer, textures->police, color);
//textures->option2 = charger_texte(continuer, renderer, textures->police, color);
textures->option3 = charger_texte(quit, renderer, textures->police, color);
textures->controle = charger_texte(controle, renderer, textures->police, color);
textures->controle2 = charger_texte(controle2, renderer, textures->police, color);
//afficher les textes
render_texte(renderer, menu->titre_jeu, textures->titre);
render_texte(renderer, menu->nouvelle_partie, textures->option1);
render_texte(renderer, menu->charger, textures->option2);
//render_texte(renderer, menu->charger, textures->option2);
render_texte(renderer, menu->quitter, textures->option3);
SDL_Rect ctrl = {150, 500, 550, 50};
SDL_Rect ctrl2 = {150, 550, 550, 50};
render_texte(renderer, ctrl, textures->controle);
render_texte(renderer, ctrl2, textures->controle2);
}
}
void apply_graphics_score(SDL_Renderer* renderer, textures_t* textures, int* scores, int score_actuel){
//Affiche le tableau des scores et le score actuel du joueur
SDL_Color color = { 255, 255, 0, 0 };
SDL_Rect message_titre = {SCREEN_WIDTH/2-50, 10, 100, 50};
SDL_Rect message_score = {50, 75, 200, 40 };
SDL_Rect score_joueur = {250, 75, 100, 40}; //zone score du joueur
SDL_Rect zone_score = {50, 125, 50, 40}; //zones highscore
char title[] = "Highscore";
char message_score_j[] = "Votre score actuel :";
char score_j[6]; // stocke le score du joueur
char temp[6]; // stocke temporairement les éléments du tableau des meilleurs scores
sprintf(score_j, " %d", score_actuel); //int -> char[]
//Adjustement de l'affichage du score
if (score_actuel<100){
score_joueur.w = 40;
}else if (score_actuel<10000){
score_joueur.w = 60;
}else{
score_joueur.w = 100;
}
//Récupère tous les scores sous forme de char
if (textures->menu !=NULL){
//Affichage du fond du menu
SDL_RenderCopy(renderer, textures->menu, NULL, NULL);
}
if (textures->police != NULL){
//Génération des textures
textures->titre = charger_texte(title, renderer, textures->police, color);
textures->message = charger_texte(message_score_j, renderer, textures->police, color);
textures->score = charger_texte(score_j, renderer, textures->police, color);
// Affichage du tableau du highscore
for (int i=0; i<TAILLE_HIGHSCORE; i++){
//récupération du score en string
sprintf(temp, " %d", scores[i]);
textures->best = charger_texte(temp, renderer, textures->police, color);
//ajustement de la taille d'affichage du score
if (scores[i]<100){
zone_score.w = 40;
}else if (score_actuel<10000){
zone_score.w = 60;
}else{
zone_score.w = 100;
}
//score ajouter au renderer + décalage
render_texte(renderer, zone_score , textures->best);
zone_score.y +=40;
}
//Affichage du textue
render_texte(renderer, message_titre, textures->titre);
render_texte(renderer, message_score, textures->message);
render_texte(renderer, score_joueur, textures->score);
}
}
SDL_Rect create_SDL_rect_from_texture (SDL_Texture * texture, int x, int y, int h, int w){
//Permet de créer un SDL_rect retournant la texture de la taille de la texture (SOURCE)
......
......@@ -32,6 +32,11 @@ struct textures_s{
SDL_Texture* option1; /*!<Texture du texte de l'option 1 */
SDL_Texture* option2; /*!<Texture du texte de l'option 2 */
SDL_Texture* option3; /*!<Texture du texte de l'option 3 */
SDL_Texture* controle; /*!< Texture du texte explicant les touches du jeu */
SDL_Texture* controle2; /*!< Texture du texte explicant les touches du jeu */
SDL_Texture* best; /*!< Tableau de texture du tableau de score */
SDL_Texture* score; /*!< Texture du texte du score */
};
/**
......@@ -166,4 +171,15 @@ SDL_Rect create_SDL_rect_from_sprite (sprite_t * sprite);
* @param textures textures disponibles
*/
void update_graphics (SDL_Renderer *renderer, world_t *world, textures_t *textures);
/**
* @brief Mets à jour les éléments graphiques pour afficher le score
*
* @param renderer
* @param textures
* @param scores meilleurs scores des parties jusque maintenant
* @param score_actuel score de la partie actuelle
*/
void apply_graphics_score(SDL_Renderer* renderer, textures_t* textures, int* scores, int score_actuel);
#endif
\ No newline at end of file
......@@ -289,4 +289,11 @@ int temps_restant (Uint32 temps_debut_jeu){
if (temps_restant <=0) temps_restant = 0;
}
return temps_restant;
}
void gestion_highscore(int score, int* highscore){
//Actualise le tableau des meilleurs scores
recuperer_highscore(EMPLACEMENT_SCORE, highscore);
trier_highscore(highscore, score);
ecrire_highscore(EMPLACEMENT_SCORE, highscore);
}
\ No newline at end of file
......@@ -146,4 +146,12 @@ void temps_depassee (world_t* world, Uint32 temps_debut_jeu);
*/
int temps_restant (Uint32 temps_debut_jeu);
/**
* @brief Actualise le fichier txt des meilleurs scores
*
* @param score Résultat du joueur de la partie en cours
* @param highscore Meilleurs scores du jeu
*/
void gestion_highscore(int score, int* highscore);
#endif
\ No newline at end of file
......@@ -27,6 +27,7 @@ SDL_Window *windows;
SDL_Renderer *ecran;
SDL_Event evenements;
TTF_Font *font = TTF_OpenFont("Ressources/arial.ttf", 50);
int highscores[TAILLE_HIGHSCORE];
windows = SDL_CreateWindow(TITRE, 100, 100, SCREEN_WIDTH, SCREEN_HEIGHT,SDL_WINDOW_OPENGL);
......@@ -61,12 +62,19 @@ while (estFini(&world)==0){
gestion_events(&evenements, &world);
update_data(&world);
update_graphics(ecran, &world, &textures);
if (world.gameover == 1){
if (estFini(&world)==1){
SDL_Delay(1000);
}
}
SDL_RenderClear(ecran);
//Affichage de l'écran de scores pendant 10s
gestion_highscore(get_score(&world), highscores);
apply_graphics_score(ecran, &textures, highscores, get_score(&world));
SDL_RenderPresent(ecran);
SDL_Delay(10000);
SDL_Delay(150);
//Fermeture et fin du jeu
SDL_RenderClear(ecran);
nettoyage_graphisme(ecran, &textures, windows);
free_tab_commande(&world.etat_stocks);
SDL_Quit();
......
......@@ -12,14 +12,14 @@
void init_menu (menu_t *menu){
//initialise le menu
SDL_Rect option1= {50, 300, 200, 50};
SDL_Rect option2= {50, 360, 250, 50};
//SDL_Rect option2= {50, 360, 250, 50};
SDL_Rect option3= {50, 420, 100, 50};
SDL_Rect pos_titre= {SCREEN_WIDTH/2 -100, 20, 200, 100};
SDL_Rect pos_glyphe = {20, 310, PLAT_SIZE, PLAT_SIZE};
menu->quitter_menu = 0;
menu->choix = 0;
menu->nouvelle_partie = option1;
menu->charger = option2;
//menu->charger = option2;
menu->quitter = option3;
menu->titre_jeu = pos_titre;
menu->glyphe = pos_glyphe;
......@@ -63,8 +63,6 @@ void menu_event(SDL_Event *event, menu_t *menu, world_t *world){
quitterMenu(menu);
world->temps_debut_jeu = SDL_GetTicks();
break;
case 1:
break;
default:
world->gameover = 1;
quitterMenu(menu);
......@@ -79,8 +77,6 @@ void menu_event(SDL_Event *event, menu_t *menu, world_t *world){
quitterMenu(menu);
world->temps_debut_jeu = SDL_GetTicks();
break;
case 1:
break;
default:
world->gameover = 1;
quitterMenu(menu);
......@@ -110,10 +106,6 @@ void modif_position_glyphe (menu_t* menu){
menu->glyphe.y = 315;
break;
case 1:
menu->glyphe.y = 375;
break;
default:
menu->glyphe.y = 435;
break;
......
......@@ -17,7 +17,7 @@ struct menu_s{
int choix; /*!< Champ indiquant le choix du joueur */
SDL_Rect titre_jeu; /*!< Position et dimension du titre */
SDL_Rect nouvelle_partie; /*!< Position et dimension de l'option 'nouvelle partie' */
SDL_Rect charger; /*!< Position et dimension de l'option de chargement d'une partie pré-existante */
//SDL_Rect charger; /*!< Position et dimension de l'option de chargement d'une partie pré-existante */
SDL_Rect quitter; /*!< Position et dimension de l'option n°3 (exit) */
SDL_Rect glyphe; /*!< Position et dimension de l'indicateur du choix actuel du joueur */
};
......
......@@ -105,9 +105,53 @@ void test_stocks(){
init_tab_commande(&world.etat_stocks);
init_commande_client(&world.etat_stocks, get_rect(&world.frigo));
free_tab_commande(&world.etat_stocks);
}
void test_ecrire_score (){
int test[TAILLE_HIGHSCORE];
for (int i=0; i<TAILLE_HIGHSCORE; i++){
test[i]=1;
}
ecrire_highscore("Ressources/testscore.txt", test);
}
void test_lire_score(){
int test[TAILLE_HIGHSCORE];
recuperer_highscore("Ressources/testscore2.txt", test);
for (int i=0; i<TAILLE_HIGHSCORE; i++){
printf("%d \n", test[i]);
}
recuperer_highscore("Ressources/testscore.txt", test);
for (int i=0; i<TAILLE_HIGHSCORE; i++){
printf("%d \n", test[i]);
}
}
void test_tri_score(){
printf("\n \n TEST TRI SCORE");
int test[TAILLE_HIGHSCORE];
for (int i=0; i<TAILLE_HIGHSCORE; i++){
test[i]=20-i;
}
for (int i=0; i<TAILLE_HIGHSCORE; i++){
printf("%d \n", test[i]);
}
printf("\n Apres tri: \n");
trier_highscore(test, 15);
for (int i=0; i<TAILLE_HIGHSCORE; i++){
printf("%d \n", test[i]);
}
}
void test_gestion_score(){
printf("\n TEST GESTION SCORE : \n");
int highscores[TAILLE_HIGHSCORE];
gestion_highscore(30, highscores);
for (int i=0; i<TAILLE_HIGHSCORE; i++){
printf("%d \n", highscores[i]);
}
}
// Zone test
......@@ -120,5 +164,9 @@ int main()
test_lecture_map();
test_limite();
test_stocks();
test_ecrire_score ();
test_lire_score();
test_tri_score();
test_gestion_score();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment