Page 1 sur 1

Culture générale

Publié : ven. 08/sept./2017 12:14
par Micoute
Bonjour à tous,

J'ai créé un logiciel de culture générale et je souhaite qu'à chaque question une liste chaînée "Question_deja_posee()" s'incrémente sauf si la question a déjà était posée, je fais, défais, refais, mais toujours sans bons résultats, car mon filtre n'est pas assez efficace.

Je viens une fois de plus solliciter votre aide bienveillante et je vous en remercie par avance, j'ai joins dans l'archive tous les fichiers nécessaires à son exécution.

http://dl.free.fr/pA51jLAk2

Re: Culture générale

Publié : ven. 08/sept./2017 12:31
par case
Salut micoute pourquoi ne fais tu pas une copie de ta liste chainée au début du jeu puis a chaque question posée tu supprime l’élément de la question une fois la réponse donnée

Code : Tout sélectionner


NewList mesquestions.s() ; crée la liste de questions
NewList copiequestions.s() ; crée la liste de questions
For a=1 To 20 : AddElement(mesquestions()):mesquestions()="question "+Str(a):Next
Repeat
  Debug "nouvelle partie je copie la liste"
  CopyList(mesquestions(),copiequestions())
  Repeat
    Delay(1000)
    Debug Str(ListSize(mesquestions()))+" questions restantes"
    SelectElement(mesquestions(),Random(ListSize(mesquestions())-1)) ;choisis une question au hazard
    Debug mesquestions() ;affiche la question
    ; on assume que la reponse a ete donnée
    DeleteElement(mesquestions(),1)
  Until ListSize(mesquestions())=0
  Debug "fin de la partie je Restore la liste"
  CopyList(copiequestions(),mesquestions())
  
  
  
ForEver



Re: Culture générale

Publié : ven. 08/sept./2017 12:33
par Ar-S
+1
Tu peux aussi (La même réponse qu'à chaque fois..)
Dans ta structure Element, ajoute Dejaposee.b
Ainsi si Dejaposee =0 la question n'a pas été posée et si = 1 la question a été posée... Ainsi tu seras sûr d'éviter les répétitions.

Re: Culture générale

Publié : ven. 08/sept./2017 13:00
par case
j'ai teste ton logiciel et il ne gère pas les réponses pour le moment mais si tu implémente les réponses
tu pourra éventuellement ne supprimer une question que si la réponse est juste pour pouvoir la reposer plus tard si la réponse est fausse.

Code : Tout sélectionner

Structure question
  question.s
  choix.s
  reponse.i  
EndStructure
NewList mesquestions.question()   ; crée la liste de questions
NewList copiequestions.question() ; crée la copie de la liste de questions
oq.s                              ; stoque la question posée precedement
; questiuons----------------------
For a=1 To 10                     
  AddElement(mesquestions())
  mesquestions()\question="question "+Str(a)
  choixpossible=Random(5,3)
  For ch=1 To choixpossible
    If  ch<>1
        mesquestions()\choix + "|"
    EndIf
    mesquestions()\choix + "["+Str(ch)+"] reponse "+Str(ch)
  Next  
  mesquestions()\reponse=Random(choixpossible,1)
Next
; fin de la creation des questions random

Repeat  
  Debug "nouvelle partie je copie la liste"
  CopyList(mesquestions(),copiequestions())         ; sauvegarde la liste complete de questioins
  Repeat
    lst=ListSize(mesquestions())                    ; nombre de questions restantes
    Repeat                                          ; on cherche une question differente de la precedente
        SelectElement(mesquestions(),Random(lst-1)) ; choisis une question au hazard
    Until mesquestions()\question<>oq Or lst=1      ; on repete tant que la question n'est pas differente de celle posée juste avant ou si il n'en reste qu'une azu cas ou on se plante toujours sur la derniere ^^
    ;
    oq=mesquestions()\question                      ; met la question choisie dans la variable de comparaison
    ;
    Debug mesquestions()\question                   ;affiche la question
                                                    ;
    choixmax=CountString(mesquestions()\choix,"|")+1
    For choix=1 To choixmax                        ; affiche les choix
      Debug StringField(mesquestions()\choix,choix,"|")    ; de reponses
    Next                                                   ; possibles 
    ;
    rep=Random(choixmax,1)                                 ; reponse aleatoire 
    Debug "ma réponse ("+Str(choixmax)+") :"+Str(rep)                           ; affiche la reponse
    ;
    If rep=mesquestions()\reponse                          ; reponse juste
      Debug "bonne reponse"
      DeleteElement(mesquestions(),1)                      ; efface la question car deja posée
      Debug "il reste "+Str(ListSize(mesquestions()))+" questions"
    Else                                                   ; reponse fausse
      Debug "mauvaise réponse la bonne réponse etait "+Str(mesquestions()\reponse)
      Debug "il reste "+Str(ListSize(mesquestions()))+" questions"
    EndIf
    Delay(2000)                                            ; on attent qu'on pouiise voir le resultat^^ 
  Until ListSize(mesquestions())=0                         ; si il n'y a plus de question on sort du jeu
  Debug "fin de la partie je Restore la liste"        
  CopyList(copiequestions(),mesquestions())     ; on recopie la sauvegarde des questions dans la liste de question
  
ForEver ;on recommence une partie

Re: Culture générale

Publié : ven. 08/sept./2017 19:33
par Micoute
Merci beaucoup pour vos aides qui m'ont beaucoup apporté, mais ce n'est pas encore résolu, je crois qu'il faut que je change la conduite de mon programme.

Re: Culture générale

Publié : ven. 08/sept./2017 21:54
par microdevweb
Bonjour Micoute,

Moi personnellement pour ce type de projet tout en ayant jeté un œil sur ton code, je ne travaillerais pas avec des listes mais avec une base de données sqlite.

Il devient alors d'une grande facilité de gérer tous les filtres que tu désire et cela avec beaucoup plus de souplesse que l'utilisation de listes,map ou array.

Au passage tu peux même créer un base de donnée en mémoire, mais je ne pense pas que cela soit utile dans ce cas précis.

Re: Culture générale

Publié : sam. 09/sept./2017 6:33
par Micoute
Merci, je vais changer de stratégie, j'envisage déjà quelques solutions.

Re: Culture générale

Publié : sam. 09/sept./2017 12:41
par Micoute
Finalement j'ai trouvé une solution avec RandomizeList(), ce qui me permet d'incrémenter une variable qui "Choisi" l'élément de la liste correspondant sans risque de redondance, et qui fait un semblant de questions aléatoires.

Merci à tout le monde.