Witam, muszę napisać program Gra w życie z dodatkowymi zasadami darwinii (komórka żyje nie dłużej, niż przez określony czas) i quadlife (kolorowanie komórek). Jest to pierwszy tego rozmiaru projekt jaki piszę, i mam niestety kłopoty : /
Problem leży w tym, że kod który napisałem zdaje się nie uśmiercać komórki jeżeli ta ma zbyt dużo/mało komórek - sąsiadów; zabija je jedynie gdy komórka robi się odpowiednio stara (a więc tylko przestrzega zasad darwinii... ). Przeglądałem program już -naście razy, i nadal nie wiem, w czym leży problem. Czy ktoś byłby tak miły, zerknął na kod i mógł mi podpowiedzieć co robię 'źle' i jak to poprawić ?
Piszę w Dev C++ na Win7.
Kod źródłowy
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define N 12
struct cell{
int neighbors;//liczba sąsiadów
int lifeStatus;//zywa/martwa
int lifeTime;//wiek
int color;//kolor
};
struct cell komorka[N][N];
//=====PROGRAM=====
int main()
{
int i, j, rColor, nCounter, stept, next, b, g, r, y;
srand(time(NULL));
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x70 ));//białe tło, czarna czcionka
printf("Nacisnij dowolny przycisk aby zaczac...");
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x07 ));//czane tło, biała czcionka
getchar();
//---------------------------------tworzenie świata---------------------------------
for(i = 0; i <= N; ++i)
{
for(j = 0; j <= N; ++j)
{
if(i == 0 || j == 0 || i == N || j == N )//jeżeli komórki są na skraju świata...
{
(komorka[i][j].lifeStatus) = 0;//...nadaj im status martwych...
}
else
{
(komorka[i][j].lifeStatus) = (rand()%2);//...w przeciwnym wypadku, losuj status żywe-1/martwe-0
}
if( (komorka[i][j].lifeStatus) == 1)//jeżeli komórka zyje...
{
(komorka[i][j].lifeTime) = 1;//...przypisz jej lifeTime == 1
}
}
}
//---------------------------------drukowanie świata po raz pierwszy---------------------------------
for(i = 0; i <= N; ++i)
{
for(j = 0; j <= N; ++j)
{
if(i == 0 || j == 0 || i == N || j == N)//jeżeli komórki są na skraju świata, nic nie rób
{
;
}
else
{
if( (komorka[i][j].lifeStatus) == 0)//jeżeli lifeStatus == 0, to drukuj białe X; komórki są martwe
{
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x07 ));
printf(" X ");
}
else//jeżeli lifeStatus == 1, to drukuj O i losuj kolor z czterech:
{
rColor = (rand()%4);
switch(rColor)
{
case 0:
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x01));//niebieski
komorka[i][j].color = 0;
break;
case 1:
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x02));//zielony
komorka[i][j].color = 1;
break;
case 2:
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x04));//czerwony
komorka[i][j].color = 2;
break;
case 3:
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x06 ));//żółty
komorka[i][j].color = 3;
break;
}
printf(" O ");
}
}
}
printf("\n \n");
}
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x70 ));//białe tło, czarna czcionka
stept = 1;
printf("\n krok %d", stept);
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x07 ));//czarne tło, biała czcionka
getchar();
//---------------------------------początek pętli---------------------------------
//1: zliczyć żywych sąsiadów dla każdej komórki (lifeStatus == 1)
//2: zapisz aktualną liczbę sąsiadów dla każdej komórki
//3: jeżeli lifeTime żywej komórki == 50, zabij komórkę
//4: jeżeli neighbors żywej komórki == 1 lub == 4,5,6,7,8, zabij komórkę
//5: jeżeli neighbors martwej komórki == 3, ożyw komórkę
// 5.1: lifeTime = 1. Ożywiona komórka ma przyjąć kolory większości sąsiadów; jeśli brak większości, nadaj ostatni wolny kolor.
//6: lifeTime++ dla każdej żywej komórki (naliczanie cykli zycia komórek)
//7: czyść ekran i drukuj wyniki
next = 1;
while(next > 0)
{
for(i = 0; i <= N; ++i) //1: zliczyć żywych sąsiadów dla każdej komórki (lifeStatus == 1)
{
for(j = 0; j <= N; ++j)
{
if(i == 0 || j == 0 || i == N || j == N)//jeżeli komórki są na skraju świata, nic nie rób
{
;
}
else
{
nCounter = 0;//licznik sąsiadów == 0
if(komorka[i-1][j-1].lifeStatus == 1) ++nCounter;//góra-lewo
if(komorka[i][j-1].lifeStatus == 1) ++nCounter;//lewo
if(komorka[i+1][j-1].lifeStatus == 1) ++nCounter;//dół-lewo
if(komorka[i-1][j].lifeStatus == 1) ++nCounter;//góra
if(komorka[i+1][j].lifeStatus == 1) ++nCounter;//dół
if(komorka[i-1][j+1].lifeStatus == 1) ++nCounter;//góra-prawo
if(komorka[i][j+1].lifeStatus == 1) ++nCounter;//prawo
if(komorka[i+1][j+1].lifeStatus == 1) ++nCounter;//dół-prawo
(komorka[i][j].neighbors) = nCounter;//2: zapisz aktualną liczbę sąsiadów dla każdej komórki
}
}
}
//---------------------------------akcje dla komórek zywych---------------------------------
for(i = 0; i <= N; ++i)
{
for(j = 0; j <= N; ++j)
{
if(i == 0 || j == 0 || i == N || j == N)//jeżeli komórki są na skraju świata, nic nie rób
{
;
}
else
{
if( (komorka[i][j].lifeStatus) == 1)
{
//3: jeżeli lifeTime żywej komórki == 50, zabij komórkę
if( (komorka[i][j].lifeTime) == 50 )
{
(komorka[i][j].lifeStatus) = 0;
}
//4: jeżeli neighbors żywej komórki == 1 lub == 4,5,6,7,8, zabij komórkę
if( (komorka[i][j].neighbors) == ( 1 || 4 || 5 || 6 || 7 || 8 ) )
{
(komorka[i][j].lifeStatus) = 0;
}
}
}
}
}
//---------------------------------akcje dla komórek martwych---------------------------------
for(i = 0; i <= N; ++i)
{
for(j = 0; j <= N; ++j)
{
if(i == 0 || j == 0 || i == N || j == N )//jeżeli komórki są na skraju świata, nic nie rób
{
;
}
else
{
if( (komorka[i][j].lifeStatus) == 0 )
{
if( (komorka[i][j].neighbors) == 3 )//5: jeżeli neighbors martwej komórki == 3, ożyw komórkę
{
(komorka[i][j].lifeStatus) = 1;//komórka ożywa
(komorka[i][j].lifeTime) = 1;//cykl życia komórki == 1
//tutaj będzie nadawanie kolorów żywym komórkom
}
}
}
}
}
//---------------------------------zwiększanie lifeTime dla żywych komórek---------------------------------
for(i = 0; i <= N; ++i)//6: lifeTime++ dla każdej żywej komórki (naliczanie cykli zycia komórek)
{
for(j = 0; j <= N; ++j)
{
if(i == 0 || j == 0 || i == N || j == N )//jeżeli komórki są na skraju świata, nic nie rób
{
;
}
else
{
if(komorka[i][j].lifeStatus == 1)
{
++(komorka[i][j].lifeTime);
}
}
}
}
//---------------------------------czyszczenie ekranu i drukowanie nowego stanu świata---------------------------------
system("CLS");//7: czyść ekran i drukuj nowe wyniki
for(i = 0; i <= N; ++i)
{
for(j = 0; j <= N; ++j)
{
if(i == 0 || j == 0 || i == N || j == N )//jeżeli komórki są na skraju, nic nie rób
{
;
}
else
{
if( (komorka[i][j].lifeStatus) == 0)//jeżeli lifeStatus == 0, to drukuj białe X
{
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x07 ));
printf(" X ");
}
else//jeżeli lifeStatus == 1, to drukuj kolorowe O
{
//pobierz wartość z (komorka[i][j].color) i wydrukuj wg niej
printf(" O ");
}
}
}
printf("\n \n");
}
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x70 ));//białe tło, czarna czcionka
++stept;
printf("\n krok %d", stept);
(SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), 0x07 ));//czarne tło, biała czcionka
getchar();
}
//---------------------------------koniec pętli---------------------------------
return 0;
}