čtvrtek 16. listopadu 2017

Bonus 3: Game of Life


Na mém "ToDo" listu se objevil program s názvem "Royal Life" pro ZX Spectrum z roku 1987, pod kterým je podepsaný Vladimír Kostic, což je pravděpodobně člověk ze Slovinska. František Fuka jeho výtvor vzal, trochu ho vylepšil a orazítkoval značkou Fuxoft. Jak jste si možná všimli, tenhle článek je označený jako "Bonus 3", čímž pokračuji ve svém nárazovém seriálu článků (1. díl - Karel, 2. díl - programy pro Spectrum). Důvod, proč tomu tak je, je jednoduchý - je diskutabilní, jestli to je česká hra a zároveň se pořád nemůžu rozhodnout, jestli to vůbec mám brát jako videohru. Vynechat tenhle program úplně by ale byla škoda, protože zpracovává zajímavé téma - "Hru života". 

Pod celým názvem "Conway's Game of Life" (podle matematika Johna Conwaye) se skrývá "dvoustavový, dvourozměrný celulární automat, který svým chováním připomíná vývoj společenství živých organismů". Co to ale proboha znamená?

Po spuštění vypadá program takhle - není zatím zadán počáteční stav
Umístil jsem pár živých buňek a jsem připraven pustit první iteraci

Představte si mřížku (nebo čtverečkovaný papír), kdy do každé buňky můžete zadat jen dva stavy - buňka může být buď živá, nebo mrtvá. Vše se odehrává v iteracích (tazích). Je nutné zadat nějaký počáteční stav, aby se vůbec něco stalo - do mřížky tedy umístíme pár "živých" buňek a pak spustíme první iteraci. V tento okamžik se pro každou buňku v mřížce vyhodnotí 4 pravidla:

  1. Každá živá buňka s méně jak 2 živými sousedy zanikne ("vymírání").
  2. Každá živá buňka s 2 nebo 3 živými sousedy se nemění.
  3. Každá živá buňka s více jak 3 živými sousedy zanikne ("přelidnění"). 
  4. Každá mrtvá buňka s právě 3 živými sousedy obživne ("reprodukce").
Tyto jednoduchá pravidla stačí k tomu, aby vznikaly velice zajímavé situace, kdy se buňky různě proměňují, nové útvary vznikají a rázem zase zanikají. Na wiki se nachází zajímavá definice, která říká, že se jedná o "zero-player" hru, kdy hráč pouze zadá počáteční stav, hru pustí a pak už pouze sleduje průběh a nemusí dál do hry zasahovat. 

V 50. generaci se nám situace začala zajímavě vyvíjet
100. generace - vznikly nám už některé "trvalé organismy" - např. čtverce 2x2, které se samy od sebe nemění

V programu "Royal Life" vidíme ukazatele "Generation", což značí číslo iterace a "N", což značí počet aktuální živých buňek. Pomocí "G" můžeme spustit další iteraci a je tu také možnost držet klávesu "F", kdy se iterace počítají rychle za sebou, což je nejzajímavější volba. 

Krása téhle hry je právě v tom pozorovat, jak se buňky mění a navzájem ovlivňují a to jen za pomoci čtyř jednoduchých pravidel. Screenshoty tedy nejsou úplně vhodnou formou prezentace, lepší je pustit si nějaké video, nebo se kouknout na animované GIFy třeba na webu Stanfordské univerzity, kde je toto téma rozebráno do detailů. 

150. generace - buňky, které se v levé části dostaly mimo obrazovku se objevily vpravo
350. generace je už k nepoznání
Až teprve v nějaké 1100. generaci se hra dostala do stabilního stavu

Studiu "Game of Life" se někteří lidé věnují opravdu dopodrobna a vymyšleny již byly opravdu propracované situace, kdy hra běží donekonečna a vytváří zcela fascinující obrazce. Pokud hru ale budete zkoušet v laické rovině tak, jako já, tak se vám pravděpodobně hra, resp. všechny útvary složené z buňek, dostanou v určité generaci do "stabilního stavu", tzn. střídají třeba jen 2 stavy a další buňky už nejsou ovlivňovány. 

Dostal jsem teď chuť si jen tak z hecu naprogramovat v nějakém moderním jazyce vlastní verzi "Života". Uvidíme. 

3 komentáře:

  1. Moderní jazyk na věc, se kterou si hrál už John von Neumann?
    Právě naopak, to chce nějaký pořádně starobylý: https://www.youtube.com/watch?v=kVQquhmJ7K0 :-D

    faraon

    OdpovědětVymazat
    Odpovědi
    1. Fortran 66 :) To už je jen pro opravdové nadšence.

      Vymazat
    2. No to je právě ta velká chyba! Je to velmi jednoduchý a přitom nesmírně mocný jazyk.
      Například výpis libovolné oblasti matice na obrazovku nebo tiskárnu se dá provést jediným příkazem:
      PRINT ((OBRAZ(I,J),I=1,20),J=1,20)
      Sdílení dat mezi různými podprogramy je také velmi jednoduché, přitom mnohem schopnější než ve dnes moderních jazycích...

      faraon

      Vymazat