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: 5968
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? |
+-------------------------------+


Nejhroznější sen linuxáka: nabootuje počítač, a tam Windows.
Nejhroznější sen windowsáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen linuxáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen windowsáka: nabootuje počítač.

Reklama
Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1963
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: 5968
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í.
Nejhroznější sen linuxáka: nabootuje počítač, a tam Windows.
Nejhroznější sen windowsáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen linuxáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen windowsáka: nabootuje počítač.

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
  • Jakmile dohraju hru tak se ta hra sekne a nereaguje a potom nejde zapnout hra
    od Gargi10 » 27 srp 2017 19:53 » v Hry
    1
    150
    od popcorn
    27 srp 2017 20:09
  • Mála podpora na webu
    od Akrej » 20 lis 2016 16:08 » v Vše ostatní (Off topic)
    2
    366
    od Akrej
    18 pro 2016 18:58
  • malá skriňa za 30 000
    od alkyfans » 27 lis 2016 11:10 » v Rady s výběrem hardwaru a sestavením PC
    13
    581
    od vuLva
    03 pro 2016 14:40
  • Game tester
    od Durzilian IV. » 15 říj 2017 15:11 » v Vše ostatní (Off topic)
    2
    132
    od Durzilian IV.
    17 říj 2017 17:39
  • Xbox Game DVR
    od brano09185 » 21 dub 2017 20:47 » v Vše ostatní (sw)
    0
    206
    od brano09185
    21 dub 2017 20:47

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

Kdo je online

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