Maiku
Messages postés190Date d'inscriptiondimanche 10 avril 2005StatutMembreDernière intervention 4 juillet 2007
-
15 avril 2005 à 17:15
Maiku
Messages postés190Date d'inscriptiondimanche 10 avril 2005StatutMembreDernière intervention 4 juillet 2007
-
2 mai 2005 à 20:37
Salut
Je crée actuellement un jeu ludoeducatif pour enfants avec des questionnaires, j'ai enregistré mes questions et réponses dans un fichier de la manière suivante :
static void Main(string[] args)
{
// Creation du Fichier
FileStream fich = new FileStream("questionnaire.txt", FileMode.Append);
StreamWriter quest = new StreamWriter (fich);
// Inscription automatique quand WriteLine
quest.AutoFlush = true;
Console.WriteLine("Voulez vous inscrire une question et une réponse ?");
string s1;
do
{ //Enregistrement du numero de la question
Console.Write ("Entrez le numéro de la question : ");
quest.WriteLine (Console.Read() + ';');
//Enregistrement de la Question
Console.WriteLine ("Inscrivez la question");
quest.Write(Console.ReadLine() + ';');
//Enregistrement de la Réponse
Console.WriteLine ("Inscrivez la réponse");
quest.Write (Console.ReadLine() + ';');
//Autre enregistement à effectuer ?
Console.WriteLine ("Voulez vous enregistrer une autre question ?");
s1 = Console.ReadLine();
}
while (s1.ToLower() == "oui") ; //
quest.Close(); // Fermeture du Fichier
}
Dans mon jeu, je desire generer aleatoirement une ligne du fichier c'est à dire son numero, sa question et sa reponse que je vé ensuite décomposer, pour la décomposition c'est bon je sé now comment faire grâce à MorpionMx mais nulle part j'ai trouvé comment generer une ligne de mon fichier aleatoirement à chaque ouverture du jeu.
Quelqu'un saurait-il le faire ?
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 15 avril 2005 à 17:53
A la barbare :
StreamReader sr = new StreamReader("Questionnaire.txt");
string str = sr.ReadToEnd();
string[] strQuests = str.Split('\n');
Avec ca, tu recuperes chaque ligne séparée dans le tableau strQuests
Ensuite, tu as plus qu'a utiliser une fonction de generation de nombre
aléatoire avec comme nombre maximal, la propriété Length de ton tableau
pour tirer au sort la question, et la suite, tu sais faire
Y'a peut-etre une meilleure manière bien sur, la j'ai fait vite fait.
Maiku
Messages postés190Date d'inscriptiondimanche 10 avril 2005StatutMembreDernière intervention 4 juillet 2007 15 avril 2005 à 18:09
Alors je m'adresse a mon copain MorpionMx que je vé venerer pour toutes ses rep.
Quelques petites questions :
- Ton .ReadToEnd : il sert a quoi ?
- Si j'ai bien compris : string[] strQuests = str.Split('\n'); est un tableau donc
- la propriété Lenght : je sé pa l'utiliser suis debutante en fichier moi T_T
- le reste j'ai pas tt compris avec l'histoire de tableau
En fait now j'ai un numero de question, une question et une reponse : de quelle maniere je les stocke ?
Et comment les recuperer une par une si possible ?
Maiku
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 15 avril 2005 à 18:19
Je remplace MorpionMx
1) Il sert à lire le Stream (ton file) jusqu'à la fin.
2) Oui c'est un tableau qui contiendra chaque ligne du fichier
3) La property lenght te permet de savoir combien il y a d'élément dans ton tableau (donc de lignes dans ton fichier)
Maiku
Messages postés190Date d'inscriptiondimanche 10 avril 2005StatutMembreDernière intervention 4 juillet 2007 27 avril 2005 à 18:08
Alors dsl de ne pa avoir donné suite mais entre les cours, le code, le bts, les pti et les stages, le tps vient a manquer.
J'ai mis en pratique la solution de Morpion MX, qui marche très bien a une exception pres.
Comment faire quand par ex tu joué une fois tt les jeux donc tu ferme et tu reouvre le jeu, c'est alors les mm questions qui apparaissent du début a la fin alors que le debut c'est de les avoir aleatoirement comme ds un pendu par ex sauf que ce n'en est pas un^^
Si qq pouvait m'aider a corriger ce petit dysfonctionnement^^
WormkeyP
Messages postés20Date d'inscriptionsamedi 10 janvier 2004StatutMembreDernière intervention30 septembre 2010 30 avril 2005 à 21:36
Je crois avoir la réponse a ta question. J'ai lu que la classe "Random" utilise
pour générér des nombres aléatoires un "seed" (=graine). C'est a dire que si tu lui donne
le même "seed" au démarage, il te sortira la même suite de nombres pseudo aléatoires.
Lorsque tu crée ton instance de "Random" tu le fais de la façon suivante:
Random ag1 = new System.Random();
A mon avis il prend toujours le meme "seed", je te conseille d'utiliser la méthode suivante:
int seed=DateTime.Now.Millisecond;
Random ag1 = new System.Random(seed);
Comme DateTime.Now.Millisecond change a chaque lancement de programme ton problème
serra probablement reglé.
/!\ La prochaine foix que tu expose ton problème sur le forum exprime toi plus clairement, j'ai mis
un bout de temps a comprendre.
Maiku
Messages postés190Date d'inscriptiondimanche 10 avril 2005StatutMembreDernière intervention 4 juillet 2007 1 mai 2005 à 13:55
Bonjour
Alors j'ai mis en place la seed de la façon suivante :
//Ouverture du fichier Nourriture :
FileStream nour1 =
new FileStream("nourriture.txt",FileMode.Open,FileAccess.ReadWrite);
// flux de lecture du fichier :
StreamReader nour =
new StreamReader (nour1);
// Generation aléatoire d'une question
int seed=DateTime.Now.Millisecond;
System.Random gen1=
new System.Random(seed);
// Lit le fichier du début a la fin
string nq = nour.ReadToEnd();
//Decoupe le fichier en 2 string
string[] n1 = nq.Split('\n');
int Valeur=gen1.Next(n1.Length - 1);
string laQuestion = n1[Valeur];
// Choisit une question
string[] nq1 = laQuestion.Split(';');
// Decoupe la question
Console.WriteLine ("Question n°1 : ");
Console.WriteLine (nq1[0]);
reponse = Console.ReadLine();
if (reponse == nq1[1])
{
gainpos();
}
else
{
gainneg();
}
// Generation aléatoire d'une question
seed=DateTime.Now.Millisecond;
Random gen1 =
new System.Random(seed);
nq = nour.ReadToEnd();
//Decoupe le fichier en 2 string
string[] n2 = nq.Split('\n');
Valeur=gen1.Next(n2.Length - 1);
laQuestion = n2[Valeur];
// Choisit une question
string []nq2= laQuestion.Split(';');
// Decoupe la question
Console.WriteLine ("Question n°2 : ");
Console.WriteLine (nq2[0]);
reponse = Console.ReadLine();
if (reponse == nq2[1])
{
gainpos();
}
else
{
gainneg();
}
// Generation aléatoire d'une question
seed=DateTime.Now.Millisecond;
Random gen3 =
new System.Random(seed);
nq = nour.ReadToEnd();
//Decoupe le fichier en 2 string
string[] n3 = nq.Split('\n');
Valeur=gen1.Next(n3.Length - 1);
laQuestion = n3[Valeur];
// Choisit une question
string[] nq3 = laQuestion.Split(';');
// Decoupe la question
Console.WriteLine ("Question n°2 : ");
Console.WriteLine (nq3[0]);
reponse = Console.ReadLine();
if (reponse == nq3[1])
{
gainpos();
}
else
{
gainneg();
}
nour.Close();
La question générer au départ est pourtant la même a chaque lancement. De plus, il refuse de me générer ma deuxieme et troisième question car je dois en générer 3 consécutivement dans le programme.
Quelqu'un aurait il une solution ?
Désolée si mon explique n'était pas assez explicite mais moi même je m'y perd des fois.
La ligne de l'erreur est donc:
int Valeur=gen1.Next(n1.Length - 1);
A remplacer par:
int Valeur=gen1.Next(n1.Length);
Pourquoi tes 2èmes et 3èmes questions ne marchent pas:
Tu a utilisé la fonction ReadToEnd(), il te faut savoir que au fur et a mesure
que tu lis dans le "stream" (=flux) un curseur avance pour t'éviter d'avoir toujours
a lire la même chose. Avec ReadToEnd() ce curseur est donc placé a la fin du
stream ce qui t'empèche de pouvoir le relire.
Mon Conseil: Evite de faire 20 foix une opération que tu peux ne faire qu'une seule
foix.
Donc jusqu'a la ligne avec:
string[] n1 = nq.Split('\n');
Tu n'a pas besoin de répeter ces opérations! une foix suffit!
Maiku
Messages postés190Date d'inscriptiondimanche 10 avril 2005StatutMembreDernière intervention 4 juillet 2007 2 mai 2005 à 20:37
Lut
J'ai compris disons a moitié tes explications :
- alors pk je genere 3 questions et trois rep c'est pour un question
- par contre je n'ai pas bien compris ce qu'il faut supprimer j'ai supprimer les 2
aq = aq.ReadToEnd(); en trop donc.
-Mais pour les random je dois aussi les supprimer ?!! parce que c'est eux qui generent des trucs diff non ?