Programmation mastermind
Répondre à la discussion
Page 1 sur 3 12 DernièreDernière
Affichage des résultats 1 à 30 sur 76

Programmation mastermind



  1. #1
    invite0bb5307a

    Programmation mastermind


    ------

    Nous avons choisi de programmer le mastermind pour notre projet informatique. Il y a 12 essais et la combinaison à trouver est une suite de 4 chiffres de 1 à 8. 10 = bonne couleur mal placée, 11 = bonne couleur bien placée
    Notre premier essai de programme était :
    Code:
    S=round(7*rand(1,4)+1)
    A=[]
    for k=1:12
        M=input('entrer une matrice de 4 chiffres de 1 à 8 :')
        if size(M)~=[1,4] then disp ('mauvais format')
    else
        for u=1:4
            for v=1:4
                if M(u)==S(v) then
                    if u==v
                        then A=[A,11]
                    else A=[A,10]
                        end
        end
    end
    end end end
    
    if M==S then disp('Gagné')
    end
    C'est mieux avec les balises code

    Mais il ne fonctionne pas et en plus, nous n'avons pas le droit de mettre de break. Nous devons utiliser des while.
    Pouvez vous nous aider pour faire fonctionner ce programme en changeant les boucles for en while car l'an dernier, on utilisait beaucoup les break dans les boucles if..
    Merci beaucoup.

    -----
    Dernière modification par Jack ; 25/10/2011 à 17h37.

  2. #2
    invite4492c379

    Re : Programmation mastermind

    Hello,


    On va commencer par indenter correctement le code.

    Code:
    S=round(7*rand(1,4)+1)
    A=[]
    for k=1:12
        M=input('entrer une matrice de 4 chiffres de 1 à 8 :')
        if size(M)~=[1,4] then 
            disp ('mauvais format')
        else
            for u=1:4
                for v=1:4
                    if M(u)==S(v) then
                        if u==v then
                            A=[A,11]
                        else
                            A=[A,10]
                        end
                    end
                end
            end
        end
    end
    
    if M==S then
        disp('Gagné')
    end
    C'est du matlab ?
    À première vue il me semble que le code est incomplet et faux :

    * A est initialisé juste une fois en dehors de la boucle k
    * On affiche jamais A
    * Un élement bien placé peut être affiché comme mal placé
    * Le test de victoire est en dehors de la boucle.


    Sinon pour transformer une boucle for en while c'est relativement simple :

    Code:
    pour i de 1 à n faire
      truc1
      si (test) alors
        break
      fin si
      truc2
    fin pour
    donne

    Code:
    i=1
    test=faux
    tant que (i<=n) et (non test)
      truc 1
      test = ...
      si (non test) alors
        truc 2
      fin si
      i=i+1
    fin tant que
    Bon, c'est donné à la volée pour faire une idée ...

  3. #3
    invite0bb5307a

    Re : Programmation mastermind

    Je le fais sur scilab sur mon ordinateur mais le programme devrait être en matlab.
    Pour "Un élement bien placé peut être affiché comme mal placé" je ne vois pas pourquoi.

    Est ce que c'est mieux pour les autres points là :

    Code:
    S=round(7*rand(1,4)+1)
    for k=1:12
        A=[]
        M=input('entrer une matrice de 4 chiffres de 1 à 8 :')
        if size(M)~=[1,4] then 
            disp ('mauvais format')
        else
            for u=1:4
                for v=1:4
                    if M(u)==S(v) then
                        if u==v then
                            A=[A,11]
                        else
                            A=[A,10]
                        end
                    end
                end
            end
        end
    if M==S then
        disp('Gagné')
    end
    A
    end
    Dernière modification par yoda1234 ; 25/10/2011 à 19h44.

  4. #4
    invite0bb5307a

    Re : Programmation mastermind

    J'avais justement oublié de copier le break, d'où votre remarque :

    Code:
    S=round(7*rand(1,4)+1)
    for k=1:12
    A=[]
    M=input('entrer une matrice de 4 chiffres de 1 à 8 :')
    if size(M)~=[1,4] then
    disp ('mauvais format')
    else
    for u=1:4
    for v=1:4
    if M(u)==S(v) then
    if u==v then
    A=[A,11] break
    else
    A=[A,10]
    end
    end
    end
    end
    end
    if M==S then
    disp('Gagné')
    end
    A
    end
    Sinon, j'ai juste à modifier la deuxième boucle for en while?
    Dernière modification par yoda1234 ; 25/10/2011 à 19h45.

  5. A voir en vidéo sur Futura
  6. #5
    invite0bb5307a

    Re : Programmation mastermind

    Je ne comprends pas trop ce que représente les "test" dans les boucles while

    Sinon, j'ai ça :

    Code:
            for u=1:4
                v=1
                while i<=4
                    if M(u)==S(v) then
                        if u==v then
                            A=[A,11]
                        else
                            A=[A,10]
                        end
                        v=v+1
                        end
                    end
                end
            end
    Dernière modification par yoda1234 ; 25/10/2011 à 19h45.

  7. #6
    invite4492c379

    Re : Programmation mastermind

    Juste sur le point «mal indiqué»

    Si tu as M= [ 1,1,1,1 ] et S=[1,2,2,1] par exemple

    dans la double boucle sur u et v

    quand u=1,v=1
    M(u)=S(v), donc A=[10]

    quand u=1,v=2
    M(u) différent de S(v)

    quand u=1,v=3
    M(u) différent de S(v)

    quand u=1,v=4
    M(u)=S(v), donc A=[10,11]

    ....

    Pour poster du code il faut le placer entre les balises [ code] et [/code] pour la lisibilité.

    Nom : code.png
Affichages : 187
Taille : 1,3 Ko

  8. #7
    invite4492c379

    Re : Programmation mastermind

    test est un ... test comme par exemple u==v

    Nom : code.png
Affichages : 222
Taille : 1,3 Ko

  9. #8
    yoda1234

    Re : Programmation mastermind

    Citation Envoyé par photon57 Voir le message
    C'est rectifié.
    Là où l'ignorance est un bienfait, c'est de la folie d'être sage (Thomas Gray).

  10. #9
    invite0bb5307a

    Re : Programmation mastermind

    Merci pour le renseignement, je ne savais pas !

    J'ai ça :

    Code:
    S=round(7*rand(1,4)+1)
    for k=1:12
        A=[]
        M=input('entrer une matrice de 4 chiffres de 1 à 8 :')
        if size(M)~=[1,4] then 
            disp ('mauvais format')
        else
            for u=1:4
                v=1
                while i<=4
                    if M(u)==S(v) then
                        if u==v then
                            A=[A,11]
                        else
                            A=[A,10]
                        end
                        v=v+1
                        end
                    end
                end
            end
        end
    if M==S then
        disp('Gagné')
    end
    A
    end

  11. #10
    invite0bb5307a

    Re : Programmation mastermind

    C'est bien sûr faux ce que je viens de proposer.

    Je ne vois pas du tout comment la boucle while s'arrête..

  12. #11
    invite4492c379

    Re : Programmation mastermind

    Citation Envoyé par alice1812 Voir le message
    C'est bien sûr faux ce que je viens de proposer.

    Je ne vois pas du tout comment la boucle while s'arrête..
    le test serait plutôt v<=4 ...

    En fait il faudra plutôt commencer par faire un algo en Français avant de le coder, plutôt que de faire un code à peu près bon qu'on modifie au petit bonheur la chance ...

    l'algo pourrait commencer par :

    Code:
    S= combinaison aléatoire
    jeu_fini = faux
    essai=1
    trouvé=faux
    tant que non jeu_fini
    
        combinaison_valide=faux
        tant que non combinaison_valide
            Demander combinaison M
            combinaison_valide = M est une matrice de 4  nombres
        fin tant que
    
        ....
    
    fin tant que
    peux-tu continuer cet algorithme ?

  13. #12
    invite0bb5307a

    Re : Programmation mastermind

    Où est le français là..?

    Code:
    u=1
    v=1
    tant que non v<4
    M(u) égal S(u)
    v=v+1

  14. #13
    invite4492c379

    Re : Programmation mastermind

    J'essaye simplement de t'aider ...

    Ce n'est pas en produisant un code approximatif qui ne fonctionne pas car entre autre il y a des erreurs de conception et de compréhensions qu'il va se transformer magiquement en programme qui fonctionne en modifiant au hasard un petit bout par ci et un autre par là.

    Pour produire un programme qui fonctionne, il faut commencer (surtout quand les concepts utilisés ne sont pas maitrisés) par écrire un pseudo code «facilement» compréhensible par un lecteur humain et «facilement» traduisible en code par la suite.
    En suivant quelques règles simples, tu peux même t'assurer que le code produit fait effectivement ce que tu voulait qu'il fasse.
    Une de ces règles simples est par exemple de décrire de plus en plus finement ce que tu veux produire

    0. Générer une combinaison aléatoire S
    1. Demander M à l'utilisateur
    2. Si M n'est pas valide recommencer en 1.
    3. Si M=S alors c'est gagné et en finir avec le programme et afficher des louanges
    4. Sinon Générer A qui est une matrice à 4 éléments qui vérifient:
    * A(i) vaut 10 si M(i) = S(i) // bien placé
    * A(i) vaut 11 si il existe j différent de i tel que M(i) = S(j)
    * A(i) vaut ???? si M(i) n'apparait nulle part dans S
    5. Afficher A
    6. on recommence en 1

    En faisant ça tu n'aurais pas mal placé le test de la victoire par exemple.

    Ensuite tu peux essayer de faire apparaitre des boucles ... c'est-à-dire écrire un algo qui va utiliser des while par exemple

    Tu peux toujours essayer de te débrouiller en codant à la volée mais c'est risqué surtout si tu débutes.

    EDIT : J'ai oublié le nombre de coup maximum à vérifier ...
    6. nombre de coup joué = nombre de coup joué + 1
    7. si nombre de coup joué <= 12 on recommence en 1.

  15. #14
    invite0bb5307a

    Re : Programmation mastermind

    Je sais et je vous en remercie.
    C'est juste que je ne comprend pas grand chose..

    Maintenant c'est mieux, je vais tenter de refaire ça demain.

    Merci beaucoup.

  16. #15
    invite0bb5307a

    Re : Programmation mastermind

    Je ne dois plus mettre de boucle for du tout alors?

    Est ce que celui là est juste même s'il y a encore des break?

    Code:
    S=round(7*rand(1,4)+1)
    for k=1:12
        M=input('entrer une matrice de 4 chiffres de 1 à 8 :')
        if size(M)~=[1,4] then 
            disp ('mauvais format')
        else
            if M==S then
                disp('Gagné'), break
            else A=[]
                for u=1:4
                for v=1:4
                    if M(u)==S(v) then
                        if u==v then
                            A=[A,11], break
                        else
                            A=[A,10], break
                        end
                    end
                end
            end
        end
    end
    A
    end
    Il me paraît mieux mais il ne bloque pas le programme lorsque M=S.

  17. #16
    invite4492c379

    Re : Programmation mastermind

    Citation Envoyé par alice1812 Voir le message
    Je ne dois plus mettre de boucle for du tout alors?

    Est ce que celui là est juste même s'il y a encore des break?

    Code:
    S=round(7*rand(1,4)+1)
    for k=1:12
        M=input('entrer une matrice de 4 chiffres de 1 à 8 :')
        if size(M)~=[1,4] then 
            disp ('mauvais format')
        else
            if M==S then
                disp('Gagné'), break
            else A=[]
                for u=1:4
                for v=1:4
                    if M(u)==S(v) then
                        if u==v then
                            A=[A,11], break
                        else
                            A=[A,10], break
                        end
                    end
                end
            end
        end
    end
    A
    end
    Il me paraît mieux mais il ne bloque pas le programme lorsque M=S.
    Non car il faudrait sortir de la boucle k si c'est gagné et c'est là que tu peux utiliser un while. J'ai un peu regardé la syntaxe du while sous scilab, ainsi que les booléens ... ainsi que la doc de base de scilab (regarde p23).

    Tu peux définir une variable booléenne, nommons la victoire. Avant de commencer, le joueur n'a pas gagné. Pour dire que la variable contient faux il te suffira d'écrire victoire=%F (%F est false et %T est true). Le joueur va commencer en jouant le premier tour, tu pourras stocker le quantième tour joué dans une variable tour, tout au début la variable va contenir 1 car on commence avec le premier tour. Tu joues tant que c'est pas gagné (donc tant que victoire vaut %F) et tant que on n'essaye pas de jouer un treizième tour (donc tant que tour<13). Avant de commencer tu choisis la combinaison à trouver, tu initisalises les autres variables dont tu auras besoin à une valeur signifiant rien (généralement vide ou 0 ou 1 ou ... selon les cas) Cela donne donc :

    Code:
    tour=1
    victoire = %F
    S=round(7*rand(1,4)+1)
    M=[]
    A=[]
    while (victoire == %F) & (tour<13)
        victoire = (M==S)
        if (victoire == %F)
            // Ici tu mets le code pour demander une combinaison, la vérifier, etc ...
            // en n'oubliant pas d'incrémenter tour
        end
    end
    // Quand on sort de la boucle on a soit victoire qui vaut %T car l'utilisateur a trouvé la bonne combinaison
    // soit %F il ne l'a pas trouvé en moins de 13 essais
    if (victoire == %T)
      // afficher des louanges
    else
      // afficher une damnation éternelle
    end
    if (victoire==%T)

  18. #17
    invite0bb5307a

    Re : Programmation mastermind

    Code:
    tour=1
    victoire = %F
    S=round(7*rand(1,4)+1)
    M=[]
    A=[]
    while (victoire == %F) & (tour<13)
        victoire = (M==S)
        if (victoire == %F)
            M=input('entrer une proposition')
            if size(M)~=[1,4] then
                disp('mauvais format')
            else
    // Comparer chaque élément de M aux éléments de S. Ce qui me pose problème : arrêter la boucle lorsque 1 élément de S correspond à un de S pour qu'il y ait un seul numéro dans la matrice A
                end
            end
    
    end
    tour=tour + 1
    end
    if (victoire == %T)
      disp('Gagné')
    else
      disp('Perdu')
    end

  19. #18
    invite4492c379

    Re : Programmation mastermind

    continue ...

  20. #19
    invite0bb5307a

    Re : Programmation mastermind

    Code:
    tour=1
    victoire = %F
    S=round(7*rand(1,4)+1)
    M=[]
    A=[]
    while (victoire == %F) & (tour<13)
        victoire = (M==S)
        if (victoire == %F)
            M=input('entrer une proposition')
            if size(M)~=[1,4] then
                disp('mauvais format')
            else
                i=1
                j=1
                while (i<5)
                    while (j<5)
                        if M(i)==S(j) then
                            if i==j then
                                A=[A,11]
                                else A=[A,10]
                            end
                    end
                    j=j+1
                end
                i=i+1
                end
            end
    
    end
    tour=tour + 1
    end
    if (victoire == %T)
      disp('Gagné')
    else
      disp('Perdu')
    end

  21. #20
    invite4492c379

    Re : Programmation mastermind

    Tu l'as testé ?

  22. #21
    invite0bb5307a

    Re : Programmation mastermind

    Oui, et ça ne fonctionne pas..

  23. #22
    invite4492c379

    Re : Programmation mastermind

    Peux-tu préciser ?

  24. #23
    invite0bb5307a

    Re : Programmation mastermind

    On compare le premier élément de M avec tous ceux de S mais pas les suivants. J'ai :

    i =

    1.
    j =

    1.
    j =

    2.
    j =

    3.
    j =

    4.
    j =

    5.
    i =

    2.
    i =

    3.
    i =

    4.
    i =

    5.

  25. #24
    invite4492c379

    Re : Programmation mastermind

    quand tu as un comportement de ce type, c'est que tu passes pas dans la boucle j, si tu ne passes pas dedans c'est que j>=5, donc que tu as initialisé j au mauvais endroit ... tu vios quoi modifier ?

  26. #25
    invite0bb5307a

    Re : Programmation mastermind

    Mettre j=1 après while i<5

  27. #26
    invite4492c379

    Re : Programmation mastermind

    OK ... tu vois l'erreur et comment la corriger ...
    Ensuite ... ça fonctionne mieux ?

  28. #27
    invite0bb5307a

    Re : Programmation mastermind

    Ce qui ne va pas non plus c'est si on trouve directement la solution, on passe par toutes les boucles parce que victoire est initialisé en %F.

    Le message gagné peu se mettre dès le début et pour perdu après les 12 essais.

  29. #28
    invite4492c379

    Re : Programmation mastermind

    Donc tu es entrain de me dire qu'il faudrait tester la victoire après la saisie de l'utilisateur et gérer un cas de victoire à cet endroit ?

  30. #29
    invite0bb5307a

    Re : Programmation mastermind

    Oui, ça fera moins de calculs pour l'ordinateur.

  31. #30
    invite4492c379

    Re : Programmation mastermind

    Alors modifie le code en conséquence ... tu as une idée ?

Page 1 sur 3 12 DernièreDernière

Discussions similaires

  1. réalisation de mastermind
    Par invite7f58f807 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 08/12/2010, 09h27
  2. Mastermind
    Par invite7553e94d dans le forum Science ludique : la science en s'amusant
    Réponses: 1
    Dernier message: 22/04/2009, 20h00
  3. Programmation
    Par invite1dee7ead dans le forum Logiciel - Software - Open Source
    Réponses: 24
    Dernier message: 03/01/2009, 11h48
  4. Programmation C
    Par invite34aea5f7 dans le forum Électronique
    Réponses: 21
    Dernier message: 22/03/2008, 01h19
  5. programmation
    Par invite70772835 dans le forum Électronique
    Réponses: 0
    Dernier message: 01/05/2007, 20h03