C6

package sk.upjs.paz.Game;

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(3);
                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() {
                // prejdem dvojrozmerne pole
                // v strede policka vykreslim bodku podla T/F
                Turtle k = new Turtle();
                this.add(k);

                for (int r = 0; r < 6; r++) {
                        for (int s = 0; s < 6; s++) {
                                k.setPosition(s * 50 + 25, r * 50 + 25);
                                if (doska[r][s]) {
                                        k.setFillColor(Color.blue);
                                } else {
                                        k.setFillColor(Color.red);
                                }
                                k.dot(20);
                        }
                }
                this.remove(k);
        }

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

                // tu by bola potrebna podmienka ku kazdemu riadku
                // ci je dobra suradnica
                // this.doska[r + 1][s] = !this.doska[r + 1][s];
                // this.doska[r][s + 1] = !this.doska[r][s + 1];
                // this.doska[r - 1][s] = !this.doska[r - 1][s];
                // this.doska[r][s - 1] = !this.doska[r][s - 1];

                for (int i = 0; i < 4; i++) {
                        int novyR = r + smery[i][0];
                        int novyS = s + smery[i][1];
                        if (this.dobraSuradnica(novyR, novyS)) {
                                this.doska[novyR][novyS] = !this.doska[novyR][novyS];
                        }
                }

        }

        /**
         * Vytvori startovacie rozlozenie kamenov tak, ze spravi zadany pocet nahodnych
         * prepnuti (tahov)
         */

        public void zamiesaj(int pocetMiesani) {
                for (int i = 0; i < pocetMiesani; i++) {
                        this.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 (this.doska[r][s] != this.doska[0][0]) {
                                        return false;
                                }
                        }
                }
                return true;
        }

        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                if (this.hraBezi) {
                        int r = y / 50;
                        int s = x / 50;
                        this.tah(r, s);
                        this.kresliDosku();

                        if (this.jeVyherna()) {
                                System.out.println("Vyhral si.");
                                this.hraBezi = false;
                        }
                }
        }
}