Stránka sa načítava, prosím čakajte…
© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 29. 3. 2024.
Dátum: 14. 12. 2012, pred viacerými rokmi, aktualizované: 19. 4. 2020, pred štyrmi rokmi
Aktualizácia staršieho ukážkového projektu hry Hadík. Aktualizácia používa najnovšiu verziu programovacieho rámca GRobot.
|
~
import knižnica.*; /** * Trieda definujúca jedlo. */ public class Jedlo extends GRobot { /** * Konštruktor, v ktorom definujeme predvolené vlastnosti jedla. */ public Jedlo() { farba(červená); veľkosť(15); náhodnáPoloha(); vypĺňajTvary(); } /** * Kreslenie vlastného tvaru jedla. */ @Override public void kresliTvar() { krúžok(); } }
~
import knižnica.GRobot; /** * Trieda definujúca jedlo. */ public class Jedlo extends GRobot { /** * Konštruktor, v ktorom definujeme predvolené vlastnosti jedla. */ public Jedlo() { farba(červená); veľkosť(15); náhodnáPoloha(); vypĺňajTvary(); } /** * Kreslenie vlastného tvaru jedla. */ @Override public void kresliTvar() { krúžok(); } }
~
import knižnica.GRobot; import knižnica.Zoznam; import static knižnica.Kláves.*; import static knižnica.Svet.*; import static knižnica.ÚdajeUdalostí.kláves; /** * Hlavná trieda projektu. V tejto triede definujeme všetko podstatné * súvisiace s údajmi a správaním sa hry. */ public class HlavnáTrieda extends GRobot { // Zoznam robotov uchovávajuci objekty hlavy a tela hadíka: private final Zoznam<GRobot> hadík = new Zoznam<>(); // Hlava bude „obyčajný“ robot. Tým chceme povedať, že sme pre // ňu nedefinovali žiadnu samostatnú triedu (ako pre články // tela a jedla). private final GRobot hlava; // Jedlo bude len jedno. (Vždy po zjedení zmení svoju polohu.) private final Jedlo jedlo; /** * Súkromný konštruktor. V ňom incializujeme všetko potrebné * a definujeme obsluhu udalostí. */ private HlavnáTrieda() { // Skrytie hlavného robota (nebudeme ho potrebovať): skry(); // Vytvoríme hlavu a nastavíme jej prislúchajúce vlastnosti: hlava = new GRobot(); hlava.hrúbkaČiary(3); hlava.farba(oranžová); hlava.zdvihniPero(); hlava.veľkosť(15); hlava.ohranič(); // Hneď potom pridáme hlavu do zoznamu prvkov telesnej schránky // hadíka (zoznam bol doteraz prázdny, čiže hlava bude jeho prvým // prvkom): hadík.pridaj(hlava); // Vytvoríme jedlo (všetky jeho počiatočné vlastnosti sú nastavené // v jeho konštruktore, to jest v triede Jedlo): jedlo = new Jedlo(); // Vytvoríme stabilný počet deviatich článkov tela a pridáme ich do // zoznamu (všetky vlastnosti článkov sú nastavované v konštruktore // triedy ČlánokTela): for (int i = 0; i < 9; ++i) hadík.pridaj(new ČlánokTela(i)); // Po dokončení všetkých príkazov konštruktora spustíme časovač: spustiČasovač(0.05); } // Tik reaguje na časovač. @Override public void tik() { // V cykle postupne posunieme všetky články tela na pozíciu // predchádzajúceho článku v zozname. Tým zabezpečíme // postupné posúvanie celého tela hadíka pri každom tiku. for (int i = hadík.veľkosť() - 1; i > 0; --i) { hadík.daj(i).skočNa(hadík.daj(i - 1)); hadík.daj(i).otoč(hadík.daj(i - 1)); } // Hadík môže fungovať aj v automatickom režime. „Odkomentovaním“ // nasledujúcich riadkov kódu sa aktivuje podmienka, ktorá určí // aby sa s pravdepodobnosťou 20 % vykonal príkaz hovoriaci // „hlava otoč sa na jedlo“: /** / if (náhodnéCeléČíslo(0, 100) <= 20) hlava.otočNa(jedlo); /**/ // Hlavu posunieme dopredu o 20 bodov. hlava.dopredu(20); // Nakoniec skontrolujeme, či hlava koliduje s jedlom: if (jedlo.koliduje(hlava)) { // Presunutie jedla na novú náhodnú polohu spôsobí // zdanie, že na hracej ploche vzniklo nové jedlo… jedlo.náhodnáPoloha(); } } // Vďaka tejto metóde môžeme hadíka riadiť klávesnicou: @Override public void stlačenieKlávesu() { switch (kláves()) { case VPRAVO: hlava.smer(0); break; case VĽAVO: hlava.smer(180); break; case HORE: hlava.smer(90); break; case DOLE: hlava.smer(270); break; } } // Vďaka tejto metóde môžeme hadíka riadiť klikmi myšou: @Override public void stlačenieTlačidlaMyši() { hlava.otočNaMyš(); } // Vďaka tejto metóde môžeme hadíka riadiť ťahaním myši: @Override public void ťahanieMyšou() { hlava.otočNaMyš(); } /** * Hlavná metóda. */ public static void main(String[] args) { // Stručne: Vypneme automatické prekresľovanie, naštartujeme projekt, // zbalíme okno sveta a zapneme automatické prekresľovanie: nekresli(); new HlavnáTrieda(); zbaľ(); kresli(); } }
Na tejto stránke je publikovaný jednoduchý ukážkový projekt hry Hadík, ktorý je však naprogramovaný s využitím staršej verzie skupiny tried grafického robota. Časom sa dočká (už sa dočkala) prepracovania do novšej verzie skupiny tried grafického robota programovacieho rámca GRobot.
- Projekt na prevzatie 53,52 kB (52,27 KiB), 14. 12. 2012
~
/** * Hlavná trieda projektu. V tomto projekte definujeme v tejto triede * všetko podstatné dotýkajúce sa údajov aj správania hry. */ public class HlavnáTrieda extends Robot { // Zoznam robotov reprezentujúcich hlavu a telo hadíka: private final Zoznam<Robot> hadík = new Zoznam<Robot>(); /** * Súkromný konštruktor (dôvody som vysvetľoval na prednáškach). V ňom * incializujeme všetko potrebné a definujeme obsluhu udalostí. */ private HlavnáTrieda() { // Skrytie hlavného robota (nebudeme ho potrebovať): skry(); // Keď chceme premennú používať v obsluhe udalostí, musí byť // definovaná ako finálna (konečná = final)… To sa bude dotýkať // hlavy hadíka a jedla. // Vytvoríme hlavu. Bude to „obyčajný“ robot, chcem povedať, že pre // hlavu sme nedefinovali žiadnu samostatnú triedu ako pre články // tela a jedlo. final Robot hlava = new Robot(); // Nastavíme hlave príslušné vlastnosti: hlava.farba(oranžová); hlava.zdvihniPero(); hlava.veľkosť(15); // Pridáme hlavu do zoznamu, ktorý je na tomto mieste prázdny, čiže // hlava bude prvým prvkom zoznamu. hadík.pridaj(hlava); // Vytvoríme jedlo. Všetky vlastnosti sú nastavené v konštruktore // triedy Jedlo. final Robot jedlo = new Jedlo(); // Vytvoríme 9 článkov tela a pridáme ich do zoznamu. Všetky // vlastnosti článkov sú nastavované v konštruktore triedy // ČlánokTela. for (int i = 0; i < 9; ++i) hadík.pridaj(new ČlánokTela(i)); // Definujeme obsluhu udalostí: new ObsluhaUdalostí() { // Tik bude reagovať na časovač. @Override public void tik() { // V cykle postupne posunieme všetky články tela na pozíciu // predchádzajúceho článku v zozname. Tým zabezpečíme // postupné posúvanie celého tela hadíka pri každom tiku. for (int i = hadík.veľkosť() - 1; i > 0; --i) { hadík.daj(i).skočNa(hadík.daj(i - 1)); hadík.daj(i).otoč(hadík.daj(i - 1)); } // Keď chcete, aby hadík fungoval v automatickom režime, // odkomentujte nasledujúce riadky kódu. Podmienka určuje, // že s pravdepodobnosťou 20% sa má vykonať príkaz hovoriaci // „hlava otoč sa na jedlo“. /** / if (svet.náhodnéCeléČíslo(0, 100) <= 20) hlava.otočNa(jedlo); /**/ // Hlavu posunieme dopredu o 20 bodov. hlava.dopredu(20); // Nasledujúca štvorica podmienených spracovaní zabezpečuje, // že ak hlava opustí vidteľnú časť plátna, objaví sa na // protiľahlej strane: if (hlava.polohaX() > svet.pravýOkraj()) hlava.polohaX(svet.ľavýOkraj()); if (hlava.polohaX() < svet.ľavýOkraj()) hlava.polohaX(svet.pravýOkraj()); if (hlava.polohaY() > svet.hornýOkraj()) hlava.polohaY(svet.spodnýOkraj()); if (hlava.polohaY() < svet.spodnýOkraj()) hlava.polohaY(svet.hornýOkraj()); // Nakoniec skontrolujeme, či hlava koliduje s jedlom: if (jedlo.koliduje(hlava)) { // Presunutie jedla na novú náhodnú polohu spôsobí // zdanie, že na hracej ploche vzniklo nové jedlo… jedlo.náhodnáPoloha(); } // V metóde „tik“ musíme prekresľovanie sveta zabezpečovať // „ručne“ (tým chcem povedať, že sa nedeje automaticky): svet.prekresli(); } // Vďaka tejto metóde môžeme hadíka riadiť klávesnicou: @Override public void stlačenieKlávesu() { switch (údajeUdalostí.kláves()) { case Kláves.vpravo: hlava.smer(0); break; case Kláves.vľavo: hlava.smer(180); break; case Kláves.hore: hlava.smer(90); break; case Kláves.dole: hlava.smer(270); break; } } // Vďaka tejto metóde môžeme hadíka riadiť klikmi myšou: @Override public void stlačenieTlačidlaMyši() { hlava.otočNaMyš(); } // Vďaka tejto metóde môžeme hadíka riadiť ťahaním myši: @Override public void ťahanieMyšou() { hlava.otočNaMyš(); } }; // Po dokončení všetkých príkazov konštruktora spustíme časovač: svet.spustiČasovač(0.05); } /** * Hlavná metóda. Spomíname ju od začiatku semestra, takže jej účel by * mal byť zrejmý… */ public static void main(String[] args) { new HlavnáTrieda(); } }
~
/** * Trieda definujúca článok tela hadíka. */ public class ČlánokTela extends Robot { /** * Konštruktor prijímajúci číselný argument určujúci poradové číslo * článka tela hadíka. Z prijatej hodnoty je vypočítaná veľosť tohto * článka hadíka. Čím vyššie poradové číslo, tým menšia veľkosť. * Najmenšia možná veľkosť je 1. */ public ČlánokTela(int poradieČlánku) { farba(zelená); hrúbkaČiary(4); int mojaVeľkosť = 8 - poradieČlánku / 3; if (mojaVeľkosť < 1) veľkosť(1); else veľkosť(mojaVeľkosť); } /** * Kreslenie vlastného tvaru článka. */ @Override public void kresli() { skoč(svet.náhodnéCeléČíslo(-3, 3), svet.náhodnéCeléČíslo(-3, 3)); kruh(veľkosť()); posuňVľavo(veľkosť() + 3); posuňVpravo(2 * veľkosť() + 5); } }
~
/** * Trieda definujúca jedlo. */ public class Jedlo extends Robot { /** * Konštruktor, v ktorom definujeme základné vlastnosti jedla. */ public Jedlo() { farba(červená); veľkosť(15); náhodnáPoloha(); } /** * Kreslenie vlastného tvaru jedla. */ @Override public void kresli() { kruh(veľkosť()); } /** * Prekrytie metódy na generovanie náhodnej polohy jedla. Originálna * metóda pracuje tak, že umiestni robot (jedlo) na náhodnú polohu * v rámci celého plátna. Táto prekrytá metóda upravuje svoje správanie * tak, aby náhodné umiestnenie bolo iba v rámci viditeľnej časti * plátna (t. j. v rámci okrajov). */ @Override public void náhodnáPoloha() { skočNa( svet.náhodnéReálneČíslo( svet.ľavýOkraj(), svet.pravýOkraj()), svet.náhodnéReálneČíslo( svet.spodnýOkraj(), svet.hornýOkraj())); } }
Prosím, zvoľte triedu.