Hra života (Game of Life)



Podobné dokumenty
Zadání soutěžních úloh

Zadání soutěžních úloh

Návrh fakultního znaku PřF UK

Dokumentace programu piskvorek

Dynamické kritické jevy

Zadání maturitní práce ve školním roce 2016/2017

Buněčné automaty a mřížkové buněčné automaty pro plyny. Larysa Ocheretna

Zadání soutěžních úloh

STATISTICA Téma 6. Testy na základě jednoho a dvou výběrů

2. úkol MI-PAA. Jan Jůna (junajan)

Celulární automaty (CA) a jejich aplikace. Samoorganizace Vlastnosti CA Samoorganizovaná kritikalita Vývoj rozhraní

VISUAL BASIC. Přehled témat

NP-úplnost problému SAT

Zadání semestrálního projektu Algoritmy II. letní semestr 2017/2018

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

Administrace webu Postup při práci

Hodnocení soutěžních úloh

Úvodem... 9 Kapitola 1 Karetních

MS EXCEL 2010 ÚLOHY. Vytvořte tabulku podle obrázku, která bude provádět základní matematické operace se dvěma zadanými čísly a a b.

Martina Husáková. Celulární automaty. Znalostní technologie III materiál pro podporu studia

Hodnocení soutěžních úloh

6. ROČNÍK ŠKOLNÍ SOUTĚŽE V PROGRAMOVÁNÍ 2013

Úvod do počítačových sítí

Úvod Teorie Studium CA Aplikace Souvislosti. Radek Pelánek

Hledání správné cesty

Algoritmizace a programování

Microsoft Excel kopírování vzorců, adresování, podmíněný formát. Mgr. Jan Veverka Střední odborná škola sociální Evangelická akademie

PROJEKT MINY - DOKUMENTACE

První cestou, jak vynechat jakákoliv data v grafu, je jejich skrytí, ať už přímo či filtrem aplikovaným na řádcích.

Obsah. Proč právě Flash? 17 Systémové požadavky 17. Jak používat tuto knihu 18 Doprovodný CD-ROM 19

II. Úlohy na vložené cykly a podprogramy

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

PÁS KARET. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Kajot Casino Ltd. Popis hry Joker 27

Kajot Casino Ltd. Popis hry Big Apple

Zadání semestrálního projektu Algoritmy I. zimní semestr 2018/2019

Sada 2 Microsoft Word 2007

RadioBase 3 Databázový subsystém pro správu dat vysílačů plošného pokrytí

2. Svoje řešení pojmenujte podle čísel zadání úloh: uloha1.sgpbprj uloha4.sgpbprj

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Pointery II. Jan Hnilica Počítačové modelování 17

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

Vytvoření uživatelské šablony

I. Příprava dat Klíčový význam korektního uložení získaných dat Pravidla pro ukládání dat Čištění dat před analýzou

59. ročník Matematické olympiády 2009/2010

2 Datové typy v jazyce C

Bakalářky. Cyril Brom

Tabulkový procesor. Základní rysy

PROGRAM RP45. Vytyčení podrobných bodů pokrytí. Příručka uživatele. Revize Pragoprojekt a.s

Systém je citlivý na velikost písmen CASE SENSITIVE rozeznává malá velká písmena, např. PROM=1; PROm=1; PRom=1; Prom=1; prom=1; - 5 různých proměnných

Zadání soutěžních úloh

Obsah. Několik slov o Excelu 2007 a Operace při otvírání a ukládání sešitu 15. Operace s okny 27. Kapitola 1

Martin Milata, Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už je od

5 Vícerozměrná data - kontingenční tabulky, testy nezávislosti, regresní analýza

Digitální učební materiál

DATABÁZE A SYSTÉMY PRO UCHOVÁNÍ DAT 61 DATABÁZE - ACCESS. (příprava k vykonání testu ECDL Modul 5 Databáze a systémy pro zpracování dat)

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Operační výzkum. Síťová analýza. Metoda CPM.

Definice 13.1 Kvadratická forma v n proměnných s koeficienty z tělesa T je výraz tvaru. Kvadratická forma v n proměnných je tak polynom n proměnných s

OFFICE MS EXCEL SEZNÁMENÍ S PROGRAMEM

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

NPRG030 Programování I, 2015/16 1 / :25:32

Objektově orientované programování v jazyce Python

Naproti tomu gramatika je vlastně soupis pravidel, jak

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

NAPOJENÍ ZAŘÍZENÍ S KOMUNIKACÍ BELIMO MP-BUS NA SÍŤ AUTOMATŮ MICROPEL

programátorský manuál

Tabulkový kalkulátor. Tabulkový kalkulátor. LibreOffice Calc 12.část

Geis Point Plugin Map

Ovládání Open Office.org Calc Ukládání dokumentu : Levým tlačítkem myši kliknete v menu na Soubor a pak na Uložit jako.

MS EXCEL 2010 ÚLOHY. Vytvořte tabulku podle obrázku, která bude provádět základní matematické operace se dvěma zadanými čísly a a b.

Program pro tvorbu technických výpočtů. VIKLAN - Výpočty. Uživatelská příručka. pro seznámení se základními možnostmi programu. Ing.

Pohled do nitra mikroprocesoru Josef Horálek

5 Evidence manželských smluv

KNIHOVNA MODELŮ TECHNOLOGICKÝCH PROCESŮ

Kajot Casino Ltd. Popis hry Halloween King

ALGORITMIZACE A PROGRAMOVÁNÍ

KOMPLEXNÍ VZDĚLÁVÁNÍ KATEDRA STROJNÍ SPŠSE a VOŠ LIBEREC

Průvodce aplikací FS Karta

Vícerozměrná pole. Inicializace pole

Základy programování (IZP)

Úvod do teorie grafů

Programování v jazyce C a C++

1. Témata maturitních prací. 2. Termín závazného zadání maturitní práce. 3. Termín odevzdání maturitní práce. 4. Kritéria hodnocení maturitní práce

xrays optimalizační nástroj

MS Excel makra a VBA

1. Od Scheme k Lispu

pi Ludolfovo číslo π = 3,14159 e Eulerovo číslo e = 2,71828 (lze spočítat jako exp(1)), např. je v Octave, v MATLABu tato konstanta e není

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

M4 PDF rozšíření. Modul pro PrestaShop.

Úvod Teorie Studium CA Aplikace Souvislosti. Radek Pelánek

Regionální kolo soutěže Mladý programátor 2012, kategorie A, B

Generické programování

Kajot Casino Ltd. Popis hry Crazy Fruits

Úvod do informatiky. Miroslav Kolařík

RIBTEC RIBcad ZEICON Newsletter

State Space Search Step Run Editace úloh Task1 Task2 Init Clear Node Goal Add Shift Remove Add Node Goal Node Shift Remove, Add Node

VSTUPNÍ BRÁNY VÝSTAVIŠTĚ PRAHA

Transkript:

Hra života (Game of Life) Vojtěch Brtník Zápočtový program z předmětu NPRG005 Neprocedurální programování Akademický rok 2008/2009 letní semestr

Obsah 1 Uživatelská dokumentace 3 1.1 Hra života.............................. 3 1.2 Vstup................................ 4 1.3 Výstup................................ 4 1.4 Varianty hry............................. 4 1.5 Volání programu.......................... 5 2 Programátorská dokumentace 5 2.1 Reprezentace hrací plochy..................... 5 2.2 Reprezentace přechodové funkce.................. 5 2.3 Výpočet............................... 6 3 Dodatek A, Seznam funkcí 6 4 Dodatek B, Testovací data 8 2

1 Uživatelská dokumentace Cíl. Naprogramujte v jazyce Prolog simulaci Hry života, resp. jednu její variantu s možností drobné konfigurace. Program bude kompletně v češtině, včetně zdrojového kódu. 1.1 Hra života Hra života byla představena v roce 1970 Johnem Conwayem a někdy se jí proto také říká Conway s Game of Life. Ve skutečnosti se jedná o konečný celulární automat. Výpočet je neinteraktivní, probíhá bez aktivní účasti hráče a je závislý pouze na vstupních parametrech. Ve 2-D variantě této hry, kterou se my budeme zabývat, se simulace odvíjí na obdélníkové mřížce, kterou si je možno představit jako čtverečkovaný papír. V každé buňce se může, a nemusí nacházet živá bytost, přičemž v kroku hry dojde v každé buňce k právě jedné z následujících čtyř možností: živá bytost zemře, živá bytost přežije, v prázdné buňce se narodí nová bytost, nebo buňka zůstane prázdná. Která z těchto možností nastane je určeno jednak momentální obsazeností dané buňky, ale také počtem obsazených buněk v přímém sousedství (každá neokrajová buňka má osm sousedů). Hra je motivována takto: pokud je sousedů příliš málo, buňka zemře na osamění. Pokud je sousedů přiměřeně, buňka přežije nebo se dokonce narodí nová. Pokud je sousedů příliš, buňka zemře na přelidnění. Při vhodném počátečním rozmístění živých bytostí a volbě kritických konstant osamění, přelidnění a narození se prostředí chová velmi nečekaně a vytváří obrazce, díky kterým je Hra života známá. Na okrajích mají buňky menší počet sousedů, a proto se chovají odlišně, než uprostřed hracího pole. Pojďme se na hru podívat jako na konečný automat. Kritické konstanty určují přechodovou funkci, v závislosti na nich se totiž rozhodne, do jakého stavu se buňka v každém kroku přesune. Počáteční stav je dán seznamem obsazených buněk na začátku hry. Množina všech stavů je dána všemi možnými kombinacemi (ne)obsazenosti buněk, do kterých se teoreticky může výpočet dostat. Protože každé políčko je vždy buď obsazené, nebo neobsazené, je počet možných stavů celé mřížky 2 Počet sloupců Počet Řádků. Automat je deterministický. Množina koncových stavů automatu je prázdná. 3

1.2 Vstup 1. počet sloupců hrací mřížky 2. počet řádků hrací mřížky 3. seznam obsazených buněk v počátečním stavu, buňka se adresuje dvojicí [sloupec, řádek] 4. počet generací, které mají být spočítány a vytisknuty na obrazovku 5. konstanty udávající počet sousedů, při kterých se v neobsazené buňce narodí buňka nová 6. konstanty udávající počet sousedů, při kterých obsazená buňka nezahyne 1.3 Výstup Výstupem je výpis jednotlivých generací na obrazovku. Programování v jazyce Prolog bohužel není příliš interaktivní a ani rozhraní není děláno pro krásu. Tomu také odpovídá výstup našeho programu. Čtenář si s tím musí poradit sám. Obvyklým postupem bývá zpracování výsledků Prologu nějakým procedurálním jazykem a jejich zobrazení v přívětivější podobě. Tímto se zde ale zabývat nebudeme. 1.4 Varianty hry Standardní a nejvíce prozkoumanou variantou je situace, v níž jsou konstanty rozděleny následovně: V neobsazené buňce se narodí nová bytost právě tehdy, když je počet obsazených sousedů roven třem. Bytost v buňce přežije, pokud je počet obsazených sousedů roven dvěma nebo třem. V ostatních případech tedy buňka zůstane neobsazená, případně živá bytost zahyne. Hra má mnoho modifikací a čtenář se může setkat se spoustou variant. Pro ilustraci uveďme například: Vícerozměrná varianta na unitárním prostoru "X n " (zjednodušeně). Varianta, kde si buňky pamatují historii a jejich přežití je závislé na tom, jak vypadala situace v několika předchozích generacích. Varianta, v níž hra neprobíhá na dvourozměrné ploše, ale na ploše vyšší dimenze, například tedy na kouli, toru či kleinově láhvi. 4

Žádná z těchto modifikací ale nedoznala takové slávy a úspěchu jako základní, či chcete-li standardní varianta popsaná výše. 1.5 Volání programu Kořenový predikát life se volá s parametry, jak bylo popsáno v sekci Vstup. 2 Programátorská dokumentace Jednotlivé funkce jsou velmi detailně komentovány ve zdrojovém textu, včetně vstupních a výstupních parametrů. vysokoúrovňová funkce je jedna a byla zmíněna v uživatelské dokumentaci. Zde pouze nastíníme celkovou architekturu programu a v dodatku připojíme výpis zdrojového kódu. Program je ve výsledku velmi procedurální a není příliš ukázkovým a typickým příkladem pro jazyk Prolog. Nevyhneme se situacím, kdy musí být hrací pole několikrát procházeno v cyklu, či if-else konstrukcím. 2.1 Reprezentace hrací plochy Jedna buňka je reprezentována kartézskými souřadnicemi, dvouprvkovým seznamem ve formátu [Sloupec, Řádek]. Hrací plocha je určena svými rozměry a seznamem obsazených buněk. Není nijak setříděna. Její setřídění a následné programování s ohledem na toto by snížilo asymptotickou složitost, může to být námět na následné vylepšení programu. Prozatím jsme, vzhledem k tomu, že hra probíhá často na velmi malé ploše a pro enormní plochy nemá valný smysl, od třídění upustili. Výhoda neprocedurálního jazyka a výše popsané reprezentace je zřejmá. Není potřeba kontrolovat přetečení hrací plochy či speciálně ošetřovat kraje a rohy. 2.2 Reprezentace přechodové funkce Přechodová funkce je definována dvěma seznamy. Seznam Narození ovlivňuje mrtvé buňky; udává kolik musí mít daná buňka aktivních sousedů, aby se v ní mohla narodit živá bytost. Tedy počet aktivních sousedů musí být libovolné číslo ze zmíněného seznamu. V opačném případě se neaktivní buňka nestane aktivní. Druhým seznamem je Život, ten definuje stavový přechod pro živé buňky. Udává, kolik musí mít daná buňka aktivních sousedů, aby přežila. Jinak zemře. Výskyt v těchto seznamech se vyhledává pomocí funkcí konfiguracenarozeni, konfiguraceposmrti, konfiguracezivot, konfiguraceumreni. Ty volají jed- 5

noduché funkce vseznamu a vseznamuneni. Samotné testování podmínky pak zajišťují funkce testnarozeni, testposmrti, testzivota a testumreni. Celý blok zastřešuje funkce generacepolicka. 2.3 Výpočet Výpočet je přímočarý. Pro každou buňku hrací plochy vygenerujeme jejich osm sousedů (funkce pocetsousedu) a podíváme se, kolik z těchto osmi sousedů je obsazených (funkce spoctizive). Na základě uživatelem nastavených kritických konstant pak rozhodneme, co s buňkou budeme dělat (funkce umri, narod) a provedeme jednu ze čtyř přechodových akcí, jak bylo popsáno v uživatelské dokumentaci. Tento postup opakujeme pro každou buňku hracího pole (funkce generacepolicka) a pak znova pro každou novou generaci (funkce dalsigenerace). Po výpočtu každé generace vytiskneme výstup (funkce tiskni) 3 Dodatek A, Seznam funkcí Seznam funkcí a jejich stručný popis. V dodatku chybí diakritika, neboť jde o kopie zdrojového kódu. life(+sloupce, +Radky, +Mrizka, +PocetGeneraci, +Narozeni, +Zivot) hraje hru Game of Life, Spocita a vytiskne prvnich PocetGeneraci generaci. hraje se na Mrizce, ktera ma rozmery Sloupce x Radky a prechodova funkce je dana polem Narozeni a Zivot dalsigenerace/6(+mrizka, +Sloupce, +Radky, -MrizkaNova, Narozeni, Zivot) dalsigenerace/8(+[sloupec,radek], +PocetSloupcu, +PocetRadku, +TestMrizka,...) spocita dalsi generaci zivota pro vsechny policka v Mrizce vraci MrizkuNova generacepolicka(+[sloupec, Radek], +TestMrizka, +StaraMrizka, -NovaMrizka) spocita dalsi generaci policka [Sloupec,Radek] pro testovani poctu sousedu pouziva TestMrizku pro urceni stavu policka pouziva StarouMrizku po zmene stavu policka je vracena NovaMrizka vseznamu(+prvek, +Seznam) naprosto obecny predikat, ktery uspeje, pokud Prvek je v Seznamu. vseznamuneni(+prvek, Seznam) naprosto obecny predikat, ktery uspeje, pokud Prvek v Seznamu neni konfiguracenarozeni(+pocetsousedu, Narozeni) zjisti, jestli cislo PocetSousedu je v seznamu Narozeni. Selze, pokud neni. 6

konfiguraceposmrti(+pocetsousedu, Narozeni) uspeje, pokud cislo PocetSousedu se nenachazi v seznamu narozeni. Selze, pokud se nachazi. konfiguracezivot(+pocetsousedu, Zivot) zjisti, jestli cislo PocetSousedu je v seznamu zivot. Selze pokud neni. konfiguraceumreni(+pocetsousedu, Zivot) uspeje, pokud cislo PocetSousedu se nenachazi v seznamu Zivot. Selze, pokud se nachazi. testnarozeni(+[sloupec,radek], +Mrizka, +Narozeni) otestuje, jestli mrtva bunka na miste [Sloupec, Radek] v Mrizce nema byt narozena Narozeni udava konfiguraci seznamu Narozeni testposmrti(+[sloupec,radek], +Mrizka, +Narozeni) otestuje, jestli mrtva bunka na miste [Sloupec, Radek] v Mrizce ma byt nadale mrtva Narozeni udava konfiguraci seznamu Narozeni testzivota(+[sloupec,radek], +Mrizka, +Zivot) otestuje, jestli ziva bunka na miste [Sloupec, Radek] v Mrizce ma nadale zit Zivot udava konfiguraci seznamu Zivot testumreni(+[sloupec,radek], +Mrizka, +Zivot) otestuje, jestli ziva bunka na miste [Sloupec,Radek] v Mrizce ma umrit Zivot udava konfiguraci seznamu Zivot umri(+[sloupec, Radek], +Mrizka, -NovaMrizka) Pokud je v Mrizce na pozici [Sloupec,Radek] prvek, tak je znicen, jinak se nic nestane narod(+[sloupec, Radek], +Mrizka, -NovaMrizka) Pokud neni v Mrizce na pozici [Sloupec,Radek] prvek, je vytvoren, jinak se nic nestane tiskni/3(+pocetsloupcu, +PocetRadku, +Mrizka) vytiskne Mrizku na vystup tiskni/5(+sloupec, +Radek, +PocetSloupcu, +PocetRadku, +Mrizka) vytiskne na obrazovku stav pozice [Sloupec, Radek] v mrizce zije(+[sloupec,radek], +Mrizka) zjisti, jestli v Mrizce je na pozici [Sloupec,Radek] ziva bytost pokud neni, predikat selze, jinak vraci true nezije(+[sloupec,radek], +Mrizka) zjisti, jestli v Mrizce je na pozici [Sloupec,Radek] volno pokud je tam ziva bunka, predikat selze spoctizive/3(+seznam, +Mrizka, -Vysledek) spoctizive/5(+seznam, +Mrizka?Acc, -Vysledek) spocte pocet zivych bytosti na pozicich v Seznamu Acc je potreba, aby fungovala aritmetika pocetsousedu(+[sloupec,radek],+mrizka, -PocetSousedu) spocte v Mrizce na pozici [Sloupec,Radek] pocet zivych bytosti okolo 7

4 Dodatek B, Testovací data Pro jednoduchou ukázku funkčnosti programu jsou přímo ve zdrojovém kódu čtyři testovací funkce, tedy inicializované konečné automaty; uživatel pouze zavolá danou metodu a zvolí, kolik generací má být vypsáné na obrazovku. Přechodové funkce jsou zvoleny standardně, tedy buňka přežije, pokud má dva či tři aktivní sousedy a narodí se, pokud má právě tři. glider(+pocetgeneraci) smallexploder(+pocetgeneraci) exploder(+pocetgeneraci) row(+pocetgeneraci) Níže jsou uvedeny počáteční stavy připravených testovacích dat. Glider Small Exploder Big Exploder Row 8