Zdrojový kód k 5. prednáške

Projekt Kvetinová farma

Trieda Farma:

import java.awt.Color;
import java.awt.event.MouseEvent;

import sk.upjs.jpaz2.ImageTurtleShape;
import sk.upjs.jpaz2.Turtle;
import sk.upjs.jpaz2.WinPane;

public class Farma extends WinPane {

        /**
         * Instancna premenna refercujuca pole (polovy objekt) int-ov. I-ty prvok
         * pola uchovava informaciu o tom, kolko kvetin mame vysadenych v i-tom
         * zahone.
         */

        private int[] zahony;

        /**
         * "Inicializacna metoda", ktora zabezpeci vykonanie prikazov hned po
         * vytvoreni objektu triedy Farma
         */

        public Farma() {
                // Zmenime rozmery kresliacej plochy
                this.resize(500, 300);
                // Nastavime farbu pozadia
                this.setBackgroundColor(new Color(255, 211, 155));
                // Vytvorime pole s poctom prvkom 7 (dokaze uchovat 7 int-ov).
                // Referenciu na vytvorene pole ulozime do instancnej premennej zahony
                this.zahony = new int[7];
                // Nechame nakreslit hranice zahonov podla velkosti pola
                this.kresliZahony(this.zahony.length);
        }

        /**
         * Nakresli deliace hranice pre zahony
         *
         * @param pocetZahonov
         *            pocet zahonov, pre ktore kreslime hranicu
         */

        public void kresliZahony(int pocetZahonov) {
                // Korytnacka kreslic
                Turtle kreslic = new Turtle();
                this.add(kreslic);

                // Nakreslime vertikalne ciary
                int sirkaZahonu = this.getWidth() / pocetZahonov;
                for (int i = 0; i < pocetZahonov - 1; i++) {
                        kreslic.setPosition((i + 1) * sirkaZahonu, 0);
                        kreslic.moveTo((i + 1) * sirkaZahonu, this.getHeight());
                }

                // Kreslica odstranime z farmy (kresliacej plochy)
                this.remove(kreslic);
        }

        /**
         * Zasadi kvietok na zadane suradnice
         *
         * @param x
         *            x-ova suradnica pre sadeny kvietok
         * @param y
         *            y-ova suradnica pre sadeny kvietok
         */

        public void zasadKvietok(int x, int y) {
                // Kreslic ...
                Turtle kreslic = new Turtle();
                // Zmenime tvar korynacky podla obrazku v grafickom subore
                kreslic.setShape(new ImageTurtleShape("/kvietok.png"));
                // Kreslica pridame do plochy a nechame ho otlacit svoj tvar do
                // kresliacej plochy
                this.add(kreslic);
                kreslic.setPosition(x, y);
                kreslic.stamp();
                // No a nakoniec kreslica odstranime z farmy
                this.remove(kreslic);

                // Vypocitame si sirku jedneho zahonu
                int sirkaZahonu = this.getWidth() / this.getPocetZahonov();
                // Vypocitame si index zahonu, do ktoreho sme klikli
                int kliknutyZahon = x / sirkaZahonu;
                // V poli si poznacime, ze v danom zahone sme posadili novy kvietok
                this.zahony[kliknutyZahon]++;
        }

        /**
         * Vrati pocet zahonov
         */

        public int getPocetZahonov() {
                return this.zahony.length;
        }

        /**
         * Vrati pocet kvietkov v zadanom zahone
         *
         * @param indexZahonu
         *            index zahonu na farme
         */

        public int vZahone(int indexZahonu) {
                return this.zahony[indexZahonu];
        }

        /**
         * Vrati pocet zahonov, kde je viac ako hranica kvetiniek
         */

        public int sViacAko(int hranica) {
                int pocitadlo = 0;

                // Prechadzame vsetky zahony
                for (int i = 0; i < this.zahony.length; i++) {
                        // Ak ma i-ty zahon viac ako hranica kvetiniek, tak zvysime
                        // pocitadlo o 1
                        if (this.zahony[i] > hranica) {
                                pocitadlo++;
                        }
                }

                return pocitadlo;
        }

        /**
         * Overime, ci v kazdom zahone je aspon jeden kvietok
         */

        public boolean vsadeNieco() {
                // Prechadzame vsetky zahony
                for (int i = 0; i < this.zahony.length; i++) {
                        // Ak v i-tom zahone niet kvetiniek, tak koncime s false
                        if (this.zahony[i] == 0) {
                                return false;
                        }
                }

                // Ak sme sa dostali sem, tak v kazdom zahone musel byt aspon jeden
                // kvietok
                return true;
        }

        /**
         * Vrati index zahonu, v ktorom je najvacsi pocet kvetiniek
         */

        public int najZahon() {
                // Index zahonu, ktory je kandidatom na najkvietkovanejsi zahon
                int najIndex = 0;
                // Prechadzame vsetky zahony
                for (int i = 1; i < this.zahony.length; i++) {
                        // Ak v i-tom zahone je viac kvetin, ako ma kandidat, tak mame
                        // lepsieho kandidata
                        if (this.zahony[i] > this.zahony[najIndex]) {
                                najIndex = i;
                        }
                }

                return najIndex;
        }

        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                this.zasadKvietok(x, y);
        }
}

"Spúštač":

import sk.upjs.jpaz2.*;

public class Launcher {

        /**
         * @param args
         */

        public static void main(String[] args) {
                Farma zahrada = new Farma();
                ObjectInspector oi = new ObjectInspector();
                oi.inspect(zahrada);
        }

}

Projekt Korytnačí futbal s jednou loptou

Trieda Lopta:

import sk.upjs.jpaz2.ImageTurtleShape;
import sk.upjs.jpaz2.Turtle;

public class Lopta extends Turtle {

        /**
         * "Inicializacna metoda" pre korytnacky maskovane za lopty
         */

        public Lopta() {
                this.penUp();
                this.setShape(new ImageTurtleShape("/lopta.png"));
        }

        /**
         * Pohne sa o 10 smerom k bodu [x, y]
         */

        public void pohniSaSmerom(double x, double y) {
                this.turnTowards(x, y);
                this.step(10);
        }

        /**
         * Vrati, ci ak sa kliklo na bod [x, y], tak sa kliklo na tuto loptu
         */

        public boolean klikloSaNaMna(double x, double y) {
                return (this.distanceTo(x, y) < 20);
        }
}

Trieda Ihrisko:

import java.awt.Color;
import java.awt.event.MouseEvent;

import sk.upjs.jpaz2.*;

public class Ihrisko extends WinPane {

        /**
         * Instancna premenna referencujuca loptu na ihrisku
         */

        private Lopta lopta;

        /**
         * Ci je prave teraz tahana lopta
         */

        private boolean tahanaLopta = false;

        /**
         * "Inicializacna metoda"
         */

        public Ihrisko() {
                this.setBackgroundColor(Color.green);

                // Vytvorime loptu na nahodnej pozicii
                this.lopta = new Lopta();
                this.add(this.lopta);
                this.lopta.setPosition(Math.random() * this.getWidth(), Math.random()
                                * this.getHeight());
        }

        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                this.lopta.pohniSaSmerom(x, y);
        }

        @Override
        protected void onMousePressed(int x, int y, MouseEvent detail) {
                // Tahanie lopty zacne, ked sa zatlacilo lave tlacidlo mysky a zaroven
                // sa mys je nad loptou
                if ((detail.getButton() == MouseEvent.BUTTON1)
                                && (this.lopta.klikloSaNaMna(x, y))) {
                        this.tahanaLopta = true;
                }
        }

        @Override
        protected void onMouseDragged(int x, int y, MouseEvent detail) {
                // Ak tahame loptu, tak ju presunieme
                if (this.tahanaLopta) {
                        this.lopta.setPosition(x, y);
                }
        }

        @Override
        protected void onMouseReleased(int x, int y, MouseEvent detail) {
                // Ak sme pustili lave tlacidlo mysky, tak tahanie skoncilo - poznacime
                // si to
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        this.tahanaLopta = false;
                }
        }
}

"Spúštač":

import sk.upjs.jpaz2.*;

public class Launcher {

        /**
         * @param args
         */

        public static void main(String[] args) {
                Ihrisko cermel = new Ihrisko();
        }

}

Projekt Korytnačí futbal s viacerými loptami

Trieda Ihrisko:

import java.awt.Color;
import java.awt.event.MouseEvent;

import sk.upjs.jpaz2.WinPane;

public class Ihrisko extends WinPane {

        /**
         * Instancna premenna referncujuca pole referencii na lopty, ktore su na
         * ihrisku
         */

        private Lopta[] lopty;

        /**
         * Referencia na aktualne tahanu loptu
         */

        private Lopta tahanaLopta = null;

        /**
         * "Inicializacna metoda" pre ihriska
         */

        public Ihrisko() {
                this.setBackgroundColor(Color.green);

                // Vyrobime pole na 10 referencii na objekty triedy Lopta a referenciu
                // na toto pole ulozime do premennej lopty
                this.lopty = new Lopta[10];

                // Vyrobime jednotlive lopty
                for (int i = 0; i < this.lopty.length; i++) {
                        // Vyrobime jednu loptu a umiestnime ju na nahodnu poziciu
                        Lopta jednaLopta = new Lopta();
                        this.add(jednaLopta);
                        jednaLopta.setPosition(Math.random() * this.getWidth(),
                                        Math.random() * this.getHeight());
                        // Referenciu na loptu, ktoru sme teraz vyrobili ulozime do policka
                        // s indexom i pola lopty
                        this.lopty[i] = jednaLopta;
                }
        }

        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                // Kandidat na loptu, ktora je najblizsie k miestu kliknutia
                Lopta najLopta = this.lopty[0];

                // Hladame loptu, ktora je najblizsie k miestu kliknutia...
                for (int i = 1; i < this.lopty.length; i++) {
                        // Overime, ci i-ta lopta nie je blizsie, ako lopta, ktora je
                        // referencovana z premennej najLopta
                        if (najLopta.distanceTo(x, y) > this.lopty[i].distanceTo(x, y)) {
                                // Ak je podmienka splnena, mame blizsiu loptu - zapamatame si
                                // referenciu na tuto loptu
                                najLopta = this.lopty[i];
                        }
                }

                // Najblizsej lopte povieme, aby sa pohla
                najLopta.pohniSaSmerom(x, y);
        }

        @Override
        protected void onMousePressed(int x, int y, MouseEvent detail) {
                // Najprv overime, ci sa zatlacilo lave tlacidlo mysky
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        // Hladame, ci bod na suradniciach [x, y] patri nejakej lopte
                        for (int i = 0; i < this.lopty.length; i++) {
                                if (this.lopty[i].klikloSaNaMna(x, y)) {
                                        this.tahanaLopta = this.lopty[i];
                                }
                        }
                }
        }

        @Override
        protected void onMouseDragged(int x, int y, MouseEvent detail) {
                // Ak nejaku loptu tahame, tak ju presunieme
                if (this.tahanaLopta != null) {
                        this.tahanaLopta.setPosition(x, y);
                }
        }

        @Override
        protected void onMouseReleased(int x, int y, MouseEvent detail) {
                // Ak sa uvolnilo lave tlacidlo mysky, tak prestaneme tahanim presuvat
                // loptu
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        this.tahanaLopta = null;
                }
        }
}

"Spúštač":

import sk.upjs.jpaz2.*;

public class Launcher {

        /**
         * @param args
         */

        public static void main(String[] args) {
                Ihrisko tehelnePole = new Ihrisko();
        }

}