TlačiťTlačiť Slovenčina English Hľadať RSS

© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 23. 4. 2024.

Stránka sa načítava, prosím čakajte…

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é otvárané v novom okne
(obvykle ide o externý odkaz)) 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 otvárané v novom okne
(obvykle ide o externý odkaz) na inicializáciu anonymných tried otvárané v novom okne
(obvykle ide o externý odkaz) 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. otvárané v novom okne
(obvykle ide o externý odkaz) V komentároch zdrojového kódu je použité slovné spojenie „mierne prispôsobený robot.“
  • Zachytenie myši v okne aplikácie. otvárané v novom okne
(obvykle ide o externý odkaz)
  • Dynamická zmena rýchlosti zmenou intervalu časovača. otvárané v novom okne
(obvykle ide o externý odkaz)

ikonaBalíč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

obrázok 
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 triedy GRobot, otvárané v novom okne
(obvykle ide o externý odkaz) ale napríklad od triedy Častica otvárané v novom okne
(obvykle ide o externý odkaz) 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.