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

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

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

Dátum: 4. 8. 2018, pred niekoľkými rokmi, aktualizované: 2. 12. 2019, pred piatimi rokmi

Tento krátky projekt je postavený na hre života od Cambridga Johna Conwaya. Ide o bunkový automat. Bunkový automat (Záthurecký, 2006; Codd, 1968) je diskrétny model pozostávajúci z konečných automatov (buniek), ktoré sú uložené v určitej štruktúre. Najčastejšie v mriežke. Každá bunka mení svoj stav v závislosti od svojho pôvodného stavu a od stavov susedných buniek.

Táto „hra“ sa skladá zo súboru buniek, ktoré môžu „žiť,“ „zomrieť“ alebo „sa rozmnožiť“ riadiac sa množinou matematických pravidiel. Bunky vytvárajú počas hry rôzne vzory.

Ďalším bunkovým automatom je lesný požiar.

~


// See: https://bitstorm.org/gameoflife/
// -------------------------------------
// The Rules:
//   For a space that is “populated”:
//      Each cell with one or no neighbors dies, as if by solitude.
//      Each cell with four or more neighbors dies, as if by overpopulation.
//      Each cell with two or three neighbors survives.
//   For a space that is “empty” or “unpopulated”:
//      Each cell with three neighbors becomes populated.

// Pravidlá:
//   Pre bunky, ktoré sú osídlené („živé“):
//      Bunka, ktorá má jedného alebo nemá žiadneho suseda, zomrie na osamelosť.
//      Bunka so štyrmi alebo viacerými susedmi zomrie na preľudnenie.
//      Bunka s dvomi alebo tromi susedmi prežije.
//   Pre bunky, ktoré sú neosídlené („mŕtve“):
//      Bunka s tromi susedmi bude osídlená.

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

import static knižnica.Svet.*;
import static java.lang.Math.*;

public class Život extends GRobot
{
	private final static char ŽIVÁ  = 'O';
	private final static char MŔTVA = '.';

	private double HUSTOTA_OSÍDLENIA = 0.040;

	private int šírka, výška;
	private char bunky[][][];

	private int v1 = 0, v2 = 1; // (vrstvy buniek)

	private void inicializuj(int nováŠírka, int nováVýška)
	{
		if (nováŠírka > 10) šírka = nováŠírka; else šírka = 10;
		if (nováVýška > 10) výška = nováVýška; else výška = 10;

		bunky = new char[3][výška][šírka];

		for (int i = 0; i < výška; ++i)
		{
			for (int j = 0; j < šírka; ++j)
			{
				if (random() < HUSTOTA_OSÍDLENIA)
				{
					bunky[v1][i][j] = ŽIVÁ;
					bunky[2][i][j] = (char)(farby.length - 1);
				}
				else
				{
					bunky[v1][i][j] = MŔTVA;
					bunky[2][i][j] = 0;
				}
			}
		}
	}

	private Farba[] farby =
		{
			čierna,
			tmavožltá.tmavšia(0.80),
			žltá.tmavšia(0.80),
			svetložltá.tmavšia(0.80),
			tmavožltá,
			žltá,
			svetložltá,
			svetložltá.svetlejšia(0.90),
		};

	private Život()
	{
		super(610, 610);
		skry();
		nekresli();
		farbaPozadia(antracitová);
		inicializuj(200, 200);
		vypĺňajTvary();
		veľkosť(3);
		spustiČasovač(0.050);
		aktivuj();
	}

	private int početŽivých(int a, int b)
	{
		int c = a > 0 ? a - 1 : a;
		int d = a < (výška - 1) ? a + 1 : a;

		int e = b > 0 ? b - 1 : b;
		int f = b < (šírka - 1) ? b + 1 : b;

		int počet = 0;
		
		for (int i = c; i <= d; ++i)
			for (int j = e; j <= f; ++j)
				// Tu môžeme optimalizovať výpočtovú zložitosť ignorovaním
				// časti podmienky: (a != i || b != j), ale musíme s tým rátať
				// v aktivite nižšie pri počítaní živých.
				if (ŽIVÁ == bunky[v1][i][j]) ++počet;

		return počet;
	}

	@Override public void aktivita()
	{
		vymažGrafiku();
		Bod poloha = poloha();
		preskoč((šírka - 1) * (veľkosť() / 2.0),
			(výška - 1) * (veľkosť() / 2.0));

		for (int i = 0; i < výška; ++i)
		{
			for (int j = 0; j < šírka; ++j)
			{
				int počet = početŽivých(i, j);

				if (ŽIVÁ == bunky[v1][i][j])
				{
					// Keďže sme v počte živých optimalizovali, táto podmienka
					// sa zmení z (počet < 2 || počet > 3) na:
					if (počet < 3 || počet > 4)
						bunky[v2][i][j] = MŔTVA;
					else
						bunky[v2][i][j] = ŽIVÁ;
				}
				else
				{
					if (počet > 2)
						bunky[v2][i][j] = ŽIVÁ;
					else
						bunky[v2][i][j] = MŔTVA;
				}

				if (ŽIVÁ == bunky[v2][i][j] &&
					bunky[2][i][j] < farby.length - 1)
					++bunky[2][i][j];
				else if (MŔTVA == bunky[v2][i][j] &&
					bunky[2][i][j] > 0)
					--bunky[2][i][j];

				farba(farby[bunky[2][i][j]]);
				štvorec();
				preskočVľavo();
			}
			odskoč();
			preskočVpravo(veľkosť() * šírka);
		}

		poloha(poloha);

		// Prepnutie vrstiev (buniek):
		if (0 == v1)
		{
			v1 = 1;
			v2 = 0;
		}
		else
		{
			v1 = 0;
			v2 = 1;
		}

		prekresli();
	}

	public static void main(String[] args)
	{
		použiKonfiguráciu("Život.cfg");
		new Život();
	}
}

Výsledok

obrázok