MasterMind en spécialité i.s.n. Projet pour la spécialité ISN en terminale S, juin 2012 S. Zimmerman – A. Morouche – S. Gentilhomme
Pourquoi ce sujet ? Retenant l’idée de J.C. Routier, proposer aux élèves des projets axés sur la création d’un jeu ou d’une application autour de l’image ne sera pas vécu comme ne faire que des maths ou de la physique ! Même si on fait appelle à des notions mathématiques, elles ne seront pas vécues comme telles par les élèves, et le travail semblera ainsi plus ludique. Nous retenons l’idée des jeux à un ou deux joueurs, et nous viennent à l’esprit quelques jeux assez simples :
Le jeu du nombre mystère Exemple : L’ordinateur choisit un nombre compris entre 1 et 9999. à chaque tour : le joueur propose un nombre L’ordinateur donne une indication (supérieur ou inférieur). Obj : trouver le nombre mystère en un minimum de propositions. Le jeu est assez basique, il est possible de demander la programmation de la solution idéale afin que le joueur compare son résultat et cette dernière (sans toutefois lui indiquer la méthode).
Le jeu de Nim (qui existe sous différentes variantes) Exemple : Version de base au départ : un tas de 21 allumettes à tour de rôle : Chaque joueur retire une à trois allumettes du tas Objectif : ne pas être celui-qui retire la dernière allumette. Afin d’amener les élèves à créer une version un peu moins basique, il est possible de moduler le jeu avec 3 paramétres : le nombre d’allumettes initiales (par ex. de 20 à 50) le nombre d’allumettes que l’on peut retirer (3 à 6) choisir le niveau d’intelligence de l’ordinateur (choix aléatoire, avec une méthode infaillible à 100% ou avec un taux de 50%).
Le pendu Archiclassique, c’est la recherche d’un mot ou d’une expression, qui pourrait être une bonne occasion de manipuler des chaines de caractères. Les tours de Hanoï Un jeu sans doute intéressant et peu connu de nos élèves, qui consiste à faire passer une pile de disques classés par tailles croissantes, d’un piquet vers un autre avec un piquet intermédiaire, en conservant toujours un empilement ordonné.
on ne peut déplacer plus d'un disque à la fois, L’objectif est à atteindre en un minimum de coups, en respectant deux règles : on ne peut déplacer plus d'un disque à la fois, on ne peut placer un disque que sur un autre disque plus grand que lui ou sur un emplacement vide.
L’ordinateur donne deux indications : Le Mastermind Exemple : L’ordinateur choisit P pions de couleurs différentes parmi C couleurs possibles, avec un placement particulier (C > P mais inférieur à 10). à chaque tour : le joueur propose P pions disposés avec précision. L’ordinateur donne deux indications : - le nombre de jetons présents dans la combinaison - le nombre de jetons correctement placés Objectif du joueur : Trouver la combinaison gagnante.
Le jeu nous semble assez simple à programmer, et fera intervenir la manipulation de nombres, d’images, etc. nous retenons donc ce projet, d’abord à deux membres, avec un élargissement avec la venue d’Abdelkrim Morouche nous proposant sa collaboration, trouvant le projet intéressant, avec un rôle de membre ressource.
Première phase de développement
Objectifs: Définir les caractéristiques du jeu. Rechercher les algorithmes les plus pertinents afin d’évaluer le niveau de complexité. Développer un programme de test relativement simple afin de tester les solutions algorithmiques retenues.
Les variables qui caractérisent le jeu // La grille du jeu n'est rien d'autre qu'un tableau à 2 dimensions var NbrLignes = 10; // Correspond aussi au nombre maximum d'essais possibles pour // trouver la combinaison (10 par défaut). var NbrColonnes = 4; // Correspond aussi au nombre de pions dans la combinaison // (4 par défaut) var NbrMaxiCouleurs = 6; // On limitera le jeu à 6 couleurs au maximum var NbrCouleurs = 4; // Nombre de couleurs choisies par le joueur pour sa partie // (4 par défaut et sera <= NbrMaxiCouleurs) var Combinaison = new Array(); // Tableau pour ranger la combinaison secrète.
Les variables pour gérer la partie var Gagne = false; // Passe à « true » si le joueur trouve la bonne combinaison. var Proposition = new Array(); // Tableau pour mémoriser la proposition du joueur. var NbrEssais = 0; // Mémorise le nombre de propositions faites par l'utilisateur. var NbrCoulPlacees = 0; // Nombre de couleurs bien placées dans la proposition var NbrCoulBonnes = 0; // Nombre de couleurs bonnes mais mal placées
«Tirage aléatoire d’une combinaison secrète » Algorithme «Tirage aléatoire d’une combinaison secrète » for(var i=0 ; i < NbrColonnes ; i++) { Combinaison[i] = Math.round(Math.random()*(NbrCouleurs - 1) + 1) } Cet algorithme va générée la combinaison gagnante avec des pions qui peuvent être de même couleur.
Dans une première ébauche, nous avions imaginé une combinaison secrète avec des pions différents, ce qui avait amené à un algorithme de cette forme : POUR i ALLANT DE 0 A NbPions – 1 TestCouleurValide = 0 // VARIABLE BOOLEENNE TANT QUE TestCouleurValide = 0 FAIRE CombGagn [i] = PartieEntière (NbreAléatoire () * NbCouleurs) TestCouleurValide = 1 POUR j ALLANT DE 0 A i – 1 SI CombGagn [i] == CombGagn [j] TestCouleurValide =0 FIN SI FIN POUR FIN TANT QUE for(var i=0 ; i < NbrColonnes ; i++) { TestCoulValide = TRUE; while (TestCoulValide = TRUE) { Combinaison[i] = Math.round(Math.random()*(NbrCouleurs - 1) + 1); for (var j = 0 ; j < i-1 ; j ++) { TestCoulValide=(Combinaison[i]==Combinaison[j]); }
Algorithme «Tester la proposition du joueur par rapport à la combinaison secrète » // Une copie de la Proposition et de la combinaison secrète qu'on pourra modifier var CopieS = new Array() ; var CopieP = new Array() ; for (var i=0 ; i<NbrColonnes ; i++) { CopieP[i] = Proposition[i]; CopieS[i] = Combinaison[i]; } // Réinitialisation pour un nouveau test NbrCoulPlacees = 0; NbrCoulBonnes = 0;
// 1er test : On teste si des couleurs sont bonnes (c’est-à-dire bien placées). for ( i=0 ; i<NbrColonnes ; i++) { if (CopieP[i] == CopieS[i]) NbrCoulPlacees++; // Une couleur de plus de bien placée CopieS[i] = 'x'; // On écrase cette couleur, on ne la // recompte pas comme étant bonne // mais mal placée CopieP[i] = 'y'; // dans le second test }
// 2nd test: On teste si une couleur est bonne mais mal placée for ( i = 0; i < NbrColonnes; i++ ) { for (j =0; j < NbrColonnes; j++ ) if(CopieS[i] == CopieP[j]) NbrCoulBonnes++; // Une couleur bonne CopieS[i] = 'x'; // on écrase cette couleur CopieP[j] = 'y‘; // on ne la compte plus } // On conclut sur les tests if(NbrCoulPlacees == NbrColonnes) // Si toutes les couleurs sont bien placées, Gagne = true; // la partie est gagnée. NbrEssais++; // Le joueur a testé une fois de plus une proposition
Une première version en mode texte nous a permis de tester et de mettre au point l’algorithme qui est au cœur du jeu, à savoir la comparaison d’une proposition par rapport à la combinaison secrète ; la proposition rentrée au clavier sous la forme d’une chaine de caractères est convertie en tableau. Cette première version est disponible dans le dossier nommé « MASTERMIND_ver1 ».
Deuxième phase de développement
Objectifs : Développer une couche graphique et l’intégrer au programme Séparation des éléments selon leur nature dans des fichiers différents : Les variables dans un fichier JS Les fonctions dans un fichier JS Le programme principal dans un fichier JS Page HTML basique permettant de tester le programme
Conclusion Une expérience enrichissante sur le plan informatique avec réinvestissement de nombreuses connaissances acquises au cours des séquences « Algorithmique & Programmation » , avec un apport bénéfique pour toutes les ressources mises en œuvre par Abdelkrim Une association qui a amené à maturité un projet réaliste pour des élèves de lycée Un bénéfice personnel quand au travail par projet, encore quelque peu éloigné de nos modes d’enseignement plus classique en lycée, pour des disciplines générales (mathématiques, sciences physiques).