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

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

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

Dátum: 21. 3. 2016, pred niekoľkými rokmi, aktualizované: 20. 4. 2020, pred štyrmi rokmi

Tento projekt neobsahuje žiadne komentáre. (Komentáre sú vynikajúcou pomôckou pri analýze zdrojového kódu a v materiáli na vzdelávacie účely by určite nemali chýbať, avšak problémom bol nedostatok času. – Tento projekt má ambíciu stať sa súčasťou učebnice. V takom prípade bude doplnený o všetko potrebné, vrátane komentárov.)

 

Projekt bol premenovaný z nového hadíka na húsenicu. Najviac zmien bolo vykonaných v hlavnej triede.

 

obrázok

 
  

Staršia verzia

~

import knižnica.GRobot;
import static knižnica.Svet.*;

public class NáhodnýPrvok extends GRobot
{
	@Override public void náhodnáPoloha()
	{
		skočNa(
			náhodnéReálneČíslo(ľavýOkraj(), pravýOkraj()),
			náhodnéReálneČíslo(spodnýOkraj(), hornýOkraj()));
	}
}

Staršia verzia

~

import static knižnica.Svet.*;

public class ŽivýPrvok extends NáhodnýPrvok
{
	public void smrť()
	{
		náhodnáPoloha();
		náhodnýSmer();
	}

	@Override public void aktivita()
	{
		// Namiesto tejto metódy nemôže byť použité ohraničenie, pretože
		// to funguje s pevne stanovenými hranicami, naproti tomu okraje
		// okna sa môžu dynamicky meniť.
		if (polohaX() > pravýOkraj() || polohaX() < ľavýOkraj() ||
			polohaY() > hornýOkraj() || polohaY() < spodnýOkraj())
			smrť();
	}
}

Staršia verzia

~

import knižnica.Farba;

public class Jedlo extends ŽivýPrvok
{
	private final static Farba farbaJedla = svetlozelená;

	public Jedlo()
	{
		farba(farbaJedla);
		zdvihniPero();
		rýchlosť(1, false);
		maximálnaUhlováRýchlosť(5);
		smrť();
	}

	@Override public void kresliTvar()
	{
		hrúbkaČiary(veľkosť() / 5.0);
		kružnica();
		kružnica(veľkosť() / 3.0);
	}
}

Staršia verzia

~

import knižnica.Farba;

public class ČlánokTela extends ŽivýPrvok
{
	private final static Farba farbaČlánku = zelená;

	public ČlánokTela()
	{
		farba(farbaČlánku);
		zdvihniPero();
		náhodnáPoloha();
	}

	@Override public void kresliTvar()
	{
		hrúbkaČiary(veľkosť() / 5.0);
		kružnica();
	}

	@Override public void smrť()
	{
		aktivuj();
	}

	@Override public void aktivita()
	{
		if (veľkosť() > 1)
			veľkosť(veľkosť() - 1);
		else
		{
			skry();
			deaktivuj();
		}
	}
}

Staršia verzia

~

import knižnica.Farba;

public class Hlava extends ŽivýPrvok
{
	private final static Farba farbaHlavy = zelená;

	public Hlava()
	{
		farba(farbaHlavy);
		zdvihniPero();
		veľkosť(15);
		rýchlosť(20, false);
		maximálnaUhlováRýchlosť(30);
	}

	@Override public void kresliTvar()
	{
		hrúbkaČiary(veľkosť() / 5.0);
		kružnica();

		vpravo(30);
		skoč();
		vpred(veľkosť() * 0.3);

		domov();

		vľavo(30);
		skoč();
		vpred(veľkosť() * 0.3);
	}
}

Staršia verzia

~

import knižnica.Farba;
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;

public class HlavnáTrieda extends GRobot
{
	private class ZlepšenáHlava extends Hlava
	{
		@Override public void smrť()
		{
			--skóre;
			super.smrť();

			if (odoberČlánok())
			{
				if (vyrovnajPoSmrti)
				{
					GRobot riadiaci = HlavnáTrieda.this;
					riadiaci.smer(hlava.smer());
					riadiaci.poloha(hlava.poloha());

					int dĺžka = húsenica.dĺžka();
					for (int i = 1; i < dĺžka; ++i)
					{
						riadiaci.dozadu(30);
						húsenica.daj(i).poloha(riadiaci.poloha());
					}

					presuňSkóre();
					riadiaci.smer(90);
				}
				upravHúsenicu(true);
			}
		}
	}

	private final static Farba farbaPozadia = new Farba(110, 245, 135);

	private final Zoznam<ŽivýPrvok> húsenica = new Zoznam<>();
	private final Zoznam<ŽivýPrvok> zásoba = new Zoznam<>();
	private final Zoznam<Jedlo> jedlá = new Zoznam<>();

	private final Hlava hlava;

	private int skóre = 0;

	private boolean automaticky = true;
	private boolean pohyblivéJedlo = true;
	private boolean citlivéJedlo = true;
	private boolean odhryzniSeba = true;
	private boolean citlivéCeléTelo = true;
	private boolean smrťPoUhryznutí = false;
	private boolean vyrovnajPoSmrti = false;

	private boolean zobrazSkóre = true;
	private boolean zobrazInformácie = false;
	private boolean zobrazPomocníka = false;
	private boolean celáObrazovka = false;

	private HlavnáTrieda()
	{
		super(šírkaZariadenia(0), výškaZariadenia(0));

		farbaPozadia(farbaPozadia);
		farba(tmavozelená);
		zdvihniPero();
		presuňSkóre();

		nekresli();

		húsenica.pridaj(hlava = new ZlepšenáHlava());
		for (int i = 0; i < 3; ++i)
			pridajČlánok();

		for (int i = 0; i < 150; ++i)
			jedlá.pridaj(new Jedlo());

		upravHúsenicu(true);
		reaktivujJedlá();

		hlava.aktivuj();
		kresli();
		spustiČasovač(0.100);
	}

	private void presuňSkóre()
	{
		skočNa(ľavýOkraj() + 10, hornýOkraj() - 25);
	}

	private boolean odoberČlánok()
	{
		if (húsenica.dĺžka() > 1)
		{
			ŽivýPrvok presuň = húsenica.posledný();
			presuň.smrť();

			húsenica.odober(presuň);
			zásoba.pridaj(presuň);
			return true;
		}

		return false;
	}

	private void pridajČlánok()
	{
		boolean nenájdené = true;

		if (zásoba.počet() > 0)
		{
			for (ŽivýPrvok presuň : zásoba)
			{
				if (presuň.skrytý())
				{
					presuň.zobraz();

					zásoba.odober(presuň);
					húsenica.pridaj(presuň);
					nenájdené = false;
					break;
				}
			}
		}

		if (nenájdené) húsenica.pridaj(new ČlánokTela());

		if (húsenica.počet() > 2)
		{
			ŽivýPrvok telo1 = húsenica.daj(húsenica.dĺžka() - 3);
			ŽivýPrvok telo2 = húsenica.daj(húsenica.dĺžka() - 2);
			ŽivýPrvok telo3 = húsenica.daj(húsenica.dĺžka() - 1);
			telo3.skočNa(telo2);
			telo3.otočNa(telo1);
			telo3.dozadu(30);
		}
	}

	private void smerNaJedlo()
	{
		int početJedál = jedlá.počet();
		Jedlo najbližšie = jedlá.daj(0);
		double vzdialenosť = hlava.vzdialenosťK(najbližšie);

		for (int i = 1; i < početJedál; ++i)
		{
			Jedlo jedlo = jedlá.daj(i);
			double porovnaj = hlava.vzdialenosťK(jedlo);

			if (porovnaj < vzdialenosť)
			{
				najbližšie = jedlo;
				vzdialenosť = porovnaj;
			}
		}

		hlava.cieľ(najbližšie, true, false);
	}

	private void upravHúsenicu(boolean ajVeľkosti)
	{
		int dĺžka = húsenica.dĺžka();

		if (ajVeľkosti)
		{
			double veľkosťHlavy = hlava.veľkosť();
			double veľkosťChvosta = veľkosťHlavy / 2.0;
			double t = 0.0, Δt = 1.0 / (double)(dĺžka - 1);

			for (int i = 1; i < dĺžka; ++i)
			{
				húsenica.daj(i).veľkosť(lineárnaInterpolácia(
					veľkosťHlavy, veľkosťChvosta, t));
				t += Δt;
			}

			naVrch();

			if (automaticky) smerNaJedlo();
			else hlava.zrušCieľ(false);
		}

		for (int i = 1; i < dĺžka; ++i)
		{
			ŽivýPrvok článok0 = húsenica.daj(i - 1);
			ŽivýPrvok článok1 = húsenica.daj(i);
			článok1.otočNa(článok0);
			článok1.skočNa(článok0);
			článok1.dozadu(článok0.veľkosť() + článok1.veľkosť());
		}
	}

	private void presuňKolidujúceJedlá()
	{
		for (Jedlo jedlo : jedlá)
			for (ŽivýPrvok článok : húsenica)
				if (jedlo.koliduje(článok))
					jedlo.smrť();
	}

	private void reaktivujJedlá()
	{
		if (pohyblivéJedlo)
			for (Jedlo jedlo : jedlá)
				jedlo.aktivuj();
		else
			for (Jedlo jedlo : jedlá)
				jedlo.deaktivuj();
	}

	private boolean overKolízieTela()
	{
		int dĺžka2 = húsenica.dĺžka();
		int dĺžka1 = citlivéCeléTelo ? dĺžka2 : 1;
		boolean zomrel = false;

		koniec:
		for (int i = 0; i < dĺžka1; ++i)
		{
			for (int j = i + 2; j < dĺžka2; ++j)
			{
				ŽivýPrvok článok1 = húsenica.daj(i);
				ŽivýPrvok článok2 = húsenica.daj(j);
				if (článok1.koliduje(článok2))
				{
					if (odhryzniSeba)
					{
						skóre -= dĺžka2 - j - 2;
						for (int k = j + 1; k < dĺžka2; ++k)
							odoberČlánok();
					}

					zomrel = true;
					if (smrťPoUhryznutí) hlava.smrť();

					break koniec;
				}
			}
		}

		return zomrel;
	}

	@Override public void tik()
	{
		boolean zožralaNiečo = false;

		for (Jedlo jedlo : jedlá)
		{
			if (jedlo.koliduje(hlava))
			{
				zožralaNiečo = true;
				pridajČlánok();
				jedlo.smrť();
				++skóre;
			}
		}

		if (overKolízieTela()) zožralaNiečo = true;
		if (citlivéJedlo) presuňKolidujúceJedlá();
		upravHúsenicu(zožralaNiečo);
	}

	@Override public void stlačenieKlávesu()
	{
		switch (kláves())
		{
		case VPRAVO:
			hlava.uhlováRýchlosť(-30);
			break;

		case VĽAVO:
			hlava.uhlováRýchlosť(30);
			break;

		case MEDZERA:
			if (časovačAktívny()) zastavČasovač(); else spustiČasovač();
			break;

		case VK_A:
			automaticky = !automaticky;
			if (automaticky) smerNaJedlo(); else hlava.zrušCieľ(false);
			if (zobrazInformácie && !časovačAktívny()) prekresli();
			break;

		case VK_J:
			citlivéJedlo = !citlivéJedlo;
			if (citlivéJedlo) presuňKolidujúceJedlá();
			if (zobrazInformácie && !časovačAktívny()) prekresli();
			break;

		case VK_I:
			zobrazInformácie = !zobrazInformácie;
			if (!časovačAktívny()) prekresli();
			break;

		case VK_P:
			pohyblivéJedlo = !pohyblivéJedlo;
			reaktivujJedlá();
			if (zobrazInformácie && !časovačAktívny()) prekresli();
			break;

		case VK_S:
			zobrazSkóre = !zobrazSkóre;
			if (!časovačAktívny()) prekresli();
			break;

		case VK_C:
			citlivéCeléTelo = !citlivéCeléTelo;
			overKolízieTela();
			if (zobrazInformácie && !časovačAktívny()) prekresli();
			break;

		case VK_H:
			odhryzniSeba = !odhryzniSeba;
			if (zobrazInformácie && !časovačAktívny()) prekresli();
			break;

		case VK_U:
			smrťPoUhryznutí = !smrťPoUhryznutí;
			if (zobrazInformácie && !časovačAktívny()) prekresli();
			break;

		case VK_V:
			vyrovnajPoSmrti = !vyrovnajPoSmrti;
			if (zobrazInformácie && !časovačAktívny()) prekresli();
			break;

		case VK_F1:
			zobrazPomocníka = !zobrazPomocníka;
			if (!časovačAktívny()) prekresli();
			break;

		case VK_F11:
			if (celáObrazovka)
			{
				if (celáObrazovka(false))
					celáObrazovka = false;
			}
			else
			{
				if (celáObrazovka(true))
					celáObrazovka = true;
			}
			break;
		}
	}

	@Override public void uvoľnenieKlávesu()
	{
		switch (kláves())
		{
		case VPRAVO:
		case VĽAVO:
			hlava.uhlováRýchlosť(0);
			break;
		}
	}

	@Override public void stlačenieTlačidlaMyši()
	{
		hlava.aktivuj();
		hlava.cieľNaMyš(true, false);
	}

	@Override public void ťahanieMyšou()
	{
		hlava.aktivuj();
		hlava.cieľNaMyš(true, false);
	}

	@Override public void zmenaVeľkostiOkna()
	{
		presuňSkóre();
	}

	@Override public void kresliTvar()
	{
		spôsobKreslenia(KRESLI_PRIAMO);

		if (zobrazSkóre)
		{
			text("Skóre: " + skóre);
			odskoč(25);
		}

		if (zobrazInformácie)
		{
			String príznaky = "";

			if (automaticky) príznaky += "A";
			if (pohyblivéJedlo) príznaky += "P";
			if (citlivéJedlo) príznaky += "J";
			if (odhryzniSeba) príznaky += "H";
			if (citlivéCeléTelo) príznaky += "C";
			if (smrťPoUhryznutí) príznaky += "U";
			if (vyrovnajPoSmrti) príznaky += "V";

			if (!príznaky.isEmpty()) príznaky = "; " + príznaky;

			text("(Dĺžka: " + húsenica.dĺžka() + príznaky + ")");
			odskoč(25);
		}

		if (zobrazPomocníka)
		{
			riadokPomocníka("Húsenica sa dá ovládať kurzorovými šípkami " +
				"vľavo a vpravo alebo myšou.");
			riadokPomocníka("Najlepšie po vypnutí automatického režimu " +
				"(inak sa ovláda klávesnicou");
			riadokPomocníka("veľmi ťažko a myšou o málo ťažšie).");

			odskoč(8);
			riadokPomocníka("Na úpravu konfigurácie použite nasledujúce " +
				"klávesové skratky");
			riadokPomocníka("(v zátvorkách pri jednotlivých príznakoch sú " +
				"uvedené ich aktuálne stavy");
			riadokPomocníka("vo forme: +/−):");

			odskoč(8);
			riadokPomocníka("  A (" + (automaticky ? "+" : "−") + ") – " +
				"prepnutie automatického režimu");
			riadokPomocníka("  P (" + (pohyblivéJedlo ? "+" : "−") + ") – " +
				"prepnutie režimu pohyblivého jedla");
			riadokPomocníka("  J (" + (citlivéJedlo ? "+" : "−") + ") – " +
				"prepnutie režimu odumretia jedla, ktoré sa dostane do " +
				"kontaktu s telom");
			riadokPomocníka("  H (" + (odhryzniSeba ? "+" : "−") + ") – " +
				"prepnutie režimu odhryznutia vlastného tela");
			riadokPomocníka("  C (" + (citlivéCeléTelo ? "+" : "−") + ") – " +
				"prepnutie režimu citlivosti celého tela na kontakt so sebou");
			riadokPomocníka("  U (" + (smrťPoUhryznutí ? "+" : "−") + ") – " +
				"prepnutie režimu smrti po odhryznutí vlastného tela");
			riadokPomocníka("  V (" + (vyrovnajPoSmrti ? "+" : "−") + ") – " +
				"prepnutie režimu vyrovnania tela po smrti");

			odskoč(8);
			riadokPomocníka("  I – zobrazenie/skrytie informácií");
			riadokPomocníka("  S – zobrazenie/skrytie skóre");
			riadokPomocníka("  F1 – zobrazenie/skrytie pomocníka");
			riadokPomocníka("  F11 – prepnutie režimu celej obrazovky");
		}
	}

	private void riadokPomocníka(String text)
	{
		text(text);
		odskoč(20);
	}

	public static void main(String[] args)
	{
		použiKonfiguráciu("HlavnáTrieda.cfg");
		if (new HlavnáTrieda().celáObrazovka)
			celáObrazovka(true);
	}
}
obrázok obrázok

 
  

Novšia verzia

~

public class NáhodnýPrvok extends GRobot
{
	@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()));
	}
}

Novšia verzia

~

public class ŽivýPrvok extends NáhodnýPrvok
{
	public void smrť()
	{
		náhodnáPoloha();
		náhodnýSmer();
	}

	@Override public void aktivita()
	{
		if (polohaX() > Svet.pravýOkraj() ||
			polohaX() < Svet.ľavýOkraj() ||
			polohaY() > Svet.hornýOkraj() ||
			polohaY() < Svet.spodnýOkraj())
			smrť();
	}
}

Novšia verzia

~

public class Jedlo extends ŽivýPrvok
{
	private final static Farba farbaJedla = svetlozelená;

	public Jedlo()
	{
		farba(farbaJedla);
		zdvihniPero();
		rýchlosť(1, false);
		maximálnaUhlováRýchlosť(5);
		smrť();
	}

	@Override public void kresliTvar()
	{
		hrúbkaČiary(veľkosť() / 5.0);
		kružnica();
		kružnica(veľkosť() / 3.0);
	}
}

Novšia verzia

~

public class ČlánokTela extends ŽivýPrvok
{
	private final static Farba farbaČlánku = zelená;

	public ČlánokTela()
	{
		farba(farbaČlánku);
		zdvihniPero();
		náhodnáPoloha();
	}

	@Override public void kresliTvar()
	{
		hrúbkaČiary(veľkosť() / 5.0);
		kružnica();
	}

	@Override public void smrť()
	{
		aktivuj();
	}

	@Override public void aktivita()
	{
		if (veľkosť() > 1)
			veľkosť(veľkosť() - 1);
		else
		{
			skry();
			deaktivuj();
		}
	}
}

Novšia verzia

~

public class Hlava extends ŽivýPrvok
{
	private final static Farba farbaHlavy = zelená;

	public Hlava()
	{
		farba(farbaHlavy);
		zdvihniPero();
		veľkosť(15);
		rýchlosť(20, false);
		maximálnaUhlováRýchlosť(30);
	}

	@Override public void kresliTvar()
	{
		hrúbkaČiary(veľkosť() / 5.0);
		kružnica();

		vpravo(30);
		zdvihniPero();
		dopredu(veľkosť());
		položPero();
		dopredu(veľkosť() * 0.3);

		domov();
		vľavo(30);
		zdvihniPero();
		dopredu(veľkosť());
		položPero();
		dopredu(veľkosť() * 0.3);
	}
}

Novšia verzia

~

public class HlavnáTrieda extends GRobot
{
	private class TrúchliváHlava extends Hlava
	{
		@Override public void smrť()
		{
			--skóre;
			super.smrť();

			if (odoberČlánok())
			{
				if (plošnáSmrť)
				{
					GRobot hlavný = HlavnáTrieda.this;
					hlavný.smer(hlava.smer());
					hlavný.poloha(hlava.poloha());

					int dĺžka = hadík.dĺžka();
					for (int i = 1; i < dĺžka; ++i)
					{
						hlavný.dozadu(30);
						hadík.daj(i).poloha(hlavný.poloha());
					}

					presuňSkóre();
					hlavný.smer(90);
				}
				upravHadíka(true);
			}
		}
	}

	private final static Farba farbaPozadia = new Farba(110, 245, 135);

	private final Zoznam<ŽivýPrvok> hadík = new Zoznam<ŽivýPrvok>();
	private final Zoznam<ŽivýPrvok> zásoba = new Zoznam<ŽivýPrvok>();
	private final Zoznam<Jedlo> jedlá = new Zoznam<Jedlo>();

	private final Hlava hlava;

	private int skóre = 0;

	private boolean plošnáSmrť = false;
	private boolean automaticky = true;
	private boolean živéJedlo = true;
	private boolean svárlivéJedlo = true;
	private boolean reaktívneTelo = true;
	private boolean agresívnePožieranie = true;
	private boolean smrťHlave = false;

	private boolean zobrazSkóre = true;
	private boolean zobrazInformácie = false;
	private boolean celáObrazovka = false;

	private HlavnáTrieda()
	{
		super(Svet.šírkaZariadenia(0), Svet.výškaZariadenia(0));

		Svet.farbaPozadia(farbaPozadia);
		farba(tmavozelená);
		zdvihniPero();
		presuňSkóre();

		Svet.nekresli();

		hadík.pridaj(hlava = new TrúchliváHlava());
		for (int i = 0; i < 3; ++i)
			pridajČlánok();

		for (int i = 0; i < 150; ++i)
			jedlá.pridaj(new Jedlo());

		upravHadíka(true);
		reaktivujJedlá();

		hlava.aktivuj();
		Svet.kresli();

		new ObsluhaUdalostí()
		{
			@Override public void tik()
			{
				boolean zožralNiečo = false;

				for (Jedlo jedlo : jedlá)
				{
					if (jedlo.koliduje(hlava))
					{
						zožralNiečo = true;
						pridajČlánok();
						jedlo.smrť();
						++skóre;
					}
				}

				if (overKolízieTela()) zožralNiečo = true;
				if (svárlivéJedlo) presuňKolidujúceJedlá();
				upravHadíka(zožralNiečo);
			}

			@Override public void stlačenieKlávesu()
			{
				switch (ÚdajeUdalostí.kláves())
				{
					case Kláves.VPRAVO:
						hlava.uhlováRýchlosť(-30);
						break;

					case Kláves.VĽAVO:
						hlava.uhlováRýchlosť(30);
						break;

					case Kláves.MEDZERA:
						if (Svet.časovačAktívny())
							Svet.zastavČasovač();
						else
							Svet.spustiČasovač();
						break;

					case Kláves.VK_A:
						automaticky = !automaticky;
						if (automaticky) smerNaJedlo();
						else hlava.zrušCieľ(false);
						if (zobrazInformácie &&
							!Svet.časovačAktívny())
							Svet.prekresli();
						break;

					case Kláves.VK_S:
						svárlivéJedlo = !svárlivéJedlo;
						if (svárlivéJedlo)
							presuňKolidujúceJedlá();
						if (zobrazInformácie &&
							!Svet.časovačAktívny())
							Svet.prekresli();
						break;

					case Kláves.VK_D:
						zobrazInformácie =
							!zobrazInformácie;
						Svet.prekresli();
						break;

					case Kláves.VK_F:
						živéJedlo = !živéJedlo;
						reaktivujJedlá();
						if (zobrazInformácie &&
							!Svet.časovačAktívny())
							Svet.prekresli();
						break;

					case Kláves.VK_G:
						reaktívneTelo =
							!reaktívneTelo;
						overKolízieTela();
						if (zobrazInformácie &&
							!Svet.časovačAktívny())
							Svet.prekresli();
						break;

					case Kláves.VK_H:
						zobrazSkóre =
							!zobrazSkóre;
						Svet.prekresli();
						break;

					case Kláves.VK_J:
						agresívnePožieranie =
							!agresívnePožieranie;
						if (zobrazInformácie &&
							!Svet.časovačAktívny())
							Svet.prekresli();
						break;

					case Kláves.VK_K:
						plošnáSmrť = !plošnáSmrť;
						if (zobrazInformácie &&
							!Svet.časovačAktívny())
							Svet.prekresli();
						break;

					case Kláves.VK_L:
						smrťHlave = !smrťHlave;
						if (zobrazInformácie &&
							!Svet.časovačAktívny())
							Svet.prekresli();
						break;

					case Kláves.VK_F11:
						if (celáObrazovka)
						{
							if (Svet.celáObrazovka(false))
								celáObrazovka = false;
						}
						else
						{
							if (Svet.celáObrazovka(true))
								celáObrazovka = true;
						}
						break;
				}
			}

			@Override public void uvoľnenieKlávesu()
			{
				switch (ÚdajeUdalostí.kláves())
				{
					case Kláves.VPRAVO:
					case Kláves.VĽAVO:
						hlava.uhlováRýchlosť(0);
						break;
				}
			}

			@Override public void stlačenieTlačidlaMyši()
			{
				hlava.aktivuj();
				hlava.cieľNaMyš(true, false);
			}

			@Override public void ťahanieMyšou()
			{
				hlava.aktivuj();
				hlava.cieľNaMyš(true, false);
			}

			@Override public void zmenaVeľkostiOkna()
			{
				presuňSkóre();
			}
		};

		Svet.spustiČasovač(0.100);
	}

	private void presuňSkóre()
	{
		skočNa(Svet.ľavýOkraj() + 50,
			Svet.hornýOkraj() - 20);
	}

	private boolean odoberČlánok()
	{
		if (hadík.dĺžka() > 1)
		{
			ŽivýPrvok presuň = hadík.posledný();
			presuň.smrť();

			hadík.odober(presuň);
			zásoba.pridaj(presuň);
			return true;
		}

		return false;
	}

	private void pridajČlánok()
	{
		boolean nenájdené = true;

		if (zásoba.počet() > 0)
		{
			for (ŽivýPrvok presuň : zásoba)
			{
				if (presuň.skrytý())
				{
					presuň.zobraz();

					zásoba.odober(presuň);
					hadík.pridaj(presuň);
					nenájdené = false;
					break;
				}
			}
		}

		if (nenájdené) hadík.pridaj(new ČlánokTela());

		if (hadík.počet() > 2)
		{
			ŽivýPrvok telo1 = hadík.daj(hadík.dĺžka() - 3);
			ŽivýPrvok telo2 = hadík.daj(hadík.dĺžka() - 2);
			ŽivýPrvok telo3 = hadík.daj(hadík.dĺžka() - 1);
			telo3.skočNa(telo2);
			telo3.otočNa(telo1);
			telo3.dozadu(30);
		}
	}

	private void smerNaJedlo()
	{
		int početJedál = jedlá.počet();
		Jedlo najbližšie = jedlá.daj(0);
		double vzdialenosť = hlava.vzdialenosťK(najbližšie);

		for (int i = 1; i < početJedál; ++i)
		{
			Jedlo jedlo = jedlá.daj(i);
			double porovnaj = hlava.vzdialenosťK(jedlo);

			if (porovnaj < vzdialenosť)
			{
				najbližšie = jedlo;
				vzdialenosť = porovnaj;
			}
		}

		hlava.cieľ(najbližšie, true, false);
	}

	private void upravHadíka(boolean ajVeľkosti)
	{
		int dĺžka = hadík.dĺžka();

		if (ajVeľkosti)
		{
			double veľkosťHlavy = hlava.veľkosť();
			double veľkosťChvosta = veľkosťHlavy / 2.0;
			double t = 0.0, Δt = 1.0 / (double)(dĺžka - 1);

			for (int i = 1; i < dĺžka; ++i)
			{
				hadík.daj(i).veľkosť(Svet.lineárnaInterpolácia(
					veľkosťHlavy, veľkosťChvosta, t));
				t += Δt;
			}

			naVrch();

			if (automaticky) smerNaJedlo();
			else hlava.zrušCieľ(false);
		}

		for (int i = 1; i < dĺžka; ++i)
		{
			ŽivýPrvok článok0 = hadík.daj(i - 1);
			ŽivýPrvok článok1 = hadík.daj(i);
			článok1.otočNa(článok0);
			článok1.skočNa(článok0);
			článok1.dozadu(článok0.veľkosť() + článok1.veľkosť());
		}
	}

	private void presuňKolidujúceJedlá()
	{
		for (Jedlo jedlo : jedlá)
			for (ŽivýPrvok článok : hadík)
				if (jedlo.koliduje(článok))
					jedlo.smrť();
	}

	private void reaktivujJedlá()
	{
		if (živéJedlo)
			for (Jedlo jedlo : jedlá)
				jedlo.aktivuj();
		else
			for (Jedlo jedlo : jedlá)
				jedlo.deaktivuj();
	}

	private boolean overKolízieTela()
	{
		int dĺžka2 = hadík.dĺžka();
		int dĺžka1 = reaktívneTelo ? dĺžka2 : 1;
		boolean zomrel = false;

		koniec:
		for (int i = 0; i < dĺžka1; ++i)
		{
			for (int j = i + 2; j < dĺžka2; ++j)
			{
				ŽivýPrvok článok1 = hadík.daj(i);
				ŽivýPrvok článok2 = hadík.daj(j);
				if (článok1.koliduje(článok2))
				{
					if (agresívnePožieranie)
					{
						skóre -= dĺžka2 - j - 2;
						for (int k = j + 1; k < dĺžka2; ++k)
							odoberČlánok();
					}

					zomrel = true;
					if (smrťHlave) hlava.smrť();

					break koniec;
				}
			}
		}

		return zomrel;
	}

	@Override public void kresliTvar()
	{
		if (zobrazSkóre)
		{
			text("Skóre: " + skóre);
			zdvihniPero();
			dozadu(20);
		}

		if (zobrazInformácie)
		{
			String príznaky = "";

			if (automaticky) príznaky += "Au";
			if (živéJedlo) príznaky += "Ž";
			if (svárlivéJedlo) príznaky += "S";
			if (reaktívneTelo) príznaky += "R";
			if (agresívnePožieranie) príznaky += "Ag";
			if (plošnáSmrť) príznaky += "P";
			if (smrťHlave) príznaky += "H";

			if (!príznaky.isEmpty())
			{
				príznaky = "; " + príznaky;
				zdvihniPero();
				posuňVpravo(5 * príznaky.length());
			}

			text("(Dĺžka: " + hadík.dĺžka() + príznaky + ")");
		}
	}

	public static void main(String[] args)
	{
		Svet.použiKonfiguráciu();
		new HlavnáTrieda();
	}
}