 // Hra Miny, Peter Mitrik 2I2
import java.awt.*;    // nacitaju sa triedy Javy

     
public class Min extends Frame{   // frame - win32 aplikacia
	MenuBar m_bar = new MenuBar();    // menu 
	Menu hra = new Menu("Hra",true);  // nazov menu
	Font pismo = new Font("TimesRoman", Font.BOLD, 10);   // pouzite pismo
	Button b[][] = new Button[30][30];   // pole tlacitok na hracej ploche
	Panel h_plocha = new Panel();  // hracia plocha
	Panel b_plocha = new Panel();  // plocha s vypisom a tlacitkom "oznac minu"
    Label status = new Label("");  // tu sa vypisuju spravy v priebehu hry
    Button oznac = new Button();   // tlacitko "oznac minu"
    boolean m[][] = new boolean[30][30];   // pole min (rozmiestnenie)
    boolean oznacit = false;  // ak je stlacene tlacitko "oznac.." tak je true
    boolean game_over = false;  // true ak hra konci...
	int i,j;  // pocitadla pomocne
	int pocet_min = 15;   // ...
	int ozn_min = 0;  // pocet uhadnutych min
	
	private Min(String titul){   // konstruktor
		super(titul);    // musi to tu byt, neviem preco
		setMenuBar(m_bar);    // nastavi menu
		m_bar.add(hra);   // vlozi "Hra"
		hra.add("Nová hra");    // vklada polozky menu "Hra"
		hra.add("Koniec");
		
		setLayout(new FlowLayout());    // toto nastavi nejake "plavajuce" rozmiestnenie plochy
		
		for(i=0; i<=10; i++)     // tymto sa vytvoria tlac. na h_ploche
			for(j=0; j<=10; j++){
				b[i][j] = new Button("");   		// vytvor Button
				b[i][j].setForeground(Color.lightGray); // farba textu
				b[i][j].setLabel(i+","+j);		// meno tlacitka
				m[i][j] = false;			// maze sa pole min
			}
		
		b_plocha.setLayout(new GridLayout(4,5));   // vytvori sa b_plocha (4x5)
		oznac.setLabel("Oznac minu");              // meno tlacitka
		b_plocha.add(status);			   // vlozi status - label
		b_plocha.add(oznac);			   // vlozi tlacitko na plochu
		add("Top",b_plocha);			   // vytvori b_plochu
						
		h_plocha.setLayout(new GridLayout(11,11)); // vytvori h_plochu (11x11)
		h_plocha.setFont(pismo); 		   // nastavi pismo
		for(i=0; i<=10; i++)		   // vlozi tlacitka
		  for(j=0; j<=10; j++){
		  	 h_plocha.add(b[i][j]);
		  }
		add("Bottom",h_plocha);  // umiestni plochu dole ("bottom")
		
		nova_hra();
	}
		
	private void nova_hra(){
		
		for(i=0; i<=10; i++)
			for(j=0; j<=10; j++){
				b[i][j].setForeground(Color.lightGray);
				b[i][j].setLabel(i+","+j);
				m[i][j] = false;
			}
		int c = pocet_min;
		while (c>0){		// nahodne rozmiestni miny
			i = (short)(Math.floor(Math.random()*11));   // nahodne vybere i poziciu miny
			j = (short)(Math.floor(Math.random()*11));   // nahodne vybere j poziciu miny
			if (m[i][j]==false) {        // ak tam este nie je mina
				m[i][j] = true;      // umiestni tam minu
				c--;
			}
			}	
	}
	
	private void game_win(){  			// ak si vyhral
		status.setText("Gratulujem !!!");	// vypise spravu
		game_over=true;				// nastavi premennu
	}
	
	private void koniec_hry(){			// ak si prehral
		if(m[i][j]==true){			// ak si stupil na minu, vykona sa toto
			b[i][j].setBackground(Color.black);	// oznaci sa pole s minou
			b[i][j].setForeground(Color.red);
			b[i][j].setLabel("!!!");
			status.setText("MINA !!!");  // vypise sa sprava
		}
		else{       // ak si oznacil miesto bez miny
			status.setText("Tu nie je mina !!!");  // vypise spravu
			b[i][j].setBackground(Color.blue);	// pozadie
			b[i][j].setForeground(Color.black);     // popredie
			b[i][j].setLabel("");                   // prazdny text
		}
		game_over=true;       // game over je true
	}
	
	private void testuj(int i, int j){		// testuje stlacene tlacitko
		int poc = 0;
		if (!b[i][j].getLabel().equals("0"))	// 
		if(m[i][j]==true){			// ak si stupil na minu
			koniec_hry();			// koniec hry -> zavola sa koniec_hry()
				
		}
		else {			// ak si stupil na tlacitko bez miny;  hladam pocet min naokolo
			if ((i>0)&&(j>0)&&(m[i-1][j-1]==true)) {poc ++; }    // vlavo hore
			if ((i>0)&&(m[i-1][j]==true)) { poc ++;}	     // hore ...
			if ((i>0)&&(j<10)&&(m[i-1][j+1]==true)) { poc ++; }
			if ((j>0)&&(m[i][j-1]==true)) { poc ++; }
			if ((j<10)&&(m[i][j+1]==true)) { poc ++; }
			if ((i<10)&&(j>0)&&(m[i+1][j-1]==true)) { poc ++; }
			if ((i<10)&&(m[i+1][j]==true)) { poc ++; }
			if ((i<10)&&(j<10)&&(m[i+1][j+1]==true)) { poc ++; }
			if (poc==0) { b[i][j].setForeground(Color.lightGray); }  // farba cisla, ktore vypise na tlacitku
			if (poc==1) { b[i][j].setForeground(Color.yellow); }
			if (poc==2) { b[i][j].setForeground(Color.white); }
			if (poc==3) { b[i][j].setForeground(Color.blue); }
			if (poc==4) { b[i][j].setForeground(Color.cyan); }
			if (poc==5) { b[i][j].setForeground(Color.red); }
			if (poc==6) { b[i][j].setForeground(Color.orange); }
			if (poc==7) { b[i][j].setForeground(Color.magenta); }
			b[i][j].setLabel(String.valueOf(poc));   // vypise cislo na tlacitku
			if (poc==0) {                // ak je 0
				b[i][j].disable();   // deaktivuje tlacitko - iba pre krasu
			    if (i>0) { testuj(i-1,j); }		// backtrack, aby sa odkryli prazdne miesta
		    	if ((i>0)&&(j>0)) { testuj(i-1,j-1); }
				if ((i>0)&&(j<10)) { testuj(i-1,j+1); }
				if (j>0) { testuj(i,j-1); }
				if (j<10) { testuj(i,j+1); }
				if ((i<10)&&(j>0)) { testuj(i+1,j-1); }
				if (i<10) { testuj(i+1,j); }
				if ((i<10)&&(j<10)) { testuj(i+1,j+1); }
		    	}
		}
	}
	
	public boolean action(Event evt, Object arg){  // tato metoda zachytava vsetky udalosti, napr. stlacenie tlac. mysi ...
		if (evt.target instanceof MenuItem){   // ak je stlacena polozka v menu
             if(arg.equals("Nova hra")) nova_hra();    // ak je to "Nova hra"
             if(arg.equals("Koniec")) System.exit(0);  // ak je to "Koniec"
             return true;   // ... udalost sa spracovala
         }

		if(game_over==true) return false;   // ak je koniec hry, vsetky udalosti budu ignorovane
		if(evt.target instanceof Button){   // ak je stlacene hocijake tlacitko
			for(i=0; i<=10; i++)
			for(j=0; j<=10; j++){   // zisti sa, ktore ...
				if(arg.equals(String.valueOf(i+","+j))){   // ... a to podla mena tlacitka,kt. skutocne nevidno
					if(oznacit==true){         // ak tlacitko oznacujeme
						if(m[i][j]==false){ koniec_hry(); return true; }     // ak sme zle oznacili minu, inac ...
						b[i][j].setForeground(Color.black);        // popredie cierne
						b[i][j].setLabel("SAFE");                  // text "SAFE"
						ozn_min++;    // pripocitame dalsiu oznacenu minu
						status.setText("SAFE: "+String.valueOf(ozn_min));  // vypiseme text
						if(ozn_min==pocet_min) game_win();     // ak su vsetky miny oznacene, vyhral si
						return true;   // ... udalost spracovana
					}
					else{   // ak neoznacujeme minu ...
						testuj(i,j);     // testuje sa tlacitko
						return true;     // ... udalost spracovana
					}
				}
			}
			if(arg.equals("Oznac minu")){    // ak sme stlacili tlacitko "oznac minu"
				if(oznacit==true){       // ak je zapnute tlac.
					oznacit=false;   // vypneme ho ...
					oznac.setBackground(Color.lightGray);  // cize jeho farbu
				}
				else{  // ak je vypnute
					oznacit=true;   // zapneme
					oznac.setBackground(Color.green);  // farba zelena
				}
			}
		}
		
		return false;		// ... ostatne udalosti ignorujeme
	}
	
	public static void main(String args[]){    // hlavny program
		Min aplikacia = new Min("$ Miny $");   // vytvori sa aplikacia, s menom "$ Miny $"
        aplikacia.resize(450,380);    // velkost aplikacie
        aplikacia.show();	      // zobrazi sa aplikacia
    }

	// toto zachytava udalost na ukoncenie programu, 
	// toto tu musi byt ak chceme ukocit program stlacenim "x" na liste programu
    public boolean handleEvent(Event evt){
        if (evt.id == Event.WINDOW_DESTROY)     // zachytena udalost na ukoncenie prog.
           System.exit(0); 			// ukonci program
        return super.handleEvent(evt);		// vrati udalost na ukocenie progr.
    }
    
}
