Stránka sa načítava, prosím čakajte…
© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 23. 4. 2024.
Dátum: 3. 9. 2020, pred štyrmi rokmi
Cieľom tejto minihry je plošinou chytiť toľko loptičiek, aby hráč získal 70 bodov. Za každú chytenú lotptičku získa hráč jeden bod, za každú uniknutú jeden stratí. Ak počet bodov klesne pod nulu, hra sa končí neúspechom. Rýchlosť hry sa mení (zvyšuje/znižuje) priamo úmerne s aktuálnym počtom bodov.
Implementácia ukazuje tieto koncepty:
- Súkromné vnorené (alebo zahniezdené ) triedy na vytvorenie malého písacieho systému. (Implementácia je mierne prehnaná z pohľadu šetrenia zdrojmi. Je to z dôvodu zachovania jednoduchosti a univerzálnosti systému.)
- Inicializačné bloky na inicializáciu anonymných tried herných prvkov loptičky a plošiny, ktoré ukazujú ako sa dajú rýchlo a jednoúčelovo rozširovať triedy v Jave – v tomto prípade ide o rozšírenie triedy
GRobot
. V komentároch zdrojového kódu je použité slovné spojenie „mierne prispôsobený robot.“ - Zachytenie myši v okne aplikácie.
- Dynamická zmena rýchlosti zmenou intervalu časovača.
Balíček so zdrojovým súborom na prevzatie. 2,41 kB (2,36 KiB), 3. 9. 2020
~
import knižnica.*; public class ChytanieLoptičiek extends GRobot { // Toto mikroskopické rozšírenie triedy GRobot iba kreslí obsah // verejného atribútu ako svoj tvar. Nakreslené texty sa takto dajú // ľubovoľne polohovať (vrátane otáčania), zafarbovať a podobne zmenou // atribútov robota. private class Text extends GRobot { public String text = null; @Override public void kresliTvar() { if (null != text && !text.isEmpty()) text(text); } } // Toto je zoznam textov (definovaných vyššie). Trieda prekrýva vymazanie, // ktoré nevymaže elementy zoznamu, ale iba vyprázdni ich atribúty textu, // čím sa stanú neviditeľnými; metódu daj, ktorá buď vráti prvý element // s prázdnym textom, alebo vyrobí nový (ktorý je predvolene prázdny). // Nová verzia metódy pridaj umiestni objekty textov tak, že prvý bude na // súradniciach [x; y] a každý ďalší bude posunutý o [Δx; Δy]. (Využije // pri tom metódu daj.) @SuppressWarnings("serial") private class Texty extends Zoznam<Text> { @Override public void vymaž() { for (Text text : this) text.text = null; } @Override public Text daj() { for (Text text : this) if (null == text.text || text.text.isEmpty()) return text; Text text = new Text(); pridaj(text); return text; } public void pridaj(double x, double y, double Δx, double Δy, Object... texty) { for (Object obj : texty) { Text text = daj(); text.text = obj.toString(); text.skočNa(x, y); x += Δx; y += Δy; } } } // Atribúty všetkých prvkov v hre. private int početBodov = 0; private GRobot loptička; private GRobot plošina; private final Texty texty = new Texty(); // Konštruktor. private ChytanieLoptičiek() { skry(); // Loptička je mierne prispôsobený robot. Je ohraničená na hraciu // plochu, po opustení ktorej uberie hráčovi bod. Jej vlastným tvarom // je krúžok a náhodná poloha x-ovej súradnice je volená vždy na // rovnakej y-ovej súradnici (v hornej časti plochy). loptička = new GRobot() { { ohranič(); zdvihniPero(); farba(červená); veľkosť(5); vypĺňajTvary(); skoč(250); rýchlosť(-10, false); aktivuj(false); } @Override public void náhodnáPoloha() { skočNa(Svet.náhodnéCeléČíslo(-300, 300), 250); } @Override public void kresliTvar() { krúžok(); } @Override public void mimoHraníc() { --početBodov; náhodnáPoloha(); } }; // Plošina je tiež mierne prispôsobený robot. Vlastným tvarom je // obdĺžnik so zaoblenými rohmi a detekcia kolízie je tiež vztiahnutá // k tomuto obdĺžniku. plošina = new GRobot() { { ohranič(); farba(modrá); pomer(6); veľkosť(5); zaoblenie(10); vypĺňajTvary(); odskoč(250); } @Override public void kresliTvar() { obdĺžnik(); } @Override public boolean koliduje(GRobot r) { return bodVObdĺžniku(r); } }; // Zachytí myš do okna, skryje ju a zapne časovač. Svet.zachyťMyš(); Svet.zmeňKurzorMyši(null); Svet.spustiČasovač(); } private void vypíšBody() { texty.vymaž(); texty.pridaj(-25, 265, 100, 0, "Počet získaných bodov:", početBodov); } private void vypíšPrehralSi() { texty.vymaž(); texty.pridaj(0, 0, 0, 0, "Je mi ľúto. Prehral si!"); } private void vypíšBlahoželanie() { texty.vymaž(); texty.pridaj(0, 0, 0, 0, "Blahoželám! Vyhral si!"); } @Override public void pohybMyši() { if (Svet.časovačAktívny() && početBodov >= 0 && početBodov < 70) { // Pohyb myši je spracovaný len v prípade, že hra prebieha. Ak // je myš zachytená, plošina sa pohybuje relatívne o zmenu // súradníc myši. V opačnom prípade je pohyb skokový – x-ová // súradnica plošiny je nastavená podľa x-ovej súradnice myši. // Druhý spôsob si môžete vyskúšať zakomentovaním príkazov // zachyťMyš a zmeňKurzorMyši v konštruktore. if (Svet.myšJeZachytená()) plošina.preskočVpravo(ÚdajeUdalostí.polohaMyši().polohaX()); else plošina.polohaX(ÚdajeUdalostí.polohaMyši().polohaX()); vypíšBody(); } } @Override public void tik() { // Kolízia loptičky s plošinou znamená chytenie a získanie bodu. if (plošina.koliduje(loptička)) { ++početBodov; loptička.náhodnáPoloha(); } // Kontrola troch úrovní bodov: // Sedemdesiat a viac bodov znamená výhru. if (početBodov >= 70) { vypíšBlahoželanie(); Svet.zastavČasovač(); } // Nula a väčší počet bodov (do sedemdesiat) je klasický priebeh hry. else if (početBodov >= 0) { vypíšBody(); // Rýchlosť hry sa mení podľa počtu bodov: Svet.spustiČasovač(.045 - početBodov / 2000.0); } // Iný počet bodov (záporný) znamená prehru. else { vypíšPrehralSi(); Svet.zastavČasovač(); } } public static void main(String[] args) { Svet.použiKonfiguráciu("ChytanieLoptičiek.cfg"); new ChytanieLoptičiek(); Svet.zbaľ(); } }
Výsledok
Ukážka okna po spustení hry a chvíľke hrania.
Návrhy na zlepšenia
- Znížiť náročnosť písacieho systému na zdroje celkovou úpravou implementácie. Napríklad predefinovaním triedy
Text
tak, aby nebola odvodená od triedyGRobot
, ale napríklad od triedyČastica
a definovať jediného robota, ktorý by všetky texty kreslil. - Zvýšiť náročnosť hry tak, aby si hra pamätala maximálny dosiahnutý počet bodov (v rámci jednej hry) a nastavovala rýchlosť podľa tejto hodnoty, to znamená, že rýchlosť hry by sa pri strácaní loptičiek neznižovala.
- Implementovať možnosť opakovaného hrania.
- Zlepšiť grafickú stránku hry.