Help pour TP de programmation

lilutresor -  
 tech_57 -
Bonjour à tous,

Je suis toute nouvelle sur le forum et toute novice en VBA.

J'ai un TP à faire sur Excel :

chaque joueur doit répéter à son tour la liste des lettres données par le joueur précédent et en ajouter une.
le joueur qui se trompe a perdu.

Pour le moment, j'ai fait ça :

Sub PP_Jeu()
Dim Liste1 As String
Dim Fin As Boolean
Dim joueurs As Integer
Dim Liste2 As String
Dim Compteur As Integer
Dim nouvellelettre As String

Liste1 = InputBox("Entrer une lettre")
Fin = False
joueurs = 1
Liste2 = ""
Compteur = 1
MsgBox (Liste1)

While Fin = False Or Compteur > 50
Call Echange_J
Liste2 = InputBox("Entrer la liste")

If Liste1 = Liste2 Then
nouvellelettre = InputBox("entrez une nouvelle lettre")
Liste1 = Liste1 & nouvellelettre
Liste1 = Liste1 & MsgBox(Liste1)
Call Echange_J
Else: Fin = True
End If

Compteur = Compteur + 1

Wend

MsgBox ("Bravo")
End Sub

Sub Echange_J()

Dim joueurs
joueurs = 1

If joueurs = 1 Then
joueurs = 2
Else: joueurs = 1
End If

End Sub

Problème : le jeu s'arrête alors qu'il ne devrait pas !

SVP help ! je ne comprends pas ou je 'bug'.

Bonne journée, merci de m'avoir lue.
Configuration: Windows Vista

12 réponses

  1. tech_57
     
    Bonjour

    Cette ligne n'est pas correcte
    Liste1 = Liste1 & MsgBox(Liste1)

    Enlève la

    De plus ton Sub Echange_J ne fait rien
    1) la déclaration Dim joueurs à l'intérieur de la procédure en fait une variable locale, elle n'est pas visible ou accessible en dehors de cette procédure

    2) tu mets joueurs = 1
    et ensuite tu teste If joueurs = 1 Then joueurs = 2 ...
    ce test est toujours vérifié et joueurs sera toujours égale à 2

    3)dans la sub PP_Jeu qui appelle Echange_J, tu ne fais jamais référence à joueurs.

    A+
    0
  2. byjulie
     
    rebonjour,

    merci tech pour ta reponse.

    j'ai un peu retravaillé dessus, voici ce que ça donne :

    /CODE/

    Sub PP()
    Dim liste As String
    Dim rep As String
    Dim lettre As String
    Dim fin As Boolean
    Dim joueur As Byte

    'on initialise
    fin = False
    joueur = 1
    compteur = 1
    lettre = InputBox("Joueur" & joueur & "entre une première lettre")

    If Len(lettre) <> 1 Or lettre <> tableau Then
    MsgBox ("entrez une seule lettre de l'alphabet en minuscule s'il vous plaît")
    Else
    While Len(lettre) = 1 And lettre = tableau
    liste = lettre
    Wend
    End If

    'on commence le jeu
    While fin = False Or Len(liste) < 50
    joueur = Abs(joueur - 2) + 1
    rep = InputBox("joueur" & joueur & "entre la liste" & Chr(13) & "(" & Len(liste) & "caractère(s))")
    If rep <> liste Then
    fin = True
    Else

    lettre = InputBox("Joueur" & joueur & "entre la lettre suivante")
    If Len(lettre) <> 1 Or lettre <> tableau Then
    MsgBox ("entrez une seule lettre de l'alphabet en minuscule s'il vous plaît")
    End If

    While Len(lettre) = 1 And lettre = tableau(i)
    liste = liste & lettre
    Wend

    End If
    Wend

    End Sub

    Function tableau()

    tableau(1) = "a"
    tableau(2) = "b"
    tableau(3) = "c"
    tableau(4) = "d"
    tableau(5) = "e"
    tableau(6) = "f"
    tableau(7) = "g"
    tableau(8) = "h"
    tableau(9) = "i"
    tableau(10) = "j"
    tableau(11) = "k"
    tableau(12) = "l"
    tableau(13) = "m"
    tableau(14) = "n"
    tableau(15) = "o"
    tableau(16) = "p"
    tableau(17) = "q"
    tableau(18) = "r"
    tableau(19) = "s"
    tableau(20) = "t"
    tableau(21) = "u"
    tableau(22) = "v"
    tableau(23) = "w"
    tableau(24) = "x"
    tableau(25) = "y"
    tableau(26) = "z"

    End Function

    /CODE/

    seulement le souci c'est que ça bug dès la première lettre. il me dit "erreur d éxécution 28" et propose "fin" ou "débogage"
    apparemment c'est dans ma fonction tableau que ç pêche mais je ne comprends pas pourquoi?
    0
  3. tech_57
     
    Bonjour,

    La fonction tableau est mal déclarée.
    En fait, une fonction est appelée en général avec un ou plusieurs arguments (ou paramètres ou valeurs) et retourne une valeur du meme type que la fonction.
    Ex: imagine une fonction qui ajoute 1 à un nombre donné

    Function ajoute1(n as integer) as integer
    ajoute1=n+1
    end function

    Cette fonction reçoit un entier en paramètre et retourne un entier, et on s'en sert comme ça:
    i=1
    i=ajoute1(i)

    -> i reçoit la valeur 2

    Or ta fonction Tableau n'a pas de type défini. De plus tu utilise le nom de la fonction pour initialiser une table non dimensionnée. Une table doit etre dimensionnée avant d'etre utilisée:
    Dim Table1(26) as tring ce qui veut dire Table1 est une table de 26 éléments maxi de type string

    Courage, c'est en programmant qu'on devient programmeur.

    A+.
    0
    1. byjulie Messages postés 5 Statut Membre
       
      Re tech_57,

      c'est lilutresor mais cette fois je me suis inscrite...

      donc j'ai tenté de faire ce que tu viens de me dire càd déclarer 26cases : ça ne marche pas, il dit que ce n'est pas le bon argument il me semble.

      je tourne en rond, je ne sais vraiment pas comment m'en sortir. sur un autre forum on m'a donné des solutions directes mais le problème est qu'il y a certaines choses que je n'ai pas vu en cours donc si je me ramène avec un truc qui marche mais qui ne correspond pas au cours, le prof va évidemment comprendre que je ne suis pas l'auteur du prog. et c'est pas le but. mais bon jsuis vmt pas une lumiere en prog.

      bref. j'ai refait mon arbre et ça me semble bon pourtant.

      pffff. je vais poster ce que je fais aujourd'hui.

      à tutaleer
      0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. byjulie Messages postés 5 Statut Membre
     
    voici ma nouvelle solution mais en fait, j'ai l'impression qu'il ne rentre pas dans le si :

    CODE :
    Sub PP_Jeu()
    Dim Solution As String
    Dim fin As Boolean
    Dim Nb As Integer
    Dim Joueur As Integer
    Dim Proposition As String
    Dim Compteur As Integer
    Dim nouvellelettre As String

    Solution = InputBox("Entrer une lettre")
    fin = False
    Nb = 2
    Joueur = 1
    Proposition = ""
    Compteur = 1
    MsgBox (Solution)

    While fin = False Or Compteur < 10
    Joueur = Abs(Joueur - 2) + 1
    Proposition = InputBox("Entrer la liste")
    If Solution = Proposition Then
    nouvellelettre = InputBox("entrez une nouvelle lettre")
    Solution = Solution & nouvellelettre
    Solution = Solution & MsgBox(Solution)
    Joueur = Abs(Joueur - 2) + 1
    Else: fin = True
    End If

    Compteur = Compteur + 1

    Wend

    MsgBox ("Bravo")

    End Sub


    /CODE
    0
  6. tech_57
     
    Salut,

    Regarde dans la boucle While ... Wend
    j'ai rajouté une ligne pour afficher les variables de controle à chaque tour
    Comme ça tu peux voir ce qui cloche

    While fin = False Or Compteur < 10
    Joueur = Abs(Joueur - 2) + 1
    Proposition = InputBox("Entrer la liste")
    MsgBox "compteur= " & Compteur & " : Joueur=" & Joueur & " : Proposition= " & Proposition & " : Solution= " & Solution
    If Solution = Proposition Then
    nouvellelettre = InputBox("entrez une nouvelle lettre")
    Solution = Solution & nouvellelettre
    Solution = Solution & MsgBox(Solution) ' <- il y a une erreur ici
    Joueur = Abs(Joueur - 2) + 1
    Else: fin = True
    End If
    Compteur = Compteur + 1
    Wend

    Essaye de corriger, ou bien est-ce que je peux te proposer une solution?

    A+.
    0
  7. byjulie Messages postés 5 Statut Membre
     
    coucou tech_57,

    alors voilà j'ai tout repris depuis le début :

    Sub jeu()
    
    Dim compteur As Integer
    Dim joueur As Integer
    Dim solution, proposition, lettre As String
    Dim arret As Boolean
    Dim final As Variant
    Dim i As Integer
    
    arret = False
    compteur = 1
    joueur = 1
    solution = InputBox("Joueur  " & joueur & Chr(13) & "Entrez une première lettre")
    
    While arret = False And compteur < 5
    
    joueur = Abs(joueur - 2) + 1
    proposition = InputBox("Joueur  " & joueur & Chr(13) & "Entrez votre proposition")
    compteur = compteur + 1
    
    If proposition = solution Then
    lettre = InputBox("Joueur  " & joueur & Chr(13) & "Entrez une nouvelle lettre")
    solution = solution & lettre
    MsgBox ("la nouvelle lettre est  " & lettre & Chr(13) & "il faut rentrer  " & compteur & "  caractères")
    Else
    arret = True
    End If
    Wend
    Call resultat(arret, joueur)
    End Sub
    
    Sub resultat(arret As Boolean, joueur As Integer)
    
    If arret = True Then
    MsgBox ("le joueur  " & joueur & " a perdu")
    Else
    MsgBox "Egalité"
    End If
    
    End Sub
    
    
    


    XD CA FONCTIONNE ! ;-)

    Bon maintenant je voudrais faire les 'finitions' càd, si le joueur entre autre chose qu'une lettre en dehors de abc[...]z en minuscule ou plus d'une lettre alors une msgbox s'affiche demandant de recommencer.
    là j'ai un peu plus de mal est ce que tu peux me filer un coup de pouce?

    mais bon, déjà je pense qu'avec ça je m'assure la moyenne.

    peux tu me dire si ma sub est correcte pour le résultat?
    0
  8. tech_57
     
    OK , ça fonctionne

    Pour verifier les entrées, il faut comparer les chaines de caractères
    j'ai ajouté ce test:

          If lettre = "" Or lettre < "a" Or lettre > "z" Or Len(lettre) > 1 Then
             MsgBox "ERREUR DE SAISIE - RECOMMENCEZ"
             erreur = True
        Else
            erreur = False
            solution = solution & lettre
            MsgBox ("La nouvelle lettre est  " & lettre)
        End If
    


    Bien sur il a fallu aussi adapter le code, voici la sub rectifiée au complet , dis-moi si des choses sont hors programme, on simplifiera.

    Sub jeu()
    
    Dim compteur As Integer
    Dim joueur As Integer
    Dim solution, proposition, lettre As String
    Dim arret As Boolean, erreur As Boolean
    Dim final As Variant
    Dim i As Integer
    
    arret = False: erreur = False
    compteur = 1
    joueur = 1
    solution = InputBox("Joueur  " & joueur & Chr(13) & "Entrez une première lettre")
    
    While arret = False And compteur < 5
       If erreur = False Then
         joueur = Abs(joueur - 2) + 1
         proposition = InputBox("Joueur  " & joueur & Chr(13) & "Entrez votre proposition." & " Il faut entrer  " & compteur & "  caractères")
         compteur = compteur + 1
       End If
       If proposition = solution Then
          If erreur = False Then MsgBox "EXACT!!"
          lettre = InputBox("Joueur  " & joueur & Chr(13) & "Entrez une nouvelle lettre")
          If lettre = "" Or lettre < "a" Or lettre > "z" Or Len(lettre) > 1 Then
             MsgBox "ERREUR DE SAISIE - RECOMMENCEZ"
             erreur = True
        Else
            erreur = False
            solution = solution & lettre
            MsgBox ("La nouvelle lettre est  " & lettre)
        End If
    Else
       arret = True
    End If
    
    Wend
    Call resultat(arret, joueur)
    End Sub
    


    A+.
    0
  9. byjulie Messages postés 5 Statut Membre
     
    re tech_,

    alors justement j'ai créé une solution qui ressemble à la tienne mais à partir de proposition je tourne en rond je n'arrive pas à sortir de mon tant que. c'est une histoire avec les len à mon avis, peux tu me corriger?

    Sub jeu()

    Dim compteur As Integer
    Dim joueur As Integer
    Dim solution As String
    Dim proposition As String
    Dim lettre As String
    Dim arret As Boolean
    Dim mot As String

    arret = False
    compteur = 1
    joueur = 1
    mot = "abcdefghijklmnopqrstuvwxyz"
    solution = InputBox("Joueur " & joueur & Chr(13) & "Entrez une première lettre")
    While contient(solution, mot) = False Or Len(solution) <> 1
    MsgBox ("il faut saisir un caractère en minuscule compris entre a et z!")
    solution = InputBox("Joueur " & joueur & Chr(13) & "Entrez à nouveau une première lettre")
    Wend

    While arret = False And compteur < 5

    joueur = Abs(joueur - 2) + 1
    proposition = InputBox("Joueur " & joueur & Chr(13) & "Entrez votre proposition")
    While contient(proposition, mot) = False Or Len(proposition) <> Len(solution)
    MsgBox ("il faut saisir " & compteur & " caractère(s) en minuscule compris entre a et z!")
    proposition = InputBox("Joueur " & joueur & Chr(13) & "Entrez à nouveau votre proposition")
    Wend

    compteur = compteur + 1

    If proposition = solution Then
    lettre = InputBox("Joueur " & joueur & Chr(13) & "Entrez une nouvelle lettre")
    While contient(lettre, mot) = False Or Len(lettre) <> 1
    MsgBox ("il faut saisir un caractère en minuscule compris entre a et z!")
    lettre = InputBox("Joueur " & joueur & Chr(13) & "Entrez à nouveau une nouvelle lettre")
    Wend

    solution = solution & lettre
    MsgBox ("la nouvelle lettre est " & lettre & Chr(13) & "il faut rentrer " & compteur & " caractères")
    Else
    arret = True
    End If
    Wend
    Call resultat(arret, joueur)
    End Sub

    Sub resultat(arret As Boolean, joueur As Integer)

    If arret = True Then
    MsgBox ("le joueur " & joueur & " a PERDU" & Chr(13) & "le joueur " & Abs(joueur - 2) + 1 & " a GAGNE")
    Else
    MsgBox "Egalité"
    End If

    End Sub

    Function contient(lettre As String, mot As String) As Boolean
    Dim cont As Boolean
    Dim i As Integer

    cont = False

    For i = 1 To Len(mot)

    If Mid(mot, i, 1) = lettre Then
    cont = True
    End If
    Next i

    contient = cont

    End Function
    0
  10. tech_57
     
    L'erreur est dans la fonction contient.

    Cette fonction verifie si une lettre est contenue dans un mot, ça marche avec une seule lettre

    or tu fais ce test

    While contient(proposition, mot) = False Or Len(proposition) <> Len(solution)
    ...
    Wend

    au premier passage, proposition a un seul caractère, alors ça marche
    au deuxième passage, proposition a deux caractères, alors dans la fonction contient, le premier parametre (lettre) prend la valeur de solution, et la comparaison If Mid(mot, i, 1) = lettre compare un caractère de mot à la chaine lettre toute entière comme par exemple "a" = "ab", et donc le test sera faux, d'où la boucle sans fin.

    Voila, je crois que tu dois tester uniquement les entrées des nouvelles lettres.
    La proposition est soit juste, soit fausse, tant pis pour le joueur qui se trompe. Ou bien il faut revoir ta fonction.

    A+.
    0
  11. byjulie Messages postés 5 Statut Membre
     
    re,

    j'essaie de revoir ma fonction mais je n'y arrive pas. je ne comprends pas ce que je peux changer. peux tu m'éclairer?
    0
  12. tech_57
     
    Bonjour,

    Voici l'astuce, il faut utiliser la fonction Instr qui recherche une chaine contenue dans une autre chaine.
    Si oui, elle renvoie la position de la chaine recherchée dans l'autre chaine
    Si non, elle renvoie 0
    Exemple: Instr("abc","b") retourne 2, Instr("abc","ab") retourne 1 , Instr("abc","x") retourne 0

    On regarde si chaque caractère de lettre est contenu dans mot
    Si un seul caractère n'est pas dans mot alors cont=false

    Ca donne ceci

    Function contient(lettre As String, mot As String) As Boolean
    Dim cont As Boolean
    Dim i As Integer
    
    cont = True
    
    For i = 1 To Len(lettre)
    
    If InStr(mot, Mid(lettre, i, 1)) = 0 Then
       cont = False
    End If
    
    Next i
    
    contient = cont
    
    End Function


    A+.
    0