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