Affichage d'un score en debut de partie

Mathrogue Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
VanDog Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, j'ai créé un petit jeu où le but est de trouver un nombre mystère entre 1 et 100, le programme fonctionne, mais je souhaiterais afficher le score du joueur précédent en début de partie, sauf que là je bloque, je n'arrive pas à l'afficher.

Voici le code complet:


#include <iostream>
#include <fstream>
#include <time.h>
using namespace std;

int main()
{
int nombre, nombreSaisi; // la virgule evite de retaper la commande int
char nom[20]; // tableau de 20 caractères nommé nom
ofstream monFluxEcriture; //instanciation d'un flux en écriture
ifstream monFluxLecture; //instranciation d'un flux en lecture
clock_t temps, temps2; // instanciation de temps
float mScore, score, val;

srand(time(NULL)); // obtenir un nombre pseudo-aléatoire
nombre = rand() % 100 + 1; // affecte ce nombre aléatoire dans la variable nombre et le borde avec %100+1 entre 1 et 100
cout << nombre << endl; // affiche le nombre aléatoire
temps = clock();

cout << "Entrez votre nom " << endl;
cin >> nom;
do{

cout << "Saisissez un nombre" << endl;
cin >> nombreSaisi;

if (nombreSaisi > nombre) cout << "Trop grand ! "; // condition si (if)
if (nombreSaisi < nombre) cout << "Trop petit ! ";
} while (nombreSaisi != nombre); // != signifie équivalent

if (nombreSaisi == nombre) cout << "VOUS AVEZ GAGNE !! "; // J'atteste que nombreSaisi est équivalente à nombre

temps2 = (clock() - temps);
score = (float)temps2; // forcer le temps a devenir un décimal
score = score / 1000; // affiche le score que l'on divise puis que l'on affiche de nouveau
cout << "Votres temps est de " << score << endl;

monFluxEcriture.open ("C:/Users/Mathias/Documents/Visual Studio 2013/Projects/TpES3/Debug/score.txt",ios::app);
if (monFluxEcriture.is_open() == true)
{
monFluxEcriture << score << " " << nom << endl;
cout << "Fichier ouvert";
}
else cout << "Impossible d'ouvrir le fichier" << endl;

monFluxLecture.open("C:/Users/Mathias/Documents/Visual Studio 2013/Projects/TpES3/Debug/score.txt");
if (monFluxLecture.is_open())
{
monFluxLecture >> mScore;
}

do{
monFluxLecture >> val >> nom;
if (val < mScore) mScore = val;
}
while (monFluxLecture.eof() != true);

{

monFluxLecture >> score >> nom;

if (score < mScore)

{
mScore = score;
cout << "Meilleur score:" << mScore << endl;

}

}

return 0;
}

Et voici la partie qui est censé m'afficher le meilleur score:


monFluxLecture.open("C:/Users/Mathias/Documents/Visual Studio 2013/Projects/TpES3/Debug/score.txt");
if (monFluxLecture.is_open())
{
monFluxLecture >> mScore;
}

do{
monFluxLecture >> val >> nom;
if (val < mScore) mScore = val;
}
while (monFluxLecture.eof() != true);

{

monFluxLecture >> score >> nom;

if (score < mScore)

{
mScore = score;
cout << "Meilleur score:" << mScore << endl;

}

Avez vous une idée d'où peut provenir l'erreur ?

Merci d'avance

1 réponse

  1. VanDog Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   13
     
    Holà !
    Dans le cadre du forum C++, je vais t'apporter un regard plus C++ que C. Tu sembles avoir une approche plus C que je ne maitrise pas assez pour débugger ton code sensible, je vais donc te proposer une alternative, à défaut de mieux ^^

    Mais avant, quelques remarques sur ton code C++ :
    #include <time.h> 

    Les header de la lib standard C ont été repris avec un c, je t'invite à inclure :
    #include <ctime> 


    if (nombreSaisi == nombre) cout << "VOUS AVEZ GAGNE !! "; // J'atteste que nombreSaisi 


    Si tu sors de la boucle
     while (nSaisi != n)
    , c'est nécessairement que
    nSaisi
    n'est pas pas égale à
    n
    , donc qu'il est égale :) Ainsi, ce IF là est en trop puisque tu passeras toujours au travers.

    score = (float)temps2; // forcer le temps a devenir un décimal
    score = score / 1000; 


    Tu forces score à être un flottant mais tu lui fais subir une opération entière,
    score / 1000
    transtypera le résultat en entier, puis stocker en flottant.
    score / 1000. // ou (1000.f)
    conserve le caractère floattant :)

    monFluxEcriture.open ("C:/Users/Mathias/Documents/Visual Studio 2013/Projects/TpES3/Debug/score.txt",ios::app);


    Tu devrais préférer un chemin relatif afin d'exporter facilement ton programme.
    flux.open(../dossierTonton/score.txt") // "../" réferre au dossier parent


    Voilà pour les remarques. Maintenant ton soucis, et bien tout est correct; ormis ce que je ne peux vérifier parce que je ne connais pas, à savoir les
    ifstream::[/download/telecharger-34082790-operator operator] >>()


    Puisque je ne connais pas comment fonctionne ces chevrons, je vais te donner une méthode qui marche à chaque fois en C++ :)
    std::string line;
    if ( std::ifstream reader(file.txt) )
    {
    while ( getline(reader, line) )
    {
    // utilisation de la ligne.
    }
    }
    

    getline
    prend en argument un
    ifstream
    pour lire le flux, et un
    std::string
    où il place ce qu'il récolte. Il récupère une ligne et c'est tout. Mais avec un
    while,
    le
    getline
    va récupérer une ligne, renvoyer "true" pour " j'ai bien récupéré une ligne" ce qui relancera la boucle et le forcera à récuperer la ligne suivante... Donc le
    while
    va lire ligne à ligne le fichier. C'est là que tu peux stocker les
    std::string
    dans un
    vector
    (par exemple) ou directement manipuler les valeurs récupérées.

    Voilà, en espèrant t'avoir aidé ! N'hésite pas à redemander des explications ou à m'écrire par message privé ^^
    Courage !

    0