Page 1 sur 1
Lire une ligne spécifique dans un fichier.txt ou .ini
Publié : dim. 19/oct./2008 17:50
par Dragor
Bonjour à tous.
J'aimerais faire un jeu du pendu pour m'entraîner au PureBasic mais je rencontre un problème (parmi tant d'autres).
Je vais créer un fichier .txt ou .ini contenant un mot par ligne et faire ensuite un Random pour qu'il aille chercher au hasard un mot.
Mais je n'arrive pas à trouver le paramètre qui permet de faire ça. (J'ai déjà eu du mal à trouver le bon Read).
Donc si vous pouviez m'indiquer le chemin, merci. ^^
Et s'il vous plaît, je ne veux pas de code tout près, j'aimerais comprendre moi même.
Merci d'avance.
Ps : Pendant que j'y suis, il y a t il un moyen pour transformer une chaîne de caractère en *** ? Ou alors il faut passer par Len pour prendre le nombre de caractère, puis mettre autant de * que de caractère ?
Publié : dim. 19/oct./2008 19:14
par Guimauve
Si je peux faire une suggestion, écrit les mots dans un fichier texte et charge les dans un tableau. Ensuite faire une sélection aléatoire dans le tableau.
Code : Tout sélectionner
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Gestion d'un tableau de mots
; Fichier : Source principal
; Version : 0.0.0
; Programmation : À compléter
; Programmé par : Guimauve
; Date : 19-10-2008
; Mise à jour : 19-10-2008
; Codé avec PureBasic V4.10
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Dim Mots.s(5)
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Initialisation des mots
Mots(0) = "Patate"
Mots(1) = "Poils"
Mots(2) = "orteille"
Mots(3) = "Cuisse"
Mots(4) = "Patte"
Mots(5) = "Tomate"
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Création du fichier txt
If CreateFile(0, "Mots.txt")
For Index = 0 To 5
WriteStringN(0, Mots(Index))
Next
CloseFile(0)
EndIf
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Lecture des mots depuis le fichier txt
; On utilise une liste car on ne sait pas le nombre
; de mot que le fichier texte contient.
NewList Mots2.s()
If ReadFile(1, "Mots.txt")
While Eof(1) = #Null
AddElement(Mots2())
Mots2() = ReadString(1)
Wend
CloseFile(1)
EndIf
; On demande le nombre de mot que la liste contient
Max.l = ListSize(Mots2()) - 1
; La boucle ici c'est pour la démonstration
For loop = 0 To 15
IndexA.l = Random(Max) ; On sélection un numéro aléatoire entre 0 et Max
Debug IndexA
SelectElement(Mots2(), IndexA)
Debug Mots2()
Debug ""
Next
; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Si tu as besoin d'aide, n'hésite pas.
A+
Guimauve
Publié : dim. 19/oct./2008 19:41
par Ar-S
Salut,
pour ton soucis de remplacement, intéresse toi à la la fonction
ReplaceString() de la doc, les exemples sont claires.
Si tu galères, reviens nous voir.

Publié : dim. 19/oct./2008 20:10
par venom
bonjour,
moi je ferai sa avec la fonction preferences()
dico :
telecharger ici
Code : Tout sélectionner
;- Window Constants
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
Enumeration
#Button_0
#String_0
EndEnumeration
If OpenWindow(#Window_0, 0, 0, 220, 70, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered| #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_0))
ButtonGadget(#Button_0, 10, 10, 200, 25, "lancer un texte au hasard")
StringGadget(#String_0, 10, 40, 200, 20, "")
EndIf
EndIf
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget
Select EventGadget()
Case #Button_0
OpenPreferences("dico.txt"); on ouvre le fichier texte
Result$ = ReadPreferenceString(Str(Random(20)), ""); la on donne le numero de la ligne et random(20) prend un nombre entre 0 et 20
SetGadgetText(#String_0, Result$); et la on renvoie Result$ dans un stringgadget()
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
@++
Publié : mar. 21/oct./2008 10:39
par brossden
Avec la Drooy's lib qui est devenue pour moi indispensable c'est super facile
Code : Tout sélectionner
IniWrite("c:\test.ini","section1","Key1Section1","data_Key1Section1")
IniWrite("c:\test.ini","section1","Key2Section1","data_Key2Section1")
IniWrite("c:\test.ini","section2","Key1Section2","data_Key1Section2")
IniRead("c:\test.ini","section1","Key1Section1")
IniRead("c:\test.ini","section1","Key2Section1")
IniRead("c:\test.ini","section2","Key1Section2")
Publié : mar. 21/oct./2008 11:11
par Ar-S
+1 brossden, même si les commandes de PB 4.20 Read/Writepreference() rendent un peu obsolète ces fonctions de la droopy lib
Code : Tout sélectionner
If CreatePreferences("Preferences.prefs")
PreferenceGroup("Global")
WritePreferenceString("ApplicationName", "MP3 Player")
WritePreferenceString("Version", "1.1b")
PreferenceComment(" This is the Window dimension")
PreferenceComment("")
PreferenceGroup("Window")
WritePreferenceLong ("WindowX", 123)
WritePreferenceLong ("WindowY", 124)
WritePreferenceFloat("WindowZ", -125.5)
ClosePreferences()
EndIf
OpenPreferences("Preferences.prefs")
PreferenceGroup("Window")
Debug ReadPreferenceLong ("WindowX", 0)
Debug ReadPreferenceLong ("WindowY", 0)
Debug ReadPreferenceFloat("WindowZ", 0)
PreferenceGroup("Global")
Debug ReadPreferenceString("ApplicationName", "")
Debug ReadPreferenceString("Version", "")
ClosePreferences()
Publié : mar. 21/oct./2008 11:54
par brossden
Je préfère le code droopy qui est très intuitif et sur une seule ligne !
Publié : ven. 24/oct./2008 18:58
par Dragor
Merci pour votre aide mais je suis un peu perdu tellement il y en a... ^^
Mon code c'est ça pour l'instant :
Code : Tout sélectionner
OpenConsole()
EnableGraphicalConsole(1)
ConsoleTitle("Le jeu du Pendu !")
Resultat = ReadFile(dico, "dico.txt")
mot$ = ReadString(dico)
PrintN("Le mot est " +mot$)
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("Appuyer sur Entree pour quitter")
Input()
J'aimerais juste une commande qui permet de sélectionner une ligne spécifique dans le fichier.
Par exemple au lieu de " mot$ = ReadString(dico) ", un truc du genre " mot$ = ReadString(dico, 2) " Ça lirait la ligne 2 du fichier dico.
Bien sur ce n'est qu'un exemple mais c'est quelque chose dans ce genre là.
Et pouvez vous me décrire les fonctions que vous utilisez ? Car vous me donnez un code déjà fait (dont je ne comprends pas tout) et j'aimerais adapter les fonctions à mon code.
Donc pouvez vous me dire comment marchent vos fonctions ?
Merci d'avance.
Publié : ven. 24/oct./2008 20:09
par Guimauve
Apparemment tu es un vrai débutant...
Voiçi un code qui devrait faire ce que tu veux. Cependant moi j'utiliserais un tableau pour plus de simplicité.
Code : Tout sélectionner
Procedure.s ReadStringInFile(FileID, LineIndex)
If LineIndex = 0
LineIndex = 1
EndIf
For Index = 1 To LineIndex
x_iemeChaine.s = ReadString(FileID)
Next
ProcedureReturn x_iemeChaine
EndProcedure
OpenConsole()
EnableGraphicalConsole(1)
ConsoleTitle("Le jeu du Pendu !")
Resultat = ReadFile(dico, "dico.txt")
mot$ = ReadStringInFile(dico, 3) ; la 3e ligne. On commence à 1
PrintN("Le mot est " +mot$)
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("Appuyer sur Entree pour quitter")
Input()
A+
Guimauve
Publié : ven. 24/oct./2008 20:17
par Dragor
Merci pour cette réponse rapide.
Je vais essayer de déchiffrer tout ça ^^.
Sinon, j'ai suivi un cours de PureBasic et j'ai toujours pas compris à quoi servait une Procédure... Et comme j'ai vu que tu en utilise une, tu pourrais m'expliquer ?
J'ai compris que toutes les variables déclaré dans une procédures peuvent uniquement être utilisé dans cette procédure.
Mais j'vois pas trop à quoi ça sert...
Si on veut pas utiliser les une variable quelque part, on l'utilise pas...
Edit : Ligne 9, #File Objetc not initialized...
J'ai un peu de mal à comprendre (oui je suis un vrai débutant ^^ Un pur un dur ^^).
Publié : ven. 24/oct./2008 22:51
par Guimauve
Nouvelle version du code précédent. Je me suis rendu compte d'un problème si on voulant lire la ligne après la ligne 3 par exemple.
Code : Tout sélectionner
Procedure.s ReadStringInDico(DicoFileName.s, LineIndex)
If ReadFile(0, DicoFileName)
If LineIndex = 0
LineIndex = 1
EndIf
For Index = 1 To LineIndex
x_iemeChaine.s = ReadString(FileID)
Next
CloseFile(0)
EndIf
ProcedureReturn x_iemeChaine
EndProcedure
OpenConsole()
EnableGraphicalConsole(1)
ConsoleTitle("Le jeu du Pendu !")
mot$ = ReadStringInFile("dico.txt", 3)
PrintN("Le mot est " +mot$)
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("Appuyer sur Entree pour quitter")
Input()
Sinon, j'ai suivi un cours de PureBasic et j'ai toujours pas compris à quoi servait une Procédure... Et comme j'ai vu que tu en utilise une, tu pourrais m'expliquer ?
D'ordinaire on créer une procédure afin de grouper des instructions de base pour faire quelque chose de plus complexe. Dans la nouvelle version j'ai une procédure qui se charge d'ouvrir le dictionnaire, de lire toute les chaines jusqu'à ce qu'on lise celle qui nous intéresse. Ensuite on ferme le fichier et on retourne la chaine qu'on avait de besoin.
J'ai compris que toutes les variables déclaré dans une procédures peuvent uniquement être utilisé dans cette procédure.
Mais j'vois pas trop à quoi ça sert...
Si on veut pas utiliser les une variable quelque part, on l'utilise pas...
Une autre façon de faire du code précédent :
Code : Tout sélectionner
Global mot$
Procedure ReadStringInDico(DicoFileName.s, LineIndex)
If ReadFile(0, DicoFileName)
If LineIndex = 0
LineIndex = 1
EndIf
For Index = 1 To LineIndex
mot$ = ReadString(FileID)
Next
CloseFile(0)
EndIf
EndProcedure
OpenConsole()
EnableGraphicalConsole(1)
ConsoleTitle("Le jeu du Pendu !")
ReadStringInFile("dico.txt", 3)
PrintN("Le mot est " +mot$)
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("")
PrintN("Appuyer sur Entree pour quitter")
Input()
La variable Global peut-être modifié de partout dans le programme principal et dans les procédures. Sauf que moi je déteste ça, pour un programme simple ça peut toujours aller mais pour un gros programme on fini par être a court de nom pour les variables.
Edit : Ligne 9, #File Objetc not initialized...
J'ai un peu de mal à comprendre (oui je suis un vrai débutant ^^ Un pur un dur ^^).
Est-ce que le fichier dico.txt est dans le même répertoire que le code source que tu compile ?
A+
Guimauve
Publié : sam. 25/oct./2008 10:23
par Dragor
Oui le fichier est dans le même répertoire.
Et sinon, je crois avoir compris.
Enafites on peut, avec les procédures, avoir 2 fois la même variables. Enfin 2 fois le même nom non ?
Par exemple :
Code : Tout sélectionner
Procédure 1
blabla
life=500
blabla
EndProcédure
Procédure 2
blabla
life=1000
blabla
EndProcédure
J'espère avoir bien compris ^^
Publié : sam. 25/oct./2008 12:21
par Guimauve
Dragor a écrit :Oui le fichier est dans le même répertoire.
Et sinon, je crois avoir compris.
Enafites on peut, avec les procédures, avoir 2 fois la même variables. Enfin 2 fois le même nom non ?
C'est en plein ça.
A+
Guimauve
Publié : dim. 26/oct./2008 7:13
par brossden
Je me permet de te proposer une solution pour créer ton dico par le code ci-après :
Code : Tout sélectionner
;Création d'un fichier contenant les différents mots à découvrir grâce au jeu du pendu.
CreateFile(1,"Dico.txt")
;Ecriture de quelques mots à trouver mais il est possible de rajouter autant de mot sur une ligne que l'on veut avec un editeur type notepad par exemple
WriteStringN(1,"PUZZLES")
WriteStringN(1,"AVIRONS")
WriteStringN(1,"COULEUR")
WriteStringN(1,"VOITURE")
WriteStringN(1,"SKIEUSE")
WriteStringN(1,"AÉRONEF")
; Fermeture du fichier
CloseFile(1)
Le code qui fait suite te permettra de lire ce "Dico" et de tirage au hasard un mot parmi ceux en mémoire
Code : Tout sélectionner
;Ouverture du fichier
OpenFile(1,"Dico.txt")
; Mise en mémoire de touts les mots du 'Dico' dans une liste chainée
NewList Mots.s()
While Not Eof(1)
AddElement(Mots())
Mots()= ReadString(1)
Wend
CloseFile(1)
;Tirage au hasard du numéro d'un mot
RandomSeed(Second(Date()))
For n=1 To 3
X = Random(ListSize(Mots())) -1
SelectElement(Mots(),X)
MessageRequester("Résultat"," Le mot qui sera à trouver est : " + Mots() )
Next)
Publié : dim. 26/oct./2008 10:55
par Ar-S
RandomSeed(Second(Date()))
Feinteur d'utiliser la date
