Koncepcja programu

Zastanówmy się nad strukturą programu i poszczególnymi funkcjami, które chcielibyśmy zaimplementować. Rozpoczniemy od zainicjalizowania siatki komórek określonej wielkości oraz wypełnienia jej pierwszą, losowo wygenerowaną populacją.

Następnie utworzymy pętlę, dzięki której będziemy wypisywać zawartość siatki oraz przekształcać ją zgodnie z zasadami Gry w życie. Pseudokod głównej pętli naszego programu wygląda następująco:

Linia 1. siatka otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy ← otwórz nawias klamrowy zamknij nawias klamrowy. Linia 2. inicjalizuj podkreślnik siatke otwórz nawias okrągły zamknij nawias okrągły. Linia 4. Dopóki trwa gra wykonuj dwukropek. Linia 5. wypisz podkreślnik siatke otwórz nawias okrągły zamknij nawias okrągły. Linia 6. ewolucja otwórz nawias okrągły zamknij nawias okrągły.

Implementacja bez użycia biblioteki graficznej

Przejdźmy do implementacji automatu komórkowego. Zaczniemy od programu, w którym nie będziemy wykorzystywać biblioteki graficznej. Rezultaty działania wypiszemy w terminalu.

Zacznijmy od inicjalizacji kilku stałych globalnych.

Linia 1. const int ROZMIAR podkreślnik SIATKI znak równości 20 średnik. Linia 2. const bool MARTWA znak równości false średnik. Linia 3. const bool ZYWA znak równości true średnik.

Nasza siatka będzie mieć kształt kwadratu. Stała ROZMIAR_SIATKI przechowuje długość jego boku jako liczbę składających się nań komórek. Wartości MARTWA oraz ZYWA są z kolei stałymi, które poprawią czytelność naszego kodu.

Siatką będzie dwuwymiarowa tablica zmiennych typu bool. Ponieważ każda komórka w Grze w życie może przyjąć tylko jeden z dwóch stanów, ten typ danych idealnie nadaje się do reprezentacji planszy.

Linia 1. bool siatka otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy średnik.

Dodatkowo poza funkcją główną main() zdefiniujemy następujące funkcje:

  • inicjalizuj_siatke() – funkcja odpowiedzialna za losowe wygenerowanie pierwszej populacji komórek,

  • policz_zywych_sasiadow() – funkcja odpowiedzialna za policzenie żywych sąsiadów komórki,

  • ewolucja() – funkcja realizująca jeden cykl ewolucji komórek,

  • wypisz_siatke() – funkcja wypisująca obecny stan planszy na standardowe wyjście.

Do wypisywania obecnego stanu planszy wykorzystamy znaki z zestawu Unicodezestaw znaków Unicodezestawu Unicode. Sprawdzą się one o wiele lepiej od standardowego zestawu znaków ASCII podczas wyświetlania zawartości komórek w terminalu.

Aby wyświetlać znaki Unicode, musimy odpowiednio ustawić tryb wypisywania.

Linia 1. podkreślnik setmode otwórz nawias okrągły podkreślnik fileno otwórz nawias okrągły stdout zamknij nawias okrągły przecinek podkreślnik O podkreślnik U16TEXT zamknij nawias okrągły średnik.

Pełny kod Gry w życie w języku C++ wygląda następująco:

Linia 1. prawy ukośnik prawy ukośnik Dołączenie potrzebnych nam bibliotek. Linia 2. kratka include otwórz nawias ostrokątny stdio kropka h zamknij nawias ostrokątny. Linia 3. kratka include otwórz nawias ostrokątny stdlib kropka h zamknij nawias ostrokątny. Linia 4. kratka include otwórz nawias ostrokątny time kropka h zamknij nawias ostrokątny. Linia 5. kratka include otwórz nawias ostrokątny Windows kropka h zamknij nawias ostrokątny. Linia 6. kratka include otwórz nawias ostrokątny io kropka h zamknij nawias ostrokątny. Linia 7. kratka include otwórz nawias ostrokątny fcntl kropka h zamknij nawias ostrokątny. Linia 9. prawy ukośnik prawy ukośnik Inicjalizacja globalnych stałych. Linia 10. const int ROZMIAR podkreślnik SIATKI znak równości 20 średnik. Linia 11. const bool MARTWA znak równości false średnik. Linia 12. const bool ZYWA znak równości true średnik. Linia 14. prawy ukośnik prawy ukośnik Prototypy funkcji. Linia 15. void inicjalizuj podkreślnik siatke otwórz nawias okrągły bool siatka otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy zamknij nawias okrągły średnik. Linia 16. void wypisz podkreślnik siatke otwórz nawias okrągły bool siatka otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy zamknij nawias okrągły średnik. Linia 17. void ewolucja otwórz nawias okrągły bool siatka otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy zamknij nawias okrągły średnik. Linia 18. int policz podkreślnik zywych podkreślnik sasiadow otwórz nawias okrągły int y przecinek int x przecinek bool siatka otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy zamknij nawias okrągły średnik. Linia 21. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. podkreślnik setmode otwórz nawias okrągły podkreślnik fileno otwórz nawias okrągły stdout zamknij nawias okrągły przecinek podkreślnik O podkreślnik U16TEXT zamknij nawias okrągły średnik. Linia 23. bool siatka otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy średnik. Linia 24. inicjalizuj podkreślnik siatke otwórz nawias okrągły siatka zamknij nawias okrągły średnik. Linia 26. prawy ukośnik prawy ukośnik Główna pętla naszej gry. Linia 27. while otwórz nawias okrągły true zamknij nawias okrągły otwórz nawias klamrowy. Linia 28. wypisz podkreślnik siatke otwórz nawias okrągły siatka zamknij nawias okrągły średnik. Linia 29. ewolucja otwórz nawias okrągły siatka zamknij nawias okrągły średnik. Linia 31. prawy ukośnik asterysk Jako ze program wykonuje sie bardzo szybko to. Linia 32. żebyśmy mogli zaobserwować co się dzieje musimy. Linia 33. go wstrzymać na pół sekundy przy każdej. Linia 34. iteracji pętli asterysk prawy ukośnik. Linia 35. Sleep otwórz nawias okrągły 500 zamknij nawias okrągły średnik. Linia 36. zamknij nawias klamrowy. Linia 37. zamknij nawias klamrowy. Linia 39. void inicjalizuj podkreślnik siatke otwórz nawias okrągły bool siatka otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy. Linia 40. prawy ukośnik asterysk Do wygenerowania pierwszej populacji użyjemy. Linia 41. generatora liczb pseudolosowych rand otwórz nawias okrągły zamknij nawias okrągły asterysk prawy ukośnik. Linia 42. srand otwórz nawias okrągły time otwórz nawias okrągły NULL zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 44. int temp średnik. Linia 46. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ROZMIAR podkreślnik SIATKI średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 47. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny ROZMIAR podkreślnik SIATKI średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 48. temp znak równości rand otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 50. if otwórz nawias okrągły temp procent 5 znak równości znak równości 0 zamknij nawias okrągły. Linia 51. siatka otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości ZYWA średnik. Linia 52. else. Linia 53. siatka otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości MARTWA średnik. Linia 54. zamknij nawias klamrowy. Linia 55. zamknij nawias klamrowy. Linia 56. zamknij nawias klamrowy. Linia 58. void ewolucja otwórz nawias okrągły bool siatka otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy. Linia 59. prawy ukośnik asterysk Aby poprawnie wykonać ewolucje najpierw dla każdej. Linia 60. komórki obliczamy liczbe jej żywych sąsiadów przecinek. Linia 61. a następnie zgodnie z regułami zmieniamy. Linia 62. stan każdej komórki asterysk prawy ukośnik. Linia 63. int zywi podkreślnik sasiedzi otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy średnik. Linia 65. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ROZMIAR podkreślnik SIATKI średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 66. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny ROZMIAR podkreślnik SIATKI średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 67. zywi podkreślnik sasiedzi otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości policz podkreślnik zywych podkreślnik sasiadow otwórz nawias okrągły i przecinek j przecinek siatka zamknij nawias okrągły średnik. Linia 68. zamknij nawias klamrowy. Linia 69. zamknij nawias klamrowy. Linia 71. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ROZMIAR podkreślnik SIATKI średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 72. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny ROZMIAR podkreślnik SIATKI średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 73. if otwórz nawias okrągły siatka otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości znak równości MARTWA ampersant ampersant zywi podkreślnik sasiedzi otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości znak równości 3 zamknij nawias okrągły. Linia 74. siatka otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości ZYWA średnik. Linia 75. else if otwórz nawias okrągły siatka otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości znak równości ZYWA zamknij nawias okrągły. Linia 76. if otwórz nawias okrągły zywi podkreślnik sasiedzi otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias ostrokątny 2 kreska pionowa kreska pionowa zywi podkreślnik sasiedzi otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias ostrokątny 3 zamknij nawias okrągły. Linia 77. siatka otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości MARTWA średnik. Linia 78. zamknij nawias klamrowy. Linia 79. zamknij nawias klamrowy. Linia 80. zamknij nawias klamrowy. Linia 82. int policz podkreślnik zywych podkreślnik sasiadow otwórz nawias okrągły int y przecinek int x przecinek bool siatka otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy. Linia 83. int ile znak równości 0 średnik. Linia 85. for otwórz nawias okrągły int i znak równości y minus 1 średnik i otwórz nawias ostrokątny znak równości y plus 1 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 86. for otwórz nawias okrągły int j znak równości x minus 1 średnik j otwórz nawias ostrokątny znak równości x plus 1 średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 87. if otwórz nawias okrągły i zamknij nawias ostrokątny znak równości 0 ampersant ampersant j zamknij nawias ostrokątny znak równości 0 ampersant ampersant i otwórz nawias ostrokątny ROZMIAR podkreślnik SIATKI ampersant ampersant j otwórz nawias ostrokątny ROZMIAR podkreślnik SIATKI ampersant ampersant siatka otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości znak równości ZYWA zamknij nawias okrągły. Linia 88. ile plus plus średnik. Linia 89. zamknij nawias klamrowy. Linia 90. zamknij nawias klamrowy. Linia 92. prawy ukośnik asterysk Jako ze w powyższej pętli mogliśmy dodać wartość. Linia 93. komórki dla której sprawdzamy to musimy to odjać asterysk prawy ukośnik. Linia 94. if otwórz nawias okrągły siatka otwórz nawias kwadratowy y zamknij nawias kwadratowy otwórz nawias kwadratowy x zamknij nawias kwadratowy znak równości znak równości ZYWA zamknij nawias okrągły. Linia 95. ile minus minus średnik. Linia 97. return ile średnik. Linia 98. zamknij nawias klamrowy. Linia 100. void wypisz podkreślnik siatke otwórz nawias okrągły bool siatka otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy ROZMIAR podkreślnik SIATKI zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy. Linia 101. prawy ukośnik prawy ukośnik Na samym początku czyścimy konsole. Linia 102. system otwórz nawias okrągły cudzysłów cls cudzysłów zamknij nawias okrągły średnik. Linia 104. prawy ukośnik asterysk Teraz wypisujemy obecny stan siatki. Linia 105. wykorzystujac znak czarnego kwadratu o. Linia 106. numerze Unicode 0x25A0 asterysk prawy ukośnik. Linia 107. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny ROZMIAR podkreślnik SIATKI średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 108. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny ROZMIAR podkreślnik SIATKI średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 109. if otwórz nawias okrągły siatka otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości znak równości ZYWA zamknij nawias okrągły. Linia 110. wprintf otwórz nawias okrągły L cudzysłów lewy ukośnik x25a0 cudzysłów zamknij nawias okrągły średnik. Linia 111. else. Linia 112. wprintf otwórz nawias okrągły L cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 113. zamknij nawias klamrowy. Linia 115. wprintf otwórz nawias okrągły L cudzysłów lewy ukośnik n cudzysłów zamknij nawias okrągły średnik. Linia 116. zamknij nawias klamrowy. Linia 117. zamknij nawias klamrowy.

Słownik

Simple DirectMedia Layer
Simple DirectMedia Layer

biblioteka służąca do tworzenia grafik i programów multimedialnych; zapewnia dostęp do sprzętu audio, klawiatury, myszy oraz sprzętu graficznego; jest obsługiwana przez większość systemów operacyjnych

zestaw znaków Unicode
zestaw znaków Unicode

zestaw znaków definiujący wszystkie znaki pisarskie, używane na świecie