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 -
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
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
-
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 bouclewhile (nSaisi != n)
, c'est nécessairement quenSaisi
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 lesifstream::[/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 unifstream
pour lire le flux, et unstd::string
où il place ce qu'il récolte. Il récupère une ligne et c'est tout. Mais avec unwhile,
legetline
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 lewhile
va lire ligne à ligne le fichier. C'est là que tu peux stocker lesstd::string
dans unvector
(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 !