Automaty komórkowe czyli Gra w Życie

W magazynie Programista, numer 5/2020 (92) ukazał się artykuł Gra w Życie: podróż w nieznane z Johnem Conwayem, autor: Rafał Kocisz, który zainspirował mnie aby pobawić się automatami komórkowymi. Co to takiego? Już wyjaśniam.

Zasady gry

Gra w życie to gra zero-osobowa, czyli nie wymaga sterowania. Idea jest dość prosta: mamy określoną planszę i na niej umieszczone komórki,  którą mogą być żywe lub martwe, np.:

Białe pola to żywe komórki, czarne to martwe komórki.

W każdym cyklu programu sprawdzane są dla każdej z komórek następujące warunki:

  • każda żywa komórka, która ma mniej niż dwóch żywych sąsiadów, umiera z samotności
  • każda żywa komórka, która ma dokładnie dwóch lub trzeb żywych sąsiadów, żyje dalej
  • każda żywa komórka, która ma więcej niż trzech żywych sąsiadów, umiera z przeludnienia
  • każda martwa komórka, która ma trzech żywych sąsiadów, ożywa w ramach reprodukcji

Do implementacji użyłem języka Python i biblioteki PyGame, zestaw ten pozwolił mi w bardzo krótkim czasie zacząć zabawę z automatami komórkowymi.

Pierwsze wzory jakie rysowałem na planszy, były dość proste i po kilku przebiegach zatrzymywały się w stanie, który nie ma szans się dalej zmieniać, np. przedstawiony powyżej wzór w pierwszym przebiegu przekształci się w coś takiego:

i ten wzór nie ma już szansy na rozwój, biorąc pod uwagę przedstawione powyżej warunki.

Spróbowałem więc nieco bardziej złożonych wzorów, np.:

Ten wzór z kolei skończył się rozwijać po kolejnych trzech iteracjach:

Skomplikowałem więc wzór początkowy jeszcze bardziej:

i tym razem udało mi się uzyskać pierwszy „żyjący” automat:

Ok, żyje, ale wizualnie nie jest zbyt fascynujący, dlatego zacząłem eksperymentować z wzorami, rozmiarem planszy, położeniem na planszy i szybkością odświeżania:

To już zdecydowanie lepiej wygląda 🙂 Siatkę wyłączyłem dla większych rozdzielczości planszy żeby nie zamazywać za bardzo pola.

Kod mojego programu znajdziecie tutaj: w repozytorium GitHub – jest to bardziej kod do prototypowania niż skończona aplikacja.

Eksperymentując z wzorami można napotkać bardzo ciekawe efekty, np. wystrzelenie czegoś jak na poniższym przykładzie:

Z powyższego przykładu stworzyłem wzór odpowiadający temu elementowi, który się odłączył (został wystrzelony) i uruchomiłem program z tym wzorem. Okazało się, że element tym razem rozbija się o róg planszy:

Wzory

Eksperymenty z automatami komórkowymi zaczęły się na przełomie lat 40. i 50. XX wieku, więc nie są niczym nowym i przez lata zostały opracowane różne definicje sąsiedztwa komórek, metod przejść oraz wzorów początkowych. Tych ostatnich w internecie można znaleźć multum wraz z przykładami, szukając hasła „cellular automaton patterns” znajdziemy np. stronę na wikipedii z opisami i przykładami wzorów, niektóre z nich są naprawdę imponujące:

Nie byłoby nic imponującego w tego typu animacjach, gdybyśmy oglądali je bez wiedzy o tym jak one powstają – nie jest to bowiem do końca zaprogramowana przez człowieka animacja, dzieje się tutaj coś co możemy nazwać pseudo-przypadkowością lub po prostu magią 😉

Więcej przykładów można znaleźć choćby w tym filmie:

Cellular automatons 3D

Na dwówymiarowych planszach jednak zabawa się nie kończy, istnieje również wiele implementacji Gry w Życie w wersji trójwymiarowej, przykłady:

Fascynujące, nieprawdaż? Wzory generowane przez algorytm operujący na bardzo prostych założeniach przypominają wzory, które występują w naturze i podobnie do nich się zmieniają w czasie.

Udostępnij

Skomentuj