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

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

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

Dátum: 12. 9. 2018, pred niekoľkými rokmi, aktualizované: 20. 4. 2020, pred štyrmi rokmi

Tento projekt nadväzuje na dva staršie projekty: HadíkHúsenica. (Rieši túto problematiku mierne odlišným spôsobom.)

 

obrázok

 
  

~

import knižnica.Farba;
import knižnica.GRobot;

public class Jedlo extends GRobot
{
	private double polomer1, polomer2, polomer3;

	public Jedlo(Farba farba)
	{
		this(farba, 10);
	}

	public Jedlo(Farba farba, double veľkosť)
	{
		farba(farba);
		náhodnáPoloha();
		veľkosť(veľkosť);
		skry();
	}

	@Override public void veľkosť(double nová)
	{
		super.veľkosť(nová);
		hrúbkaČiary(nová * 0.120);
		polomer1 = nová * 1.000;
		polomer2 = nová * 0.667;
		polomer3 = nová * 0.333;
	}

	@Override public void kresliTvar()
	{
		skoč(0.5, 0.5);
		kružnica(polomer1);
		kružnica(polomer2);
		kružnica(polomer3);
	}
}

~

import knižnica.Farba;
import knižnica.GRobot;

public class ČlánokTela extends GRobot
{
	private final static Farba farbaČlánku = tmavohnedá;
	private double pätina = 2.0;

	public ČlánokTela()
	{
		farba(farbaČlánku);
		hrúbkaČiary(pätina);
	}

	@Override public void kresliTvar()
	{
		kružnica();
		odskoč(pätina);
		vpred(2 * pätina);
	}
}

~

import knižnica.Farba;
import knižnica.GRobot;

public class Hlava extends GRobot
{
	private final static Farba farbaHlavy = svetlohnedá;

	private double úsek1, úsek2, úsek3;
	private double dĺžka, polomer;

	public Hlava()
	{
		farba(farbaHlavy);
		zdvihniPero();
		veľkosť(15);
		ohranič();
	}

	@Override public void veľkosť(double nová)
	{
		super.veľkosť(nová);
		úsek1   = veľkosť() * 0.5;
		úsek2   = veľkosť() * 0.1;
		úsek3   = veľkosť() * 0.4;
		dĺžka   = veľkosť() * 0.3;
		polomer = veľkosť() * 0.2;
	}

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

		vpravo(30);
		skoč(úsek1); vpred(úsek2); skoč(úsek3);
		vpred(dĺžka); kruh(polomer);

		domov();

		vľavo(30);
		skoč(úsek1); vpred(úsek2); skoč(úsek3);
		vpred(dĺžka); kruh(polomer);
	}
}

~

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 Červík extends GRobot
{
	private final static Farba farbaPozadia = svetláNebeská;
	private final static Farba farbaJedla = new Farba(68, 128, 122);
	private final static Farba farbaSpomaľovača = new Farba(8, 153, 34);
	private final static Farba farbaZrýchľovača = new Farba(245, 12, 24);
	private final static Farba farbaSkracovača = new Farba(24, 12, 245);

	private final static int SKÓRE_ZA_JEDLO = 5;
	private final static int SKÓRE_ZA_SPOMAĽOVAČ = -2;
	private final static int SKÓRE_ZA_ZRÝCHĽOVAČ = 10;
	private final static int SKÓRE_ZA_SKRACOVAČ = -1;

	private final Zoznam<GRobot> hadík = new Zoznam<>();

	private final Hlava hlava;
	private final Jedlo jedlo;
	private final Jedlo spomaľovač;
	private final Jedlo zrýchľovač;
	private final Jedlo skracovač;

	private double intervalČasovača = 0.1;
	private int skóre = 0;
	private int počítadloObnovy = 0;

	private Červík()
	{
		farbaPozadia(farbaPozadia);
		zbaľ();
		vystreď();

		skry();

		hlava = new Hlava();
		hadík.pridaj(hlava);

		jedlo = new Jedlo(farbaJedla);
		jedlo.zobraz();

		spomaľovač = new Jedlo(farbaSpomaľovača, 12);
		zrýchľovač = new Jedlo(farbaZrýchľovača, 8);
		skracovač = new Jedlo(farbaSkracovača, 15);

		for (int i = 0; i < 3; ++i) pridajČlánok();

		spustiČasovač(intervalČasovača);
	}

	private void skráť()
	{
		if (hadík.veľkosť() > 13)
		{
			int skrátené = 0;
			for (int i = hadík.veľkosť() - 1; i > 3; --i)
			{
				GRobot r = hadík.daj(i);
				if (r.viditeľný())
				{
					++skrátené;
					r.skry();
					if (skrátené >= 10) return;
				}
			}
		}
	}

	private void pridajČlánok()
	{
		if (hadík.prázdny()) return;

		int posledný = hadík.veľkosť() - 1;
		for (int i = 0; i <= posledný; ++i)
		{
			GRobot r = hadík.daj(i);

			if (!r.viditeľný())
			{
				r.zobraz();
				return;
			}
		}

		hadík.pridaj(new ČlánokTela());
		if (++posledný > 1)
		{
			hadík.daj(posledný).skočNa(hadík.daj(posledný - 1));
			hadík.daj(posledný).otoč(hadík.daj(posledný - 1));
		}
	}

	@Override public void tik()
	{
		vymažGrafiku();
		skočNa(pravýOkraj() - 80, hornýOkraj() - 20);
		text("Skóre: " + skóre);

		int náhodnéČíslo = (int)náhodnéCeléČíslo(100);

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

		hlava.dopredu(20);

		if (jedlo.koliduje(hlava))
		{
			jedlo.náhodnáPoloha();
			pridajČlánok();
			skóre += SKÓRE_ZA_JEDLO;
			počítadloObnovy = 0;

			if (náhodnéČíslo >= 0 && náhodnéČíslo <= 40 &&
				!spomaľovač.viditeľný())
			{
				spomaľovač.zobraz();
				spomaľovač.náhodnáPoloha();
			}

			if (náhodnéČíslo >= 33 && náhodnéČíslo <= 66 &&
				!zrýchľovač.viditeľný())
			{
				zrýchľovač.zobraz();
				zrýchľovač.náhodnáPoloha();
			}

			if (náhodnéČíslo >= 60 && náhodnéČíslo <= 100 &&
				!skracovač.viditeľný())
			{
				skracovač.zobraz();
				skracovač.náhodnáPoloha();
			}
		}

		if (spomaľovač.viditeľný() && spomaľovač.koliduje(hlava))
		{
			skóre += SKÓRE_ZA_SPOMAĽOVAČ;

			if (intervalČasovača < 0.1)
				intervalČasovača += 0.01;

			spomaľovač.skry();
			spustiČasovač(intervalČasovača);
		}

		if (zrýchľovač.viditeľný() && zrýchľovač.koliduje(hlava))
		{
			skóre += SKÓRE_ZA_ZRÝCHĽOVAČ;

			if (intervalČasovača > 0.04)
				intervalČasovača -= 0.01;

			zrýchľovač.skry();
			spustiČasovač(intervalČasovača);
		}

		if (skracovač.viditeľný() && skracovač.koliduje(hlava))
		{
			skóre += SKÓRE_ZA_SKRACOVAČ;
			skráť();
			skracovač.skry();
		}

		if (počítadloObnovy >= 200)
		{
			počítadloObnovy = 0;
			spomaľovač.skry();
			zrýchľovač.skry();
			skracovač.skry();
		}
		else ++počítadloObnovy;
	}

	@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;
		}
	}

	@Override public void stlačenieTlačidlaMyši()
	{
		hlava.otočNaMyš();
	}

	@Override public void ťahanieMyšou()
	{
		hlava.otočNaMyš();
	}

	public static void main(String[] args)
	{
		nekresli();
		new Červík();
		kresli();
	}
}