/**************************/
/*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);
			}		
		}		
	}