Close

Gra w życie -> Maszyna stanów w Groovy’m

Natknęłam się ostatnio w sieci na wpis o implementacji maszyny stanów w Groovy’m i postanowiłam wykorzystać ten pomysł w praktyce. Do implementacji wybrałam Grę w Życie. Algorytm nie jest skomplikowany, każda komórka może przyjąć jeden z dwóch stanów, a i przejść między stanami nie jest za dużo. W skrócie: istnieje dwuwymiarowa plansza z komórkami. Każda komórka może być albo ‚żywa’ albo ‚martwa’. Stan komórki zależy od jej ‚sąsiadów’ – 8 stykających się z nią komórek. W każdym kroku sprawdza się stan komórki i zmienia się go zgodnie z następującymi zasadami:

  • jeśli żywą komórkę otacza mniej niż 2 żywych sąsiadów – komórka umiera z samotności
  • jeśli żywą komórkę otacza więcej niż 3 żywych sąsiadów – komórka umiera z „przeludnienia”
  • jeśli martwą komórkę otacza dokładnie 3 żywych sąsiadów – komórka ożywa
  • w pozostałych przypadkach, komórka nie zmienia stanu

Cały kod programu tu: github

Implementacja takiej maszyny wg wpisu to mapa, gdzie kluczem jest obecny stan komórki, a jako wartość występuje lista możliwych przejść:

Kod przejścia jest równie nieskomplikowany – wyciągamy z maszyny stanów możliwe przejścia dla obecnego stanu komórki. Sprawdzamy, czy jest możliwe przejście wyzwalane eventem, który został przekazany jako parametr. Jeśli wszystko jest ok, tworzymy nową komórkę z nowym stanem wynikającym z przejścia i ewentualnie wykonujemy dodatkowe akcje związane z przejściem.

Definicja komórki jest dość prosta. Każda komórka ma stan i dodatkowo ‚długość życia’, którą wykorzystuję później do kolorowania komórek na ekranie. Używam też klasy Board, w której przechowuję dwuwymiarową tablicę z komórkami najważniejszą metodę step(), która przechodząc komórka po komórce, przy użyciu maszyny stanów ustawia kolejny stan na podstawie tego ilu żywych sąsiadów ją otacza (getEvent()).

Wstępnie wyjście wyrzucałam na konsolę w postaci kropek i gwiazdek:

ale zachciało mi się przedstawić efekt działania programu w postaci animacji. Nie chciałam się bawić w Swinga i AWT, JavaFX byłaby do tego za ciężka, więc zadałam pytanie na grupie „Programuj, dziewczyno!” czy nie znają czegoś odpowiedniego. I tak poznałam Processing, który zaskoczył mnie tym jak mało kodu wymaga przedstawienie tablicy jako pikseli i zrobienie z nim animacji: kod tu

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: