Malá hra o velkého Bajta (7) - Conway's Game of Life

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
faraon
Master Level 8
Master Level 8
Příspěvky: 6443
Registrován: prosinec 10
Pohlaví: Muž

Malá hra o velkého Bajta (7) - Conway's Game of Life

Příspěvekod faraon » 03 dub 2016 23:10

Všechny bity hry:

00000001 - Jednoduchá kalkulačka
00000010 - Odebírání zápalek
00000100 - Gregoriánský kalendář
00001000 - Hádání kombinace
00010000 - Vigenérova šifra
00100000 - Hledání min
01000000 - Házení kostkou
10000000 - Conway's Game of Life




Vypuklo nám jaro, kytkám vybuchují pupeny, pěstitelům senné rýmy alergické reakce, sem tam bouchne i nějaká ta bomba na letišti, příroda prostě hýří životem, a my bysme si mohli trochu zahýřit také. Základem pozemského života je DNA, nesoucí informace o všech našich předcích a jejich vlastnostech. Základem lidského vědění je znalost minulosti, takže se opět vrátíme do počítačového pravěku, ještě před vznik elektronkových dinosaurů, do doby mechanických trilobitů a reléových měkkýšů.

Ještě než vznikly první elektronické počítače, hledali vědci způsoby jak napodobit fungování přírodních mechanizmů. Alan Turing ve třicátých letech vymyslel svůj hypotetický stroj, který na základě zápisů a čtení nekonečné pásky měl simulovat konverzaci člověka tak, aby jeho lidský protějšek nedokázal poznat zda hovoří s člověkem nebo se strojem. A v roce 1940 John von Neumann (tvůrce dnes nejpoužívanější koncepce počítačů) navrhl buněčný automat, simulující dvourozměrnou plochu obydlenou jednoduchými tvory, a různé vztahy mezi nimi ovlivňující jejich životy.

Po počátečním zaujetí zájem o tuto vědní disciplínu trochu opadl, přišla válka a po ní jaderné zbrojení, hony na neexistující čarodějnice a konzumní boom, počítače stály miliony dolarů a sloužily hlavně armádě a bankám, a ty pro podobné hrátky neměly pochopení. Až když se rozšířily levné minipočítače umožňující hrát si se softwarem kdejakému studentíkovi, začaly vznikat podmínky pro rozvoj různých "nesmyslů". Jeden takový vznikl v roce 1970, kdy matematik John Horton Conway publikoval článek o jednoduchém buněčném, automatu, který nazval jednoduše - Život. Prakticky okamžitě vypukl větší poprask než kolem současné uprchlické krize, tisíce lidí se snažily a dodnes snaží najít nejrůznější životachopné vzory, vycházel dokonce specializovaný časopis věnovaný pouze této hře. Něco podobného později dokázala až Rubikova kostka. Takže letošní jaro přivítá:

Game of Life - Hra Život

Existuje řada různých variací této hry, ale ta nejzákladnější má úplně jednoduchá pravidla:

  1. Hraje se ve čtvercové síti, kde každá buňka má osm sousedních polí.
  2. Živá buňka, která má dva nebo tři sousedy, zůstává naživu.
  3. Živá buňka, která má méně než dva nebo více než tři sousedy, umírá.
  4. Mrtvá buňka, která má právě tři sousedy, oživne.
  5. Změna stavu nastává ve všech polích současně!
Cílem je vymyslet kombinaci která bude žít a růst co nejdéle, nejlépe donekonečna.

Milovníci této hry vymysleli a pojmenovali různé prvky, které mají různé chování. Netrvanlivější jsou zátiší, která si jen tak existují a nic nedělají. Nejjednodušší je Blok:
Obrázek

Zajímavější jsou oscilátory, které mění svůj stav pořád dokola s různou periodou. Ty začínají od prostého Blikače:
Obrázek

Pohybující se objekty se nazývají Hvězdné lodě. Ten nejslavnější je Kluzák (Glider). Stal se symbolem hackerské kultury, znakem pravých hackerů, těch v původním slova smyslu, kdy se tak označovali skuteční mistři hardwaru i softwaru, schopní vyždímat ze strojů, které znali do posledního bitu i tranzistoru, neuvěřitelné výkony přesahující jejich možnosti. Rozhodně ale mezi nositele tohoto označení nepatří nedoučenými pisálky chybně pojmenovaní dnešní "hackeři", kteří si svoje komplexy a malé pindíky kompenzují nabouráváním se do cizích počítačů a ničením dat v nich. Hacker tvoří, neničí! A Kluzák se pohybuje šikmo stále stejným směrem:
Obrázek

Některé oscilátory dokáží vytvářet pohybující se prvky, ty se nazývají Děla:
Obrázek

Některé hvězdné lodě se pohybují po ploše a zanechávají za sebou stopu jako parní lokomotiva, těm se říká Kuřáci. A další a další, je jich ještě hodně a koho to zajímá může nakouknout třeba na Wikipedii, odkud jsem si vypůjčil nějaké ty informace a obrázky.

Takže v tuhle chvíli je už asi zbytečné říkat že úkolem pro dnešní bit je naprogramovat vlastní implementaci hry Život podle výše uvedených pravidel. Je to ta nejjednodušší a nejzákladnější verze oblíbené hry matematiků a hackerů, a dá se naprogramovat na pár desítek řádků v jakémkoliv jazyce, včetně šílených obskurností jako je Brainfuck!

https://www.youtube.com/watch?v=kVQquhmJ7K0

Hrací plocha může být libovolně velká, ohraničená nebo nekonečná (toroid), jenom ještě zdůrazním pravidlo 5, které zní: "Změna stavu nastává ve všech polích současně!" To znamená že není možné hrací pole procházet postupně a měnit jednu buňku po druhé, protože tak by se jeho svět choval v různých směrech různě. Je potřeba na to jít jinak, možností je opět víc a každý si může vybrat tu, která mu bude připadat nejlepší.


+-------------------------------+
| Najde se tu opravdový hacker? |
+-------------------------------+


"Pimonte, Pimonte, co jsi ty za pána, že za tebou padla ta majlandská brána, hop, hop, hop.
Ta majlandská brána a ty čtyři mosty, vystav si, Pi­monte, silnější forposty, hop, hop, hop!"

Píseň dobrého vojáka Švejka

Reklama
Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1965
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž

Re: Malá hra o velkého Bajta (7) - Conway's Game of Life

Příspěvekod domitea » 25 dub 2016 18:56

Moje implementace:

Kód: Vybrat vše

#!/bin/python
"""
domitea Copyleft 2012
"""

"""
Uzivatelske funkce
"""

def tiskPole(array): #Tiskne pole v pratelstejsi podobe
   tiskMatrix = [["_" for l in range(velikostMatice)] for k in range(velikostMatice)]
   for i in range(0, velikostMatice):
      for j in range(0, velikostMatice):
          if array[i][j] == 1:
             tiskMatrix[i][j] = "X"

   for kradek in tiskMatrix:
      print (kradek)




"""
Samotny program
"""

print ("Tohle ma byt pokus o hru Game Of Life :) ")
kroky = 5
velikostMatice = 12

"""
Deklarace pocatecniho pole
"""

# do tohoto pole se pise nulta generace

pocradek1 =    [0,0,0,0,0,0,0,0,0,0,0,0]
pocradek2 =    [0,0,0,0,0,0,0,0,0,0,0,0]
pocradek3 =    [0,0,0,1,1,0,0,0,0,0,0,0]
pocradek4 =    [0,0,0,1,0,0,0,0,0,0,0,0]
pocradek5 =    [0,0,0,0,0,0,1,0,0,0,0,0]
pocradek6 =    [0,0,0,0,0,1,1,0,0,0,0,0]
pocradek7 =    [0,0,0,0,0,0,0,0,0,0,0,0]
pocradek8 =    [0,0,0,0,0,0,0,0,1,0,0,0]
pocradek9 =    [0,0,0,0,0,0,0,0,1,0,0,0]
pocradek10 =    [0,0,0,0,0,0,0,0,1,0,0,0]
pocradek11 =    [0,0,0,0,0,0,0,0,0,0,0,0]
pocradek12 =    [0,0,0,0,0,0,0,0,0,0,0,0]

# poskladani radku do pole
pocMatrix = [pocradek1, pocradek2, pocradek3, pocradek4, pocradek5, pocradek6, pocradek7, pocradek8, pocradek9, pocradek10, pocradek11, pocradek12]



"""
Kontrolni vypsani pole
"""

print ("Takto vypada pocatecni pole")

tiskPole(pocMatrix)

"""
Deklarace pole pro vypocty neboli to nasledujici pole :)
"""

nasldMatrix = [[0 for x in range(velikostMatice)] for y in range(velikostMatice)] #Rychla deklarace pole na pocty

for n in range(kroky):

   """
   hura na podminky :D
   """

   for i in range(1, velikostMatice - 1): #Takhle funguje for, vlastne to je jen foreach :D
      for j in range(1, velikostMatice - 1):
         sum =  ( pocMatrix[i-1][j-1] + pocMatrix[i][j-1] + pocMatrix[i+1][j-1] ) + ( pocMatrix[i-1][j] + pocMatrix[i+1][j] ) + ( pocMatrix[i-1][j+1] + pocMatrix[i][j+1] + pocMatrix[i+1][j+1] )
         if pocMatrix[i][j] == 1:
            if sum == 2 or sum == 3:
               nasldMatrix[i][j] = 1
            else:
               nasldMatrix[i][j] = 0
         else:
            if sum == 3:
               nasldMatrix[i][j] = 1
            else:
               nasldMatrix[i][j] = 0
   """
   Kopirovani pole,
   """

   for i in range(0, velikostMatice):
      for j in range(0, velikostMatice):
          pocMatrix[i][j] = nasldMatrix[i][j]

   nasldMatrix = [[0 for x in range(velikostMatice)] for y in range(velikostMatice)]

   print ("Takto vypada pole po jednom kroku:")

   tiskPole(pocMatrix)
UNIX je systém jednoduchý, jen musíte být geniální, aby jste tu jednoduchost pochopili. Jedině OSS, vše co napíšu je pod GNU/GPL
Linux je mé koření života. Nikdy nevím, co pokazím! Registered user #550849

Dnešní počítače mi nestačí, pracuji na vlastním

someoneFromSomewhere
nováček
Příspěvky: 20
Registrován: květen 17
Pohlaví: Muž

Re: Malá hra o velkého Bajta (7) - Conway's Game of Life

Příspěvekod someoneFromSomewhere » 12 kvě 2017 15:19

Tudyhle něco přináším ze vzdálených končin

Kód: Vybrat vše

#include <iostream>
#include <array>
#include <random>

template <std::size_t SIZE> class Game {
   std::array<std::array<bool, SIZE>, SIZE> m_curr, m_step;

   bool getNew(std::size_t y, std::size_t x) {
      int c = 0;
      for (int dy = -1; dy <= 1; dy++) for (int dx = -1; dx <= 1; dx++) {
         if (dx == 0 && dy == 0) continue;
         c += (y + dy < SIZE && x + dx < SIZE ? m_curr[y + dy][x + dx] : false);
      }
      return ((m_curr[y][x] && (c >= 2 && c <= 3)) || (m_curr[y][x] == false && c == 3));
   }

   public:
      Game() {
         for (auto& row : m_curr) for (auto& col : row) col = false;
      }

      void update() {
         for (std::size_t y = 0; y < SIZE; y++) for (std::size_t x = 0; x < SIZE; x++)
            m_step[y][x] = getNew(y, x);
         std::swap(m_curr, m_step);
      }

      void regen() {
         static std::random_device rd;
         static std::mt19937 ms(rd());
         static std::uniform_int_distribution<> sq(0, 5);
         for (auto& row : m_curr) for (auto& col : row) col = sq(ms) == 0;
      }

      void print(std::ostream& o = std::cout, char delim = ' ') {
         std::system("cls");
         for (const auto& row : m_curr) {
            for (const auto& col : row) {
               o.put(delim);
               o.put(col ? '*' : ' ');
            }
            o.put('\n');
         }
      }
      
      void preset(std::array<std::array<bool, SIZE>, SIZE>& ar) {
         std::swap(m_curr, ar);
      }
};

int main(int argc, char **argv) {
   Game<32> g;
   g.preset(std::array<std::array<bool, 16>, 16>{
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      std::array<bool, 16>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
   });
   g.print();
   while (std::cin.get() != ' ') {
      g.update();
      g.print();
   }

   std::cin.get();
   return 0;
}


/E: Přidal jsem počáteční stav, je to oscilátor s periodou 15
Naposledy upravil(a) someoneFromSomewhere dne 16 kvě 2017 19:22, celkem upraveno 1 x.
std::endl není nový řádek!

Uživatelský avatar
faraon
Master Level 8
Master Level 8
Příspěvky: 6443
Registrován: prosinec 10
Pohlaví: Muž

Re: Malá hra o velkého Bajta (7) - Conway's Game of Life

Příspěvekod faraon » 12 kvě 2017 16:48

No konečně zase někdo, trochu mě mrzí že si ani na takhle jednoduchou a přitom komplexní hru nikdo netroufá :-(

Akorát jednu připomínku, kouzlo téhle hry spočívá ve vymýšlení nejživotaschopnějších kombinací buněk, a ne v jejich náhodném rozházení.
"Pimonte, Pimonte, co jsi ty za pána, že za tebou padla ta majlandská brána, hop, hop, hop.
Ta majlandská brána a ty čtyři mosty, vystav si, Pi­monte, silnější forposty, hop, hop, hop!"

Píseň dobrého vojáka Švejka

someoneFromSomewhere
nováček
Příspěvky: 20
Registrován: květen 17
Pohlaví: Muž

Re: Malá hra o velkého Bajta (7) - Conway's Game of Life

Příspěvekod someoneFromSomewhere » 12 kvě 2017 16:56

Určitě zkusím nějaký kvalitní počáteční stav vymyslet.

Tohle byl spíš takový test stručné implementace; takže jakmile na něco příjdu, hned to upravím. :)
std::endl není nový řádek!


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Excel - rozdělení JmenoPrijmeni podle velkého písmena
    od Marietta99 » 02 úno 2018 16:05 » v Kancelářské balíky
    10
    762
    od elninoslov
    07 úno 2018 08:20
  • Malá pamäť na Honor 4C
    od DJAdam » 05 led 2018 21:43 » v Mobily, tablety a jiná přenosná zařízení
    8
    436
    od DJAdam
    05 led 2018 23:10
  • Malá herní bezdrátová myš k macbooku
    od WinDroid » 18 pro 2017 23:36 » v Rady s výběrem hardwaru a sestavením PC
    0
    160
    od WinDroid
    18 pro 2017 23:36
  • Half Life 1 Blue Shift - menu ovladani s myší
    od p3v4x » 18 kvě 2018 19:52 » v Hry
    0
    361
    od p3v4x
    18 kvě 2018 19:52
  • P: World of Warcraft Game Card 60 dní
    od Cleric » 18 kvě 2018 10:20 » v P: Software
    0
    442
    od Cleric
    18 kvě 2018 10:20

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: CommonCrawl [Bot] a 0 hostů