/**************************/
/*Mastermind © t.heyn 2000*/
/**************************/
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class MasterMind extends Applet
{
final String NAME[] = {"MasterMind.gif","MMrot.gif","MMblau.gif","MMgelb.gif","MMgruen.gif",
"MMbraun.gif","MMorange.gif","MMweiss.gif","MMschwarz.gif"}; //die namen
final int ROT=1,BLAU=2,GELB=3,GRUEN=4,ORANGE=5,BRAUN=6,WEISS=7,SCHWARZ=8; //die farben
final int OK=1,KILL=2,NEU=3; //die buttons
final int[] KOORD={180,200,180,200,88,88,107,107}; //die koordinaten der schwarzen und weissen knöpfe
int versuch,gesteckt;
int farbe;
int knopf;
boolean geschafft;
double[][] farbFeld = new double[10][4];
int[][] testFeld = new int[10][4];
int[] codeMatrix = new int[4];
Image[] bild = new Image[9];
AudioClip yahoo, oops;
Graphics temp;
private class MyMouse extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
int x=e.getX();
int y=e.getY();
farbe=0;
knopf=0;
if ((269-x)*(269-x) + (63-y)*(63-y) <= 15*15) farbe=ROT; //Kreisformel: x*x + y*y = r*r
if ((308-x)*(308-x) + (63-y)*(63-y) <= 15*15) farbe=BLAU;
if ((308-x)*(308-x) + (98-y)*(98-y) <= 15*15) farbe=GELB;
if ((269-x)*(269-x) + (98-y)*(98-y) <= 15*15) farbe=GRUEN;
if ((348-x)*(348-x) + (98-y)*(98-y) <= 15*15) farbe=BRAUN;
if ((348-x)*(348-x) + (63-y)*(63-y) <= 15*15) farbe=ORANGE;
if ((402-x)*(402-x) + (63-y)*(63-y) <= 15*15) knopf=OK;
if ((402-x)*(402-x) + (98-y)*(98-y) <= 15*15) knopf=KILL;
if (x>300 && x<370 && y>472 && y<488) knopf=NEU;
if (knopf==NEU) neuesSpiel();
if (geschafft) return;
if (farbe!=0 && gesteckt<4) setzen(versuch,farbe);
if (knopf==OK && gesteckt==4) uebernehmen();
if (knopf==KILL) loeschen();
}
}
public void init()
{
temp=getGraphics();
yahoo= getAudioClip(getCodeBase(),"yahoo.au");
oops = getAudioClip(getCodeBase(),"oops.au" );
MediaTracker tracker=new MediaTracker(this);
for (int i=0;i<=8;i++)
{
bild[i]= getImage(getCodeBase(),NAME[i]);
tracker.addImage(bild[i],1);
}
try
{
tracker.waitForAll();
}
catch(InterruptedException e) {}
addMouseListener(new MyMouse());
neuesSpiel();
}
public void paint(Graphics g)
{
g.drawImage(bild[0],0,0,this);
for (int z=0;z<10;z++)
{
for (int s=0;s<4;s++)
{
//if (farbFeld[z][s]!=0)
farbeZeichnen(z,s);
}
testZeichnen(z);
}
codeZeichnen();
}
private void uebernehmen()
{
gesteckt=0;
eingabeAuswerten();
versuch++;
}
private void loeschen()
{
gesteckt=0;
for (int s=0;s<4;s++)
{
farbFeld[versuch][s]=0;
}
repaint(20,(40*versuch+90),153,33);
oops.play();
}
private void neuesSpiel()
{
versuch=0;
gesteckt=0;
geschafft=false;
for (int i=0;i<=3;i++)
{
codeMatrix[i]=(int)(Math.random()*6+1);
}
for (int z=0;z<10;z++)
{
for (int s=0;s<4;s++)
{
farbFeld[z][s]=0;
testFeld[z][s]=0;
}
}
repaint();
}
private void setzen(int versuch,int farbe)
{
farbFeld[versuch][gesteckt]=farbe;
farbeZeichnen(versuch,gesteckt);
gesteckt++;
}
private void eingabeAuswerten()
{
double[][] testMatrix = new double [4][4];
int n=0;
//Matrizen multiplizieren
for (int i=0;i<=3;i++)
{
for (int j=0;j<=3;j++)
{
testMatrix[i][j]=codeMatrix[i]/farbFeld[versuch][j];
}
}
//Richtige rausfinden
for (int i=0;i<=3;i++)
{
if (testMatrix[i][i]==1)
{
testFeld[versuch][n]=SCHWARZ;
n++;
for (int t=0;t<=3;t++)
{
testMatrix[i][t]=0;
testMatrix[t][i]=0;
}
}
}
for (int i=0;i<=3;i++)
{
for (int j=0;j<=3;j++)
{
if (testMatrix[i][j]==1)
{
testFeld[versuch][n]=WEISS;
n++;
for (int t=0;t<=3;t++)
{
testMatrix[i][t]=0;
testMatrix[t][j]=0;
}
}
}
}
//ausgabe schwarze/weisse
testZeichnen(versuch);
//schluss und auswertung
if (testFeld[versuch][0]+testFeld[versuch][1]+testFeld[versuch][2]+testFeld[versuch][3]==4*SCHWARZ)
{
geschafft=true;
codeZeichnen();
temp.drawString("Du hast es im "+(versuch+1)+". Versuch geschafft.",240,450);
yahoo.play();
}
if (versuch==9 && ! geschafft)
{
geschafft=true;
codeZeichnen();
temp.drawString("Du hast es im leider nicht geschafft.",240,450);
oops.play();
}
}
private void testZeichnen(int versuch) //schwarze und weisse setzten
{
for (int i=0;i<=3;i++)
{
if (testFeld[versuch][i] !=0)
temp.drawImage(bild[testFeld[versuch][i]],KOORD[i],(KOORD[i+4]+40*versuch),this);
}
}
private void farbeZeichnen(int z,int s) //einen farbstecker zeichnen
{
if (farbFeld[z][s] !=0)
temp.drawImage(bild[(int)(farbFeld[z][s])],(40*s+20),(40*z+90),this);
}
private void codeZeichnen() //die lösung zeichnen
{
for (int i=0;i<=3;i++)
{
if (geschafft) temp.drawImage (bild[codeMatrix[i]],(20+40*i),42,this);
}
}
}