Partage
  • Partager sur Facebook
  • Partager sur Twitter

Algorithme pour mastermind

    15 juin 2021 à 16:12:52

    bonjour à toutes et tous !

    nous avons développé un mastermind dans le cadre de nos études qui est fonctionnel. Nous aimerions ajouter une fonctionnalité : jouer contre l'ordinateur. Nous sommes confrontés à deux problèmes.

    Le premier est que notre mastermind est configurable. Il peut se jouer avec un nombre variable de pion (de 3 à 6) et de couleurs (de 3 à 8 également). Nous avons bien trouvé quelques algorithmes comme celui de Knuth que nous avons réussi à adapter pour 3 et 4 pions avec 6 couleurs. Nous avons trouvé un article qui décrit un algo que nous n'arrivons pas à écrire pour 4 pions et 7 couleurs.
    Il nous manque un algo général et configurable en nombre de pions et couleurs. Nous nous posions la question de savoir si vous pourriez nous aider.

    Le second est que les algos que nous avons codés sont imbattables. Comment peut-on créer un joueur artificiel avec un niveau ?

    En espérant avoir été claire, je vous remercie par avance de l'aide que vous pourrez nous apporter.

    PS: je publie notre demande dans le forum C car notre projet est en C et que je n'ai pas trouvé de forum algo.

    • Partager sur Facebook
    • Partager sur Twitter
      15 juin 2021 à 17:00:47

      Bonjour,

      de combien de temps disposez-vous pour ça ?

      • Partager sur Facebook
      • Partager sur Twitter
        15 juin 2021 à 18:42:08

        Bonjour,

        Quel est le problème pour adapter le nombre de pions et de cases possibles? (peut-etre un problème de boucles imbriquées? Une solution simple peut alors être de passer en récursif à la place pour générer l'ensemble des solutions restant à explorer).

        Coté algos une solution simle est aussi d'adapter une heuristique humaine. Une approche simpliste, qui passe bien chez les jeunes, peut être d'attaquer tous les couples 2-2 pour ensuite faire le tri dans les solutions restantes. Pour l'algo de Knuth que je viens de trouver (et que je ne connaissais pas), au lieu de proposer la combinaison qui éliminerait le plus de cas, on peut choisir une solution moyenne ou médiane histoire de rendre l'algo moins performant peut-être. Probablement le moyen le plus simple d'émuler un niveau.

        • Partager sur Facebook
        • Partager sur Twitter
        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
          16 juin 2021 à 11:32:19

          White Crow a écrit:

          Bonjour,

          de combien de temps disposez-vous pour ça ?


          une semaine. Notre projet est terminé et nous aimerions ajouter ce petit plus.

          lmghs a écrit:

          Bonjour,

          Quel est le problème pour adapter le nombre de pions et de cases possibles? (peut-etre un problème de boucles imbriquées? Une solution simple peut alors être de passer en récursif à la place pour générer l'ensemble des solutions restant à explorer).

          Coté algos une solution simle est aussi d'adapter une heuristique humaine. Une approche simpliste, qui passe bien chez les jeunes, peut être d'attaquer tous les couples 2-2 pour ensuite faire le tri dans les solutions restantes. Pour l'algo de Knuth que je viens de trouver (et que je ne connaissais pas), au lieu de proposer la combinaison qui éliminerait le plus de cas, on peut choisir une solution moyenne ou médiane histoire de rendre l'algo moins performant peut-être. Probablement le moyen le plus simple d'émuler un niveau.


          Avec 6 couleurs et 4 pions nous avons 6^4 = 1296 possibilités ce qui est largement gérable. Avec 8^6 nous en avons 262144 ce qui nous semblait beaucoup sans avoir testé.
          • Partager sur Facebook
          • Partager sur Twitter
            15 novembre 2021 à 4:42:16

            Je suis surpris que ça se retrouve dans la catégorie C et non C++. Je n'ai pas lu attentivement le message du PO et je rencontre lmghs sur C++ ...

            @lmghs:
            Je suis peut-être un peu en retard sur ce coup.
            On peut trouver de façon non récursive la liste des combinaisons possibles.
            Le petit code suivant le montre:
            -
            #include <iostream>
            #include <vector>
            int main(void) {
                int pions;
                int couleurs;
                std::cout << "Entrez le nombre de couleurs et de pions";
                std::cin >> couleurs >> pions;
                std::vector<std::vector<int>> matrix;
                // couleurs^pions
                int puissance = couleurs;
                for(int i = 1; i < pions; i++) puissance *= couleurs;
                matrix.resize(puissance, std::vector<int>(pions));
                // calculer le premier tuple.
                for(int i = 0; i < pions; i++) {
                    matrix[0][i] = 1;
                }
                // calculer les autres tuples.
                for(int i = 1; i < puissance; i++) {
                    int carry = 1;
                    for(int j = pions-1; j >= 0; j--) {
                        matrix[i][j] = matrix[i-1][j] + carry;
                        carry = 0;
                        if(matrix[i][j] > couleurs) {
                            matrix[i][j] -= couleurs;
                            carry = 1;
                        }
                    }
                }
                for(int i = 0; i < puissance; i++) {
                    for(int j = 0; j < pions; j++) {
                        std::cout << matrix[i][j];
                    }
                    std::cout << std::endl;
                }
                return 0;
            }

            -
            Edité par PierrotLeFou 15 novembre 2021 à 4:58:57

            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

            Algorithme pour mastermind

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown