Programmation Mastermind (suite)
Répondre à la discussion
Affichage des résultats 1 à 26 sur 26

Programmation Mastermind (suite)



  1. #1
    invite0bb5307a

    Programmation Mastermind (suite)


    ------

    Bonjour,

    Nous essayons de programmer le jeu de mastermind. Après avoir fait le programme gràce auquel l'utilisateur peut trouver la solution que l'ordinateur a pris au hasard, nous voulons faire celui où l'utilisateur choisi la réponse.

    Voici ce que nous avons fait, mais ceci ne fonctionnne pas :

    Code:
    //Choix de l'utilisateur de la matrice ligne solution de 4 chiffres de 1 à 8
    S=input('Solution :')
    
    //Fabrication de la matrice comprenant toutes les matrices de ce format
    L=[];
    for a=1:8
      for b=1:8
        for c=1:8
          for d=1:8
            L=[L;a,b,c,d];
          end
        end
      end
    end
    
    //Début du jeu pour l'ordinateur
    tour = 1;
    while (tour<13)
      
      //Nombre de ligne de L
      t=size(L,:);
      
      //Choix au hasard d'une matrice parmi L
      M=L((t-1)*rand()+1,:)
      
      //Indication de l'utilisateur
      A=input('Aide : ')
      
      
      Titi=[];
      //Test de chaque ligne de L
      for l=1:t
        N=L(l,:);
        B=[];
        P=[];
        for k=1:4
          if M(k)==N(k) then
            B=[B,11];
            N(k)=0;
          else
            P=[P,k];
          end
        end
        for j=P;
          i=1;
          while (i<5)
            if (i~=j) & (N(i)==M(j)) then
              B=[B,10];
              N(i)=0;
              i=5;
            end
            i=i+1;
          end
        end
        
        //Tri des lignes de L
        if (length(A)~=length(B)) then
          Titi=[Titi,l];
        elseif (A~=B) & (length(A)==length(B)) then
          Titi=[Titi,l];
        end
      end
      
      //Suppression des lignes qui ne donnent pas A=B au test
      L(Titi,:)=[];
      tour=tour+1;
    end
    Merci de nous aider.

    -----

  2. #2
    Jack
    Modérateur

    Re : Programmation Mastermind (suite)

    Voici ce que nous avons fait, mais ceci ne fonctionnne pas :
    Nous voilà bien avancés ...

    Il faut aussi deviner ce qui ne fonctionne pas?

    A+

  3. #3
    invite4492c379

    Re : Programmation Mastermind (suite)

    Hello,

    «ne fonctionne pas» est très vague ... quel algorithme as-tu essayé d'implémenter ?

    J'ai l'impression que ça doit être quelquechose comme :

    Code:
    L= toutes les combinaisons possibles
    trouve=FAUX
    tour=1
    tant que  non trouve et tour < 13 faire
    
      proposition = choix au hasard d'une combinaison de L
      reponse = proposer(proposition)
      si (reponse=gagné) alors
        trouve = VRAI
      sinon
        pour toutes les combinaisons C de L
          si  «proposition a pour réponse reponse dans le cas où C est la solution» alors
            on garde C dans L
          sinon
            on efface C de L
          fin si
        fin pour
      fin si
      tour = tour + 1
    fin tant que
    si trouve alors
      afficher "J'ai gagné"
    sinon
      afficher "je donne ma langue au chat"
    fin si

  4. #4
    invite4492c379

    Re : Programmation Mastermind (suite)

    Citation Envoyé par Jack Voir le message
    Nous voilà bien avancés ...

    Il faut aussi deviner ce qui ne fonctionne pas?

    A+
    Hello Jack,

    effectivement, le forum est bien plus pratique qu'un debugger ...
    plus intelligent, limite oracle/devin ... juste un peu plus lent parfois mais tellement moins fatiguant

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

    Re : Programmation Mastermind (suite)

    Oui c'est ça. Mais quand on le teste, le programme sélectionne mal les combinaisons.

  7. #6
    invite4492c379

    Re : Programmation Mastermind (suite)

    Citation Envoyé par alice1812 Voir le message
    Oui c'est ça. Mais quand on le teste, le programme sélectionne mal les combinaisons.
    Tout serait plus simple si tu créais une fonction pour ça au lieu de te perdre dans une programmation linéaire ... plus simple mais aussi plus lisible et plus facilement debuggable.

  8. #7
    invite0bb5307a

    Re : Programmation Mastermind (suite)

    Faire une fonction pour tester M avec tous les N c'est ça?

  9. #8
    invite4492c379

    Re : Programmation Mastermind (suite)

    Idéalement tout ce qui n'est pas une instruction de base dans mon algo doit conduire à l'écriture d'une fonction.

  10. #9
    invite0bb5307a

    Programme informatique : Mastermind

    Nous essayons de programmer le jeu de mastermind. Après avoir fait le programme gràce auquel l'utilisateur peut trouver la solution que l'ordinateur a pris au hasard, nous voulons faire celui où l'utilisateur choisi la réponse.

    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


    Code:
    S=input('Solution :')
    L=[];
    for a=1:8
      for b=1:8
        for c=1:8
          for d=1:8
            L=[L;a,b,c,d];
          end
        end
      end
    end
    
    tour = 1;
    victoire=%F;
    
    while ( (tour<13) & (~victoire) )
    t=size(L,:);
    M=L((t-1)*rand()+1,:)
    A=input('Aide : ')
    victoire = (length(A)==4 & A==[11 11 11 11]);
    Titi=[];
    
      if (~victoire) then
        for l=1:t
          N=L(l,:);
          B=test(M,N);
          if (length(A)~=length(B)) then
            Titi=[Titi,l];
          elseif (A~=B) & (length(A)==length(B)) then
            Titi=[Titi,l];
          end
        end
        L(Titi,:)=[];
        tour=tour+1;
      end
    end
    
    if (victoire) then
        disp('Bingo')
    else
        disp('Looser')
        Solution=disp(S)
    end

    avec la fonction test :


    Code:
    function [B]= test(M,N)
      B=[];
      P=[];
      for k=1:4
        if M(k)==N(k) then
          B=[B,11];
          N(k)=0;
        else
          P=[P,k];
        end
      end
      for j=P;
        i=1;
        while (i<5)
          if (i~=j) & (N(i)==M(j)) then
            B=[B,10];
            N(i)=0;
            i=5;
          end
          i=i+1;
        end
      end
    endfunction

    On rencontre encore un problème. Le programme affiche "Looser" dès que l'on a length(A) = 4 alors que tour<13.

    Merci.

  11. #10
    Dlzlogic

    Re : Programme informatique : Mastermind

    Bonjour
    Que veut dire cette instruction ?
    if (i~=j) & (N(i)==M(j)) then
    Qu'est-ce qui vous fait sortir de la boucle while ? Je ne vois pas comment i pourrait être plus petit que 5, sauf dès le début.
    Etes-vous sûr que ET comme opérateur conditionnel s'écrit '&' et non pas '&&'

  12. #11
    Jack
    Modérateur

    Re : Programme informatique : Mastermind

    Les doublon sont interdits par la charte. Les discussions ont été fusionnées.
    Dernière modification par Jack ; 23/01/2012 à 19h04.

  13. #12
    invite4492c379

    Re : Programme informatique : Mastermind

    Citation Envoyé par Dlzlogic Voir le message
    Bonjour
    Que veut dire cette instruction ?
    if (i~=j) & (N(i)==M(j)) then
    Qu'est-ce qui vous fait sortir de la boucle while ? Je ne vois pas comment i pourrait être plus petit que 5, sauf dès le début.
    Etes-vous sûr que ET comme opérateur conditionnel s'écrit '&' et non pas '&&'
    Je pense que dlzlogic te met sur la voie :
    si tu sors du while c'est que la conditionnelle s'évalue à false, pour déterminer pourquoi elle s'évalue à false le plus simple est de débugger ; je ne connais pas les fonctionalités de matlab (comment faire du pas à pas, afficher la valeur des variables, etc). Par contre ce qui est toujours faisable est de rajouter des impressions. Affiche les valeurs de tes variables au fur et à mesure pour voir où un truc ne va pas (peut-être une histoire au niveau de l'évaluation
    victoire = (length(A)==4 & A==[11 11 11 11]);

    Je pense que cela ne s'évalue pas en un booléen mais en une matrice de booléens (je ne suis pas sûr) ...

    à tester.

  14. #13
    piwi

    Re : Programmation Mastermind (suite)

    J'arrive un peu en retard, mais ma question reste pertinente. Il n'est écrit nul part le langage utilisé; au lecteur de deviner? La moindre des choses est peut être de le mettre dans le titre.
    Ensuite, on revient toujours un peu aux mêmes choses, le code est illisible pour qui n'est pas dans votre tête (donc à peu près tout le monde), le mieux dans ce contexte serait de commenter les boucles et les conditions histoire que l'on sache au moins ce que vous en attendez. Vous pouvez aussi rendre l'algo plus apparent via les commentaires, une nouvelle fois.
    Commenter un code n'est jamais perdu! Peut être que dans 6 mois un an vous y repenserez et vous voudrez le modifier pour faire autre chose ou l'améliorer. Seulement, vous aussi n'arriverez plus à vous relire. Donc commenter un code, c'est pour soit et pour les autres.
    Enfin, organiser son code en fonctions facilite quand même grandement la compréhension, les tests, et les modifications ultérieures, en plus d'aider à mieux mettre en évidence l'algo (encore une fois, pour vous et pour les autres).

    piwi
    Je sers la science et c'est ma joie.... Il parait.

  15. #14
    invite0bb5307a

    Re : Programmation Mastermind (suite)

    Je travaille sur matlab

    Voici l'explication de test :

    Code:
    tour = 1;
    //Sélection "aléatoire" d'une matrice solution:
    S=round(7*rand(1,4)+1);
    victoire=%F;
    
    while ( (tour<13) & (~victoire) )
        disp('tour :'+string(tour))
        //Initialisation de la matrice M pour commencer while:
        M=[];
        
        //Propotition et vérification du format de M:
        while (~ isequal(size(M),[1,4]))
            M=input('Combinaison : ");
            if (~ isequal(size(M),[1,4])) then
                disp('Mauvais format')
          end
          end
      
        victoire = isequal(M,S);
        //Initialisation de la matrice Aide où 11=bonne couleur bien placée et 10=bonne couleur mal placée:
        A=[];
        //Fabrication de A:
        if (~victoire) then
    
    //Intialisation de P pour sélectionner des rangs:
    P=[];
    //Recherche des "bonnes couleurs biens placées":
    for k=1:4
        if M(k)==S(k) then
            A=[A,11];
            //Pour ne pas mettre 11 et 10 pour un même élément de M:
            //Exemple: S=1 4 1 2 et  M=1 5 6 7 donne A=[11] et non A=[11 10]
            M(k)=0;
      else
            //Pour ne pas comparer l'élément de S qui est bien placé dans M plus tard:
            //Exemple: S=1 2 3 4 et  M=1 5 6 1 donne A=[11] et non A=[11 10]
            P=[P,k];
        end
    end
    
            //Recherche des "bonnes couleurs mals placées":
            for j=P;
            i=1;
            while (i<5)
                if (i~=j) & (M(i)==S(j)) then
                    A=[A,10];
                    //Pour que un élément mal placé soit comparé une seule fois:
                    M(i)=0;
                    //Pour qu'il y ait un seul 10 pour les mals placés:
                    //Exemple: S=1 2 3 4 et  M=5 1 6 1 donne A=[10] et non A=[10 10]
                    i=5;
                end
                i=i+1;
            end
    end
    
        //Affichache de la matrice Aide
        disp(A)
        tour=tour+1;
        end
    end
    
    //Résultat après les 12 essais
    if (victoire) then
        disp('Bingo')
    else
        disp('Looser')
        Solution=disp(S)
    end
    Merci de me répondre.

  16. #15
    invite0bb5307a

    Re : Programmation Mastermind (suite)

    Bonjour,
    je travaille sur scilab *
    Et en effet victoire se traduit en matrice de booléen. Dès qu'elle contient un T, on sort de la boucle while.

    Comment régler ce problème ?

    Merci

  17. #16
    invite0bb5307a

    Re : Programmation Mastermind (suite)

    Voici l'explication du programme:

    Code:
    //l'utilisateur choisi la solution
    S=input('Solution :')
    
    //fabrication de L, matrice avec toutes les possibilités
    L=[];
    for a=1:8
      for b=1:8
        for c=1:8
          for d=1:8
            L=[L;a,b,c,d];
          end
        end
      end
    end
    
    //Initialisation de tour et de victoire
    tour = 1;
    victoire=%F;
    
    //Recherche par l'ordinateur
    while ( (tour<13) & (~victoire) )
    t=size(L,:);
    //Choix d'une ligne de L
    M=L((t-1)*rand()+1,:)
    //L'utilisateur donne la matrice aide où 11 = 1 chiffre bien placé et 10 = 1 chiffre mal placé
    A=input('Aide : ')
    //Test de A
    victoire = (length(A)==4 & A==[11 11 11 11])
    Titi=[];
    
    //Test de toutes les lignes si pas la bonne solution
      if (~victoire) then
        for l=1:t
          N=L(l,:);
          B=test(M,N);
          //Tri des lignes de L
          if (length(A)~=length(B)) then
            Titi=[Titi,l];
          elseif (A~=B) & (length(A)==length(B)) then
            Titi=[Titi,l];
          end
        end
        //Suppression des lignes ne répondant pas aux critères de solution
        L(Titi,:)=[];
        tour=tour+1;
      end
    end
    
    //Conclusion si trouvé avant tour=13 ou pas trouvé après
    if (victoire) then
        disp('Bingo')
    else
        disp('Looser')
        Solution=disp(S)
    end
    avec test :

    Code:
    function [B]= test(M,N)
      //Initialisation de la matrice B où 11=bonne couleur bien placée et 10=bonne couleur mal placée:
      B=[];
      //Intialisation de P pour sélectionner des rangs:
      P=[];
      //Recherche des "bonnes couleurs biens placées":
      
      for k=1:4
        if M(k)==N(k) then
          B=[B,11];
          //Pour ne pas mettre 11 et 10 pour un même élément de M:
          //Exemple: S=1 4 1 2 et  M=1 5 6 7 donne A=[11] et non A=[11 10]
          N(k)=0;
        else
          //Pour ne pas comparer l'élément de S qui est bien placé dans M plus tard:
          //Exemple: S=1 2 3 4 et  M=1 5 6 1 donne A=[11] et non A=[11 10]
          P=[P,k];
        end
      end
    
      //Recherche des "bonnes couleurs mals placées":
      for j=P;
        i=1;
        while (i<5)
          if (i~=j) & (N(i)==M(j)) then
            B=[B,10];
            //Pour que un élément mal placé soit comparé une seule fois:
            N(i)=0;
            //Pour qu'il y ait un seul 10 pour les mals placés:
            //Exemple: S=1 2 3 4 et  M=5 1 6 1 donne A=[10] et non A=[10 10]
            i=5;
          end
          i=i+1;
        end
      end
    endfunction

  18. #17
    Dlzlogic

    Re : Programmation Mastermind (suite)

    Bonjour,
    Il y a plusieurs façons de sortir d'une boucle.
    1-
    bool Test=FALSE;
    while(Test != TRUE)
    {
    ...
    ...
    }

    2-
    while(TRUE) // c'est à dire toujours
    {
    ...
    if (Victoire == TRUE) break;
    }

  19. #18
    invite0bb5307a

    Re : Programmation Mastermind (suite)

    Bonsoir, nous n'avons pas le droit d'utiliser les break

  20. #19
    Dlzlogic

    Re : Programmation Mastermind (suite)

    Donc, utilisez la première méthode.
    Pour sortir d'un switch, il n'u a pas d'autre solution que le break.

  21. #20
    invite0bb5307a

    Re : Programmation Mastermind (suite)

    Je ne comprends pas pourquoi ma proposition de programme ne fonctionne pas.

    Il y a un problème dans la définition de victoire je pense, non?

  22. #21
    Dlzlogic

    Re : Programmation Mastermind (suite)

    Je ne connais pas la syntaxe exacte de votre logiciel, mais il y des choses qui m'étonnent.
    1- êtes vous sûr-sûr qu'un test logique se fait avec l'opérateur '&' et non '&&' ?
    L'opérateur '&& est utilisés pour les tests binaires, par exemple
    si
    A = 10;
    B = 2;
    alors C = A & B donnera 2.
    maintenant A = 11;
    alors C = A & B donnera 2 aussi.
    Dans le même ordre d'idée '~', est un opérateur sur des bits. Le 'NON' s'écrit généralement '!'.

    2- vous comparez 2 fois la longueur de A et de B. Comparer des longueurs, c'est une opération très particulière qui ne s'utilise que que des chaines (dans les langages que je connais). Apparemment A est un tableau (que vous appelez "matrice").

    Evidemment je vous parle de syntaxe de langage, je doute que votre langage ait choisi une syntaxe à ce point différente de ce qu'on utilise habituellement, mais je peux me tromper.

  23. #22
    invite0bb5307a

    Re : Programmation Mastermind (suite)

    Voici ce que je possède :

    (je rappelle que je travaille sur scilab)

    Merci.

  24. #23
    invite0bb5307a

    Re : Programmation Mastermind (suite)

    Le fichier ne veut pas se joindre, voici le lien :

    http://agro-veto-montaigne.goldzonew...o/2logique.pdf

  25. #24
    Dlzlogic

    Re : Programmation Mastermind (suite)

    Bonjour,
    J'ai regardé un peu la syntaxe de Scilab, et les remarques que j'ai faites à ce sujet sont fausses.
    Effectivement, l'opérateur booléen "ET" s'écrit bien '&', de même que l'opérateur "NON" s'écrit '~'.
    Ca va être difficile pour vous de passer au C/C++, ou au PHP.
    Je pense que le seul moyen de trouver la faute est de retirer des ';' c'est à dire rajouter des impressions intermédiaires.

    Petit détail de langage (français). L'élément de base de Scilab est le tableau à 2 dimensions, cet objet est appelé "matrice". Une matrice est une représentation d'une application linéaire, sous forme d'un tableau à 2 dimensions. Dans un contexte mathématique, il me parait bon de distinguer la forme typographique (tableau) très utilisée en informatique et l'outil mathématique (matrice). Mais ce n'est que mon avis.

  26. #25
    invite0bb5307a

    Re : Programmation Mastermind (suite)

    J'ai résolu mon problème en utilisant find. Mais savez vous si elle est au programme des prépas, je n'arrive pas à le trouver..
    Merci.

  27. #26
    Dlzlogic

    Re : Programmation Mastermind (suite)

    Citation Envoyé par alice1812 Voir le message
    J'ai résolu mon problème en utilisant find. Mais savez vous si elle est au programme des prépas, je n'arrive pas à le trouver..
    Merci.
    C'est une question étonnante.
    Un logiciel est un ensemble, particulièrement s'il s'agit l'un logiciel tel que Scilab, dont le but est de résoudre des opération mathématiques limitées en volume. Il a tous les aspects d'un langage, mais pour moi, et en comparaison avec d'autre langages, il n'est vraiment pas adapté pour faire un programme qui dépasse le niveau d'un calcul relativement limité.
    J'ai été très surpris de son volume (plus de 100 Mo avant installation).
    Donc, j'ai un peu de mal à comprendre que certaines fonctions soient au programme, d'autres pas.

Discussions similaires

  1. Programmation mastermind (autre version)
    Par invite0bb5307a dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 22/11/2011, 07h01
  2. Programmation mastermind
    Par invite0bb5307a dans le forum Programmation et langages, Algorithmique
    Réponses: 75
    Dernier message: 28/10/2011, 13h06
  3. réalisation de mastermind
    Par invite7f58f807 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 08/12/2010, 09h27
  4. Mastermind
    Par invite7553e94d dans le forum Science ludique : la science en s'amusant
    Réponses: 1
    Dernier message: 22/04/2009, 20h00
  5. Comment démontrer qu'une suite est une suite géométrique de raison b?
    Par inviteedcd9766 dans le forum Mathématiques du collège et du lycée
    Réponses: 9
    Dernier message: 22/09/2007, 19h45