Page 1 sur 1
[R] Une sorte de Quiz
Posté : lun. 11 mai 2009 15:26
par EricG
Bonjour,
J'ai réussi un bon script hier (encore malpropre mais bon), alors, aujourd'hui, je commence un autre qui suit une idée qui me prend la tête.
Je n'arrive pas encore tout à fait avec la création d'interface. Il me faut juste un squelette.
Mon désir est de faire un Quiz sous la forme d'une simple boîte, avec une image associée à une question, un input pour la réponse et un bouton Suivant pour refaire cette boîte avec une autre question/image.
La réponse est une simple lettre ; c'est pour mémoriser le clavier ; les images seront un groupe de touches dont l'une est «lettrée» et la question sera du genre : «quelle est la touche du dessous/dessus/gauche/droite ?». La question en toutes lettres peut paraître inutile mais ça m'évitera de faire un gros paquet d'images, à moins de placer un signe dessus.
Alors, je sais, ça à l'air un peu con comme programme mais j'aimerai comprendre des scripts de base, en rapport avec des idées simples.
La touche Suivant peut se transformer en Quitter au bout d'un moment, pour limiter et scorer tout ça. Enfin, bon, je veux juste un squelette pour démarrer. J'ai pas mal cherché et je suis plutôt un visuel.
Re: Une sorte de Quiz
Posté : ven. 15 mai 2009 11:50
par EricG
Bonjour à tous,
Bon, mon projet est devenu un jeu de question/réponse, Quizz (oui, je sais, deux «z»), avec un fichier txt extérieur pour écrire ses questions et les bonnes réponses, et une éventuelle image qu'il suffira de mettre dans le même dossier. Voici, le script (il y a une astuce, je crois, pour coloriser... )
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
$FrLn = 3 ; 1 ligne sur...
_Fichier()
Func _Fichier()
$fichier = FileOpen("Quizz.txt", 0)
If $fichier = -1 Then
MsgBox(0, "Erreur", "Impossible d'ouvrir le fichier !")
Exit
Else
_ComptNbrQ($fichier, $FrLn)
EndIf
EndFunc
Func _ComptNbrQ($fichier, $FrLn)
$c = 0
While 1
$c += 1
FileReadLine ( $fichier, $c )
If @error = -1 Then
$c -= $FrLn
$c /= $FrLn
_Questions($fichier, $c)
EndIf
WEnd
EndFunc
Func _Questions($fichier, $c)
$note = $c
$fois = 1
While $fois < $c+1
$alea = Random(1, $c, 1)
$alea *= $FrLn
FileReadLine($fichier,$alea)
GUICreate("Quizz", 180, 165, -1, -1)
GUICtrlCreateLabel("Question n°" & $fois & @CRLF & @CRLF & FileReadLine ($fichier,$alea) & @CRLF & @CRLF & $note & "/" & $c,10,10)
$reponse = GUICtrlCreateInput("", 10, 90, 95, 20)
$bouton = GUICtrlCreateButton("Envoyer", 10, 125, 75, 25, $BS_DEFPUSHBUTTON)
GUISetState(@SW_SHOW)
If FileReadLine ($fichier,$alea+2) <> "" Then
GUICreate("Image", 180, 165, 0, 0)
GUICtrlCreatePic ( FileReadLine ($fichier,$alea+2), 0, 0)
GUISetState(@SW_SHOW)
WinActivate ("Quizz")
Endif
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
Case $msg = $bouton
If GUICtrlRead($reponse) = FileReadLine ($fichier,$alea+1) Then
Else
$note -= 1
EndIf
$fois += 1
ExitLoop 1
EndSelect
WEnd
GUIDelete()
WEnd
FileClose($fichier)
Msgbox(64, "Quizz", "Votre note est de " & $note & "/" & $c)
Exit
EndFunc
Le fichier Quizz.txt, les retours à la ligne font que le script s'y retrouve, ressemblera à ça :
Code : Tout sélectionner
Quelle était le prénom de Staline ?
Joseph
staline.jpg
Quel était la nationalité de Kafka ?
Tchèque
Qui est l'auteur de «L'esprit des lois» ?
Montesquieu
Il faut laisser les deux lignes blanches du début et celles en cas d'absence d'image relative à la question. Tout cela est améliorable, évidemment, et je trouve d'ailleurs le principe de la réponse directe est un peu trop simple.
Re: [..] Une sorte de Quiz
Posté : sam. 16 mai 2009 13:08
par tolf
Merci de refaire un tour du côté de la présentation des messages :
http://www.autoitscript.fr/forum/viewto ... f=35&t=595
Sinon, pour le quiz, vous pouvez utiliser la structure de fichiers ini :
Code : Tout sélectionner
[question_1]
Question=Quelle était le prénom de Staline ?
Reponse=Joseph
Image=staline.jpg
[question_2]
Question=Quel était la nationalité de Kafka ?
Reponse=Tchèque
[question_3]
Question=Qui est l'auteur de «L'esprit des lois» ?
Reponse=Montesquieu
Ensuite, utilisez la fonction IniRead pour lire le fichier et IniWrite pour le modifier.
Re: [R] Une sorte de Quiz
Posté : dim. 17 mai 2009 12:08
par EricG
Merci,
l'idée de poster du code m'est venue d'un coup, je n'ai donc pas pensé à m'informer sur le protocole.
L'utilisation d'un fichier ini est peut être plus simple, mais j'ai bien travaillé sur l'usage d'un fichier texte classique.
A vrai dire, j'ai démarré un autre projet sur le même thème parce que je voulais quelque chose de moins simpliste. Donc, a priori, plus de textes, et des combos pour que l'utilisateur n'ait pas à entrer des réponses lui-même. Ce qui n'est pas facile c'est de proposer un fichier extérieur facile à mettre à jour tout en le rendant digeste pour le script. Je dois le faire évoluer pour le rendre décent.
Re: [R] Une sorte de Quiz
Posté : dim. 17 mai 2009 20:41
par tolf
EricG a écrit :Ce qui n'est pas facile c'est de proposer un fichier extérieur facile à mettre à jour tout en le rendant digeste pour le script. Je dois le faire évoluer pour le rendre décent.
Un .ini s'impose donc. Vous pouvez créer un script pour transférer les données du .txt déjà créé vers le .ini.
Re: [R] Une sorte de Quiz
Posté : sam. 23 mai 2009 00:34
par TaPuZ
Allez... Je sais que le sujet est résolu, mais comme je vais certainement utiliser un principe similaire, j'ai essayé de faire un bout du code recherché.
Je m'en remets à vous pour savoir s'il y a plus simple, ou plus malin, ou moins gourmand, etc...
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
Local $Q, $R, $I, $note, $reponse, $idI, $idQ, $idR
Global $c=0 , $K=0 , $n=3; compteurs.... $c pour le choix, $K pour le nombre de questions et $n le nbre total
; de questions dans le fichier ini
_Questions()
Func _Questions()
$c=Random(1, $n, 1); Choix aléatoires des questions
$Q = IniRead(@WorkingDir & "\quizz.ini", "question_"&$c, "Question", "") ; Lit la question dans le fichier ini (sur staline de son prénom Joseph, tout ça...)
$R = IniRead(@WorkingDir & "\quizz.ini", "question_"&$c, "Reponse", "") ;Lit la réponse dans l'ini
$I = IniRead(@WorkingDir & "\quizz.ini", "question_"&$c, "Image", "") ;Lit l'imaqe (3eme ligne, qui reste vide, sinon)
GUICreate("Quizz", 180, 165, -1, -1)
GUICtrlCreateLabel("Question n°" & $c &" - " & @CRLF & $Q & @CRLF & "Note : " & $note &"/" &$K,10,10) ; Affiche la question
$idreponse = GUICtrlCreateInput("", 10, 90, 95, 20) ; demande la réponse
$bouton = GUICtrlCreateButton("Envoyer", 10, 125, 75, 25, $BS_DEFPUSHBUTTON) ; définit le bouton
GUISetState(@SW_SHOW)
If $I <> "" Then ;s'il y a une image indiquée dans l'ini, l'affiche, sinon, non
GUICreate("Image", 180, 165, 0, 0)
GUICtrlCreatePic ( $I, 0, 0)
GUISetState(@SW_SHOW)
WinActivate ("Quizz")
Endif
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE ; Si on ferme la fenetre, on sort de l'application
Exit
Case $msg = $bouton ; si jamais on appuie sur le bouton envoyer
$reponse = GUICtrlRead($idreponse) ; on entre la valeur de l'input $idreponse dans la variable $reponse
verification ($R, $reponse) ; appel de la fonction verification
EndSelect
WEnd
Exit
Return
EndFunc
Func verification ($R, $reponse) ; fonction verification
Select
case $R = $reponse ; si la réponse donnée correspond à la réponse du fichier ini
$note=$note+1 ; on incrémente la note
$msg=MsgBox (0,"Gagné", "bravo") ; on dit ou la la bravo!
$K=$K+1; incrementation du compteur de questions
Select
Case $msg = $GUI_EVENT_CLOSE ; Si on ferme la fenetre, on sort de l'application
Exit
Case $msg = 1; si jamais on appuie sur le bouton envoyer
GUIDelete()
_Questions()
EndSelect
Case $R <> $reponse ; si la réponse inputée n'est pas identique à celle de l'ini
$K=$K+1; incrementation du compteur de questions
$msg=MsgBox (0,"Perdu", "oops") ; inutile d'incrémenter la note, et on boo!
Select
Case $msg = $GUI_EVENT_CLOSE ; Si on ferme la fenetre, on sort de l'application
Exit
Case $msg = 1 ; si jamais on appuie sur le bouton envoyer
GUIDelete()
_Questions()
EndSelect
EndSelect
Return
_Questions()
EndFunc
pour le fichier quizz.ini, j'ai repris celui de l'exemple
► Afficher le texte
Code : Tout sélectionner
[question_1]
Question=Quelle était le prénom de Staline ?
Reponse=Joseph
Image=staline.jpg
[question_2]
Question=Quel était la nationalité de Kafka ?
Reponse=Tchèque
[question_3]
Question=Qui est l'auteur de «L'esprit des lois» ?
Reponse=Montesquieu
J'attends vos critiques.
A bientôt
T@PµZ
Re: [R] Une sorte de Quiz
Posté : mar. 26 mai 2009 10:57
par EricG
Salut, cela servira aux internautes en tous cas, mais je voudrais savoir quel était votre projet personnel. Moi-même, j'ai changé un peu pour une version à texte à trous, parce que transmettre du savoir en dosettes, je n'y crois plus vraiment. J'ai un peu caler depuis.
Re: [R] Une sorte de Quiz
Posté : mar. 26 mai 2009 11:22
par TaPuZ
En réalité, quand je disais principe similaire, c'était dans l'utilisation des fonctions incriminées.
Pour m'entrainer, j'ai pensé à un script qui nous aide au boulot. En gros, il faut que l'utilisateur réponde à quelques questions, et les réponses sont sauvegardées sur son fichier ini personnalisé. Elles peuvent ensuite être comparées à une valeur référence issue du fichier reference.ini, et permettre ainsi une action appropriée de maintenance. Rien de folichon, mais je débute à peine. Et comme je devais plancher sur les questions/réponses, ainsi que les écritures/lectures de fichiers, je me suis entrainé sur cet exemple. Voilà tout.

Re: [R] Une sorte de Quiz
Posté : mer. 27 mai 2009 10:55
par EricG
Oui, effectivement, c'est tout autre chose.
Je vais peut être modifier le script pour inclure des déroulants. Ainsi, si l'utilisateur ne sait vraiment pas une réponse, il pourra toujours proposer quelque chose. Et puis, je pense même inclure plusieurs déroulants dans une question, qui serait plutôt un texte, pour faire mieux mémoriser.
Merci pour avoir illustrer ainsi la notion de fichier ini dans ce genre de script.
Re: [R] Une sorte de Quiz
Posté : mer. 27 mai 2009 14:05
par TaPuZ
Pour info, étant parti d'un principe similaire, toujours dans le but de m'entrainer, j'ai fait le même genre de code, mais avec des radios à checker, comme si on voulait faire un sondage, et totaliser le nombre de réponse dans chaque catégorie (le nombre de choix 1, le nombre de choix 2, ou le nombre de choix 3).
► Afficher le texte
Code : Tout sélectionner
#include <GuiConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <Date.au3>
Global $Choix1, $Choix2, $Choix3 ; Les variables Choix
Global $TotalChoix1 , $TotalChoix2, $TotalChoix3; Les variables TotlaChoix
; Je coupe les bouts de code inutile pour ne laisser que la fonction Questions
qstgpt ()
Func Qstgpt()
Local $i, $gpt, $gg, $pp, $tt
for $i= 1 to 4; si j'ai 4 questions
$qgpt=IniRead(@WorkingDir &"\Qst.gpt","Rubrique","Question" & $i,"") ;Je lis chaque question
$gg = IniRead(@WorkingDir &"\Qst.gpt","Rubrique","Choix " & $i &"-1","") ;d'une même rubrique
$pp=IniRead(@WorkingDir &"\Qst.gpt","Rubrique","Choix " & $i &"-2","") ;ainsi que les réponses possibles
$tt=IniRead(@WorkingDir &"\Qst.gpt","Rubrique","Choix " & $i &"-3","") ; et je les affecte a des variables
$Form1 = GUICreate("Questionnaire", 1156, 445, 23, 124)
$Oki = GUICtrlCreateButton(">>>Suivant", 648, 400, 100, 30, $BS_FLAT)
$RAZ = GUICtrlCreateButton(">>>RAZ<<<", 432, 400, 100, 30, $BS_FLAT)
$Label1 = GUICtrlCreateLabel($qgpt, 40, 16, 1076, 105)
$Label2=GUICtrlCreateLabel(" Choix 1 : " & $Choix1 & " Choix 2 : " & $Choix2 & " Choix 3 : " & $Choix3, 40, 30)
$RadioG = GUICtrlCreateRadio($gg, 40, 152, 1073, 57); Je cree ma fiche de réponse, en affichant mes radios
$RadioP = GUICtrlCreateRadio($pp, 40, 216, 1073, 57)
$RadioT = GUICtrlCreateRadio($tt, 40, 280, 1073, 65)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
Select
case $msg=$Oki ; Si on appuie sur la touche OK, on valide la réponse
$msg = GUIGetMsg()
If $radioG And BitAND(GUICtrlRead($radioG), $GUI_CHECKED) = $GUI_CHECKED Then
$Choix1=$Choix1+1 ; Si Choix1 est checkée
ExitLoop
ElseIf $radioP And BitAND(GUICtrlRead($radioP), $GUI_CHECKED) = $GUI_CHECKED Then
$Choix2=$Choix2+1 ; Si choix 2 est checkée
ExitLoop
ElseIf $radioT And BitAND(GUICtrlRead($radioT), $GUI_CHECKED) = $GUI_CHECKED Then
$Choix3=$Choix3+1 ; Si choix 3 est checkee
ExitLoop
EndIf
Case $msg = $GUI_EVENT_CLOSE ; Si on clique sur la croix, on ferme
fin()
case $msg= $RAZ ; Si on clique sur RAZ, on remet le compteur a zéro
$TotalChoix1=0
$TotalChoix2=0
$TotalChoix3=0
Qstgpt()
EndSelect
WEnd
Next
$TotalChoix1=$TotalChoix1+$Choix1 ; incremente TotalChoix1 de la valeur de Choix1
$TotalChoix2=$TotalChoix2+$Choix2 ; idem pour 2
$TotalChoix3=$TotalChoix3+$Choix3 ; idem pour 3
$Choix1=0 ; on remet à zéro les compteurs de questions
$Choix2=0
$Choix3=0
Moteur()
EndFunc
Func Fin()
; Lancement du splash screen.
SplashTextOn("", "Fermeture en cours, Veuillez patienter ...", 450, 70, -1, -1, 0 + 1 + 16 + 32, "Times New Roman", 12, 800)
; Pause de 3 secondes.
Sleep(3000)
; Fermeture du splash.
SplashOff()
Exit
EndFunc ;==>Fin
Func Moteur()
; Normalement c'est autre chose ici, mais pour l'exemple
MsgBox (0, "Totaux", " Choix 1 : " & $TotalChoix1 &@CRLF &" Choix 2 : " & $TotalChoix2 & @CRLF & " Choix 3 :" & $TotalChoix3)
fin()
Endfunc
Exemple à coller dans un fichier txt a renommer en Qst.gpt, dans le même répertoire que l'exemple du dessus
► Afficher le texte
Code : Tout sélectionner
[Rubrique]
Question1= question 1!
Choix 1-1= Choix 1 de la question 1
Choix 1-2= Choix 2 de la question 1
Choix 1-3= Choix 3 de la question 1
Question2= question 2!
Choix 2-1= Choix 1 de la question 2
Choix 2-2= Choix 2 de la question 2
Choix 2-3= Choix 3 de la question 2
Question3= question 3!
Choix 3-1= Choix 1 de la question 3
Choix 3-2= Choix 2 de la question 3
Choix 3-3= Choix 3 de la question 3
Question4= question 4!
Choix 4-1= Choix 1 de la question 4
Choix 4-2= Choix 2 de la question 4
Choix 4-3= Choix 3 de la question 4
Voilà. Si ça peut aider.
A bientôt.
T@PµZ.
Re: [R] Une sorte de Quiz
Posté : mar. 02 juin 2009 16:53
par flotos
Moi j'ai créé un quizz, et j'ai fait que "si il y a écrit niveau 2", alors sa lance enigme2.exe qui contient l'énigme 2 et la suite.
Exemple :
Code : Tout sélectionner
Local $bLoop = 1, $text, $niveau1, $user = @UserName, $domaine=@LogonDomain, $fichier="c:\windows\notepad.exe", $fichierini
if FileExists(@scriptdir&"\"&$fichierini&".ini") Then
$user =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "user","" )
$domaine =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "domaine" ,"")
$fichier =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "fichier" ,"")
$fichier =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "Niveau 2" ,"")
Run('C:\Enigme\Enigma2.exe')
Else
if FileExists(@scriptdir&"\"&$fichierini&".ini") Then
$user =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "user","" )
$domaine =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "domaine" ,"")
$fichier =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "fichier" ,"")
$fichier =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "Niveau 3" ,"")
Run('C:\Enigme\Enigma3.exe')
Else
if FileExists(@scriptdir&"\"&$fichierini&".ini") Then
$user =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "user","" )
$domaine =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "domaine" ,"")
$fichier =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "fichier" ,"")
$fichier =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "Niveau 4" ,"")
Run('C:\Enigme\Enigma4.exe')
Else
if FileExists(@scriptdir&"\"&$fichierini&".ini") Then
$user =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "user","" )
$domaine =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "domaine" ,"")
$fichier =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "fichier" ,"")
$fichier =IniRead ( @scriptdir&"\"&$fichierini&".ini", "execution en mode administrateur", "Niveau 5" ,"")
Run('C:\Enigme\Enigma5.exe')
endif
Re: [R] Une sorte de Quiz
Posté : mar. 02 juin 2009 17:40
par TaPuZ
Je persiste dans mon exemple

, même si je trouve le votre intéressant. C'est juste pour essayer de lier les deux, sans avoir à lancer plusieurs exe.
Pourquoi ne pas sauvegarder le niveau dans le log du joueur, et/ou permettre au joueur de choisir son niveau, et auquel cas, il suffit de piocher dans le fichier Qst.gpt, les questions de la rubrique correspondante.
Il suffirait alors de l'organiser ainsi :
Code : Tout sélectionner
[Niveau] ; rubrique niveau
2 ; niveau sauvegardé du joueur
[Score] ; rubrique score du joueur
218 ; score du joueur
[Niveau1] ; rubrique des questions du niveau 1
Question1 = question 1
reponse1 = réponse 1
Question2= question 2
Reponse2 = réponse 2
Questionn = question n
Reponsen = réponse n
[Niveau2]
etc...
C'est une idée comme une autre, non?