Skip to content

Instantly share code, notes, and snippets.

@xkrsz
Last active April 1, 2017 03:29
Show Gist options
  • Save xkrsz/6de9c8b7f76b53cad72e2cf279cc7e46 to your computer and use it in GitHub Desktop.
Save xkrsz/6de9c8b7f76b53cad72e2cf279cc7e46 to your computer and use it in GitHub Desktop.
Gra w życie
/*
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