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

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

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

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. otvárané v novom okne
(obvykle ide o externý odkaz)

obrázok

 
  

Staršia verzia

~

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();
	}
}

Staršia verzia

~

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();
	}
}

Staršia verzia

~

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. otvárané v novom okne
(obvykle ide o externý odkaz) Časom sa dočká (už sa dočkala) prepracovania do novšej verzie skupiny tried grafického robota otvárané v novom okne
(obvykle ide o externý odkaz) programovacieho rámca GRobot. otvárané v novom okne
(obvykle ide o externý odkaz)

obrázok

 

Novšia verzia

~

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

Novšia verzia

~

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

Novšia verzia

~

/**
 * 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.