import java.awt.Color;
import java.awt.event.MouseEvent;
import sk.upjs.jpaz2.*;
public class PrepinaciaHra extends WinPane {
        /**
         * Policka hracej dosky
         */
        private boolean[][] doska = new boolean[6][6];
        /**
         * Indikuje, ci hra bezi (hra konci, ked sa dosiahlo vyherne rozlozenie)
         */
        private boolean hraBezi = true;
        public PrepinaciaHra() {
                this.kresliMriezku();
                this.zamiesaj(30);
                this.kresliDosku();
        }
        /**
         * Nakresli mriezku
         */
        public void kresliMriezku() {
                Turtle k = new Turtle();
                this.add(k);
                for (int i = 1; i < 6; i++) {
                        k.setPosition(i * 50, 0);
                        k.moveTo(i * 50, this.getHeight());
                }
                for (int i = 1; i < 6; i++) {
                        k.setPosition(0, i * 50);
                        k.moveTo(this.getWidth(), i * 50);
                }
                this.remove(k);
        }
        /**
         * Nakresli farebne kamene na zaklade obsahu policok v this.doska
         */
        public void kresliDosku() {
                Turtle kreslic = new Turtle();
                add(kreslic);
                for (int r = 0; r < 6; r++) {
                        for (int s = 0; s < 6; s++) {
                                kreslic.setPosition(s * 50 + 25, r * 50 + 25);
                                if (doska[r][s]) {
                                        kreslic.setFillColor(Color.red);
                                } else {
                                        kreslic.setFillColor(Color.blue);
                                }
                                kreslic.dot(20);
                        }
                }
                remove(kreslic);
        }
        /**
         * Overi, ci riadok r a stlpec s su platne suradnice
         */
        public boolean dobraSuradnica(int r, int s) {
                return (r >= 0) && (r < 6) && (s >= 0) && (s < 6);
        }
        /**
         * Zrealizuje tah, kedy bolo zatlaceny prepinac na policku v riadku r a
         * stlpci s
         */
        public void tah(int r, int s) {
                int[][] smery = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };
                for (int i = 0; i < smery.length; i++) {
                        int rSused = r + smery[i][0];
                        int sSused = s + smery[i][1];
                        if (dobraSuradnica(rSused, sSused)) {
                                doska[rSused][sSused] = !doska[rSused][sSused];
                        }
                }
        }
        /**
         * Vytvori startovacie rozlozenie kamenov tak, ze spravi zadany pocet
         * nahodnych prepnuti (tahov)
         */
        public void zamiesaj(int pocetMiesani) {
                for (int i=0; i<pocetMiesani; i++) {
                        tah((int)(Math.random()*6), (int)(Math.random()*6));
                }
        }
        /**
         * Vrati, ci v aktualnom stave policok je kresliaca plocha jednofarebna
         */
        public boolean jeVyherna() {
                for (int r=0; r<6; r++) {
                        for (int s=0; s<6; s++) {
                                if (doska[0][0] != doska[r][s]) {
                                        return false;
                                }
                        }
                }
                return true;
        }
        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                if (!hraBezi)
                        return;
                tah(y / 50, x / 50);
                kresliDosku();
                if (jeVyherna()) {
                        hraBezi = false;
                }
        }
}