Affichage d'un score en debut de partie

Mathrogue Messages postés 11 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

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