Le MasterMind
Vous connaissez sûrement le jeu du Mastermind, ce jeu de logique et de déduction dans lequel il faut trouver une combinaison de 5 couleurs.
Les 5 couleurs à trouver sont prises dans un ensemble de 8 couleurs. La combinaison à trouver contient 5 couleurs différentes : aucune couleur n'est représentée plusieurs fois dans la combinaison à trouver.
Grâce à l'applet Java ci-dessous vous pouvez vous entraîner pour trouver la solution optimale du Mastermind. L'ordinateur a en mémoire une combinaison de 5 couleurs qu'il vous faut retrouver.
Pour composer une ligne, déplacez le curseur à l'aide des boutons gauche et droite (représentés "<" et ">" dans l'applet), puis cliquez sur les boutons de couleur pour positionner une couleur à l'endroit du curseur.
Une fois votre ligne terminée, cliquez sur le bouton "Valider la ligne" pour la proposer à l'ordinateur. L'ordinateur vous répond alors à droite de la ligne, avec des pions rouges et des pions blancs dont la signification est la suivante :
Enfin, vous pouvez afficher ou cacher à tout moment la solution à déterminer, grâce au bouton "Montrer la solution".
Avec cette applet vous pouvez valider n'importe quelle sorte de ligne (des lignes vides, des lignes à moitié pleines, des lignes contenant 5 fois la même couleur, des lignes contenant plusieurs pions de la même couleur, etc.) mais la vraie règle du jeu voudrait que vous ne validiez que des lignes contenant toujours 5 couleurs différentes.
Maintenant c'est à vous de jouer. Bonne chance !
Remarques :
Voici le code source en Java de l'applet ci-dessus du Mastermind que j'ai mis au point et compilé avec JBuilder 9 sous Linux :
import java.awt.*; import java.awt.event.*; import java.applet.*; /************************************************************/ // debut de la classe /************************************************************/ public class mastermind extends Applet implements ActionListener { /************************************************************/ // Declaration des variables /************************************************************/ // Les boutons : Button bouton_gauche = new Button(" < "); Button bouton_droite = new Button(" > "); Button bouton_valider = new Button("Valider la ligne"); Button bouton_montrer = new Button("Montrer la solution"); Button bouton_rouge = new Button(" "); Button bouton_vert = new Button(" "); Button bouton_bleu = new Button(" "); Button bouton_jaune = new Button(" "); Button bouton_magenta = new Button(" "); Button bouton_cyan = new Button(" "); Button bouton_noir = new Button(" "); Button bouton_blanc = new Button(" "); // Autres variables : int ligne_courante = 1; int colonne_courante = 1; String[][] tab = new String[6][21]; int[][] reponse = new int[6][21]; String[] solution = new String[6]; public boolean montrer_solution = false; /************************************************************/ // Fonction tester_proposition pour tester la ligne validée /************************************************************/ public void tester_proposition() { int i, n = 1; String s; for (i = 1; i <= 5; i++) { if (tab[i][ligne_courante] == solution[i]) { reponse[n][ligne_courante] = 2; // ajoute 1 pion rouge dans la réponse n = n + 1; } } s = tab[1][ligne_courante]; if ( (s == solution[2]) || (s == solution[3]) || (s == solution[4]) || (s == solution[5])) { reponse[n][ligne_courante] = 1; // ajoute 1 pion blanc dans la réponse n = n + 1; } s = tab[2][ligne_courante]; if ( (s == solution[1]) || (s == solution[3]) || (s == solution[4]) || (s == solution[5])) { reponse[n][ligne_courante] = 1; // ajoute 1 pion blanc dans la réponse n = n + 1; } s = tab[3][ligne_courante]; if ( (s == solution[1]) || (s == solution[2]) || (s == solution[4]) || (s == solution[5])) { reponse[n][ligne_courante] = 1; // ajoute 1 pion blanc dans la réponse n = n + 1; } s = tab[4][ligne_courante]; if ( (s == solution[1]) || (s == solution[2]) || (s == solution[3]) || (s == solution[5])) { reponse[n][ligne_courante] = 1; // ajoute 1 pion blanc dans la réponse n = n + 1; } s = tab[5][ligne_courante]; if ( (s == solution[1]) || (s == solution[2]) || (s == solution[3]) || (s == solution[4])) { reponse[n][ligne_courante] = 1; // ajoute 1 pion blanc dans la réponse n = n + 1; } ligne_courante = ligne_courante + 1; if (ligne_courante > 20) { ligne_courante = 20; } } /************************************************************/ // Fonction init_solution pour tirer au hasard la solution /************************************************************/ public void init_solution() { int i, j; int[] solu = new int[6]; for (i = 1; i <= 5; i++) { solu[i] = 0; } for (j = 1; j <= 5; j++) { do { i = (int) (Math.random() * 10); } while ( (i == 0) || (i == 9) || (i == solu[1]) || (i == solu[2]) || (i == solu[3]) || (i == solu[4]) || (i == solu[5])); solu[j] = i; if (solu[j] == 1) { solution[j] = "rouge"; } if (solu[j] == 2) { solution[j] = "vert"; } if (solu[j] == 3) { solution[j] = "bleu"; } if (solu[j] == 4) { solution[j] = "jaune"; } if (solu[j] == 5) { solution[j] = "magenta"; } if (solu[j] == 6) { solution[j] = "cyan"; } if (solu[j] == 7) { solution[j] = "noir"; } if (solu[j] == 8) { solution[j] = "blanc"; } } } /************************************************************/ // Fonction init() pour initialiser l'applet /************************************************************/ public void init() { int x, y; init_solution(); // Configure la couleur de fond des boutons : bouton_rouge.setBackground(Color.red); bouton_vert.setBackground(Color.green); bouton_bleu.setBackground(Color.blue); bouton_jaune.setBackground(Color.yellow); bouton_magenta.setBackground(Color.magenta); bouton_cyan.setBackground(Color.cyan); bouton_noir.setBackground(Color.black); bouton_blanc.setBackground(Color.white); // insère les boutons : add(bouton_gauche); add(bouton_droite); add(bouton_valider); add(bouton_montrer); add(bouton_rouge); add(bouton_vert); add(bouton_bleu); add(bouton_jaune); add(bouton_magenta); add(bouton_cyan); add(bouton_noir); add(bouton_blanc); // connecte chaque bouton au gestionnaire d'évènement (Fonction ActionPerformed) : bouton_gauche.addActionListener(this); bouton_droite.addActionListener(this); bouton_valider.addActionListener(this); bouton_montrer.addActionListener(this); bouton_rouge.addActionListener(this); bouton_vert.addActionListener(this); bouton_bleu.addActionListener(this); bouton_jaune.addActionListener(this); bouton_magenta.addActionListener(this); bouton_cyan.addActionListener(this); bouton_noir.addActionListener(this); bouton_blanc.addActionListener(this); for (x = 1; x <= 5; x++) { for (y = 1; y <= 20; y++) { tab[x][y] = ""; reponse[x][y] = 0; } } } // fin de la fonction init() /************************************************************/ // Fonction paint() /************************************************************/ public void paint(Graphics ecran) { int x, y, rayon, ecart; rayon = 15; ecart = 10; ecran.setColor(Color.black); for (x = 0; x < 5; x++) { for (y = 0; y < 20; y++) { ecran.drawOval(x * (rayon + ecart) + 70, y * (rayon + ecart) + 80, rayon, rayon); } } rayon = 10; ecart = 15; for (x = 0; x < 5; x++) { for (y = 0; y < 20; y++) { ecran.drawOval(x * (rayon + 10) + 240, y * (rayon + ecart) + 80, rayon, rayon); } } ecran.setColor(Color.red); ecran.fillArc(30, 548 - ligne_courante * 25, 60, 80, 200, -40); ecran.setColor(Color.red); ecran.fillArc(23 + colonne_courante * 25, 550, 60, 60, -70, -40); for (x = 1; x <= 5; x++) { for (y = 1; y <= 20; y++) { if (tab[x][y] != "") { if (tab[x][y] == "rouge") { ecran.setColor(Color.red); } else if (tab[x][y] == "vert") { ecran.setColor(Color.green); } else if (tab[x][y] == "bleu") { ecran.setColor(Color.blue); } else if (tab[x][y] == "jaune") { ecran.setColor(Color.yellow); } else if (tab[x][y] == "magenta") { ecran.setColor(Color.magenta); } else if (tab[x][y] == "cyan") { ecran.setColor(Color.cyan); } else if (tab[x][y] == "noir") { ecran.setColor(Color.black); } else if (tab[x][y] == "blanc") { ecran.setColor(Color.white); } ecran.fillOval( (x - 1) * 25 + 69, (20 - y) * 25 + 79, 17, 17); } } } for (x = 1; x <= 5; x++) { for (y = 1; y <= 20; y++) { if (reponse[x][y] != 0) { if (reponse[x][y] == 2) { ecran.setColor(Color.red); } else if (reponse[x][y] == 1) { ecran.setColor(Color.white); } ecran.fillOval( (x - 1) * 20 + 239, (20 - y) * 25 + 79, 12, 12); } } } if (montrer_solution) { for (x = 1; x <= 5; x++) { if (solution[x] == "rouge") { ecran.setColor(Color.red); } else if (solution[x] == "vert") { ecran.setColor(Color.green); } else if (solution[x] == "bleu") { ecran.setColor(Color.blue); } else if (solution[x] == "jaune") { ecran.setColor(Color.yellow); } else if (solution[x] == "magenta") { ecran.setColor(Color.magenta); } else if (solution[x] == "cyan") { ecran.setColor(Color.cyan); } else if (solution[x] == "noir") { ecran.setColor(Color.black); } else if (solution[x] == "blanc") { ecran.setColor(Color.white); } ecran.fillOval(x * 30 + 150, 610, 20, 20); ecran.setColor(Color.black); ecran.drawString("La solution est :", 205, 600); } } ecran.setColor(Color.red); ecran.drawString( "Cette applet JAVA a été réalisée par Jean-Christophe MICHEL", 20, 660); ecran.drawString("http://java.gecif.net", 130, 680); } // fin de la fonction paint() /************************************************************/ /* Fonction ActionPerformed (ActionEvent) */ /* Cette fonction ActionPerformed est le gestionnaire d'évènements */ /************************************************************/ public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == bouton_gauche) { // Teste si le bouton 1 a été enfoncé colonne_courante = colonne_courante - 1; if (colonne_courante == 0) { colonne_courante = 5; } } else if (source == bouton_droite) { // Teste si le bouton 1 a été enfoncé colonne_courante = colonne_courante + 1; if (colonne_courante == 6) { colonne_courante = 1; } } else if (source == bouton_valider) { // Teste si le bouton 1 a été enfoncé tester_proposition(); } else if (source == bouton_rouge) { tab[colonne_courante][ligne_courante] = "rouge"; colonne_courante = colonne_courante + 1; if (colonne_courante == 6) { colonne_courante = 1; } } else if (source == bouton_vert) { tab[colonne_courante][ligne_courante] = "vert"; colonne_courante = colonne_courante + 1; if (colonne_courante == 6) { colonne_courante = 1; } } else if (source == bouton_bleu) { tab[colonne_courante][ligne_courante] = "bleu"; colonne_courante = colonne_courante + 1; if (colonne_courante == 6) { colonne_courante = 1; } } else if (source == bouton_jaune) { tab[colonne_courante][ligne_courante] = "jaune"; colonne_courante = colonne_courante + 1; if (colonne_courante == 6) { colonne_courante = 1; } } else if (source == bouton_magenta) { tab[colonne_courante][ligne_courante] = "magenta"; colonne_courante = colonne_courante + 1; if (colonne_courante == 6) { colonne_courante = 1; } } else if (source == bouton_cyan) { tab[colonne_courante][ligne_courante] = "cyan"; colonne_courante = colonne_courante + 1; if (colonne_courante == 6) { colonne_courante = 1; } } else if (source == bouton_noir) { tab[colonne_courante][ligne_courante] = "noir"; colonne_courante = colonne_courante + 1; if (colonne_courante == 6) { colonne_courante = 1; } } else if (source == bouton_blanc) { this.tab[colonne_courante][ligne_courante] = "blanc"; colonne_courante = colonne_courante + 1; if (colonne_courante == 6) { colonne_courante = 1; } } else if (source == bouton_montrer) { montrer_solution = !montrer_solution; if (montrer_solution) { bouton_montrer.setLabel("Cacher la solution"); } else { bouton_montrer.setLabel("Montrer la solution"); } } repaint(); } // fin de la fonction ActionPerformed } // fin de la classe