Last active
April 1, 2017 03:29
-
-
Save xkrsz/6de9c8b7f76b53cad72e2cf279cc7e46 to your computer and use it in GitHub Desktop.
Gra w życie
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Gra w życie została wymyślona w 1970 roku przez Johna Conwaya. | |
Rozpatrujemy wariant, w którym plansza składa się z komórek rozmieszczonych obok siebie na prostokątnej siatce | |
o wymiarach n × m, w której numeracja wierszy i kolumn zaczyna się od 1. Każda komórka może być w jednym z dwóch stanów: | |
żywa ”X” lub martwa ”.”. Przyjmijmy, że komórki z prawej krawędzi siatki sąsiadują z komórkami z lewej krawędzi siatki, | |
a komórki z górnego wiersza sąsiadują z komórkami dolnego wiersza siatki. Każda komórka ma 8 sąsiadów, połączonych z nią | |
bokiem lub wierzchołkiem. | |
Układ komórek podlega ewolucji. W następnym pokoleniu będą żywe tylko te komórki, które w bieżącym pokoleniu spełniają | |
jeden z dwóch warunków: | |
• Komórka jest żywa i ma dwóch lub trzech żywych sąsiadów (inaczej umiera z samotności lub na | |
skutek zbyt dużego zagęszczenia). | |
• Komórka jest martwa, ale ma dokładnie trzech żywych sąsiadów. | |
*/ | |
#include <iostream> | |
#include <cstring> | |
// .................... | |
// .................... | |
// .................... | |
// .................... | |
// .......X.XX......... | |
// .......XXX.......... | |
// ........X........... | |
// .................... | |
// .................... | |
// .................... | |
// .................... | |
// .................... | |
// | |
// next gen: | |
// if cell alive currently, cell will be alive if 2 or 3 alive neighbours rn | |
// if cell dead currencly, cell will be alive if exactly 3 alive neighbours rn | |
int countAliveNeighbours(int x, int y, char world[][20]) { | |
int count = 0; | |
for(int a = x - 1; a <= x + 1; a++) { | |
for(int b = y - 1; b <= y + 1; b++) { | |
int tmpA, | |
tmpB; | |
// Prevent check of given cell | |
if(a != x || b != y) { | |
tmpA = (a < 0) ? 11 : (a > 11) ? 0 : a; | |
tmpB = (b < 0) ? 19 : (a > 19) ? 0 : b; | |
// printf("\n%d, %d", tmpA, tmpB); | |
// printf("%c", world[tmpA][tmpB]); | |
if(world[tmpA][tmpB] == 'x') count++; | |
} | |
} | |
} | |
return count; | |
} | |
void game(int gens) { | |
char world[12][20] = { | |
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', 'x', '.', 'x', 'x', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', 'x', 'x', 'x', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', '.', 'x', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, | |
{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'} | |
}; | |
// printf("%d", countAliveNeighbours(6, 10, world)); | |
int previousAliveCount = 0, | |
stillGrowthCount = 1; | |
// Generation | |
for(int gen = 1; gen <= gens; gen++) { | |
char newWorld[12][20]; | |
std::memcpy(newWorld, world, sizeof(newWorld)); | |
if(gen > 1) { | |
// Row | |
for(int x = 0; x < 12; x++) { | |
// Column | |
for(int y = 0; y < 20; y++) { | |
char cell = world[x][y]; | |
int aliveCount = countAliveNeighbours(x, y, world); | |
if((cell == 'x' && (aliveCount == 2 || aliveCount == 3)) || | |
(cell == '.' && aliveCount == 3)) { | |
// cell alive in next gen | |
newWorld[x][y] = 'x'; | |
} else { | |
// cell dead in next gen | |
newWorld[x][y] = '.'; | |
} | |
} | |
} | |
std::memcpy(world, newWorld, sizeof(world)); | |
} | |
printf("\n\n----------\n\nGeneration %d", gen); | |
int aliveCount = 0; | |
for(int a = 0; a < 12; a++) { | |
printf("\n"); | |
for(int b = 0; b < 20; b++) { | |
printf("%c", newWorld[a][b]); | |
if(newWorld[a][b] == 'x') aliveCount++; | |
} | |
} | |
printf("\n----------\n| Alive cells: %d", aliveCount); | |
printf("\n| Still growth: %s", (previousAliveCount == aliveCount) ? "YES" : "NO"); | |
stillGrowthCount = (previousAliveCount == aliveCount) ? stillGrowthCount + 1 : 1; | |
printf("\n| Still growth count: %d", stillGrowthCount); | |
previousAliveCount = aliveCount; | |
} | |
} | |
int main() { | |
game(100); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment