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.
Skomentuj