gra w życie - gdzie jest błąd

0

Czy pomoże mi ktoś znaleźć błąd w tym kodzie?
#include <iostream>

using namespace std;

class Plansza
{
private:
int x;
int** T;
public:
Plansza();
~Plansza();
void wypisz();
void sprawdz();

};

Plansza::Plansza()
{
cout<<"Podaj rozmiar planszy \n";
cin>>x;
T=new int*[x];
cout<<"Oznaczenia"<<endl<<"0 - komorka martwa"<<endl<<"1 - komorka zywa"<<endl;
for(int i=0; i<x; i++)
{
T[i]=new int[x];
for(int j=0; j<x; j++)
{
cout<<"Podaj element "<<i<<j<<endl;
cin>>T[i][j];
}
}
}

Plansza::~Plansza()
{
for(int i=0; i<x; i++)
{
delete [] T[i];
}
delete [] T;
}

void Plansza::wypisz()
{
cout<<"Plansza: "<<endl;
for(int i=0; i<x; i++)
{
for(int j=0; j<x; j++)
{
cout<<T[i][j]<<" ";
}
cout<<endl;
}
}

void Plansza::sprawdz()
{
for(int i=0; i<x; i++)
{
for(int j=0; j<x; j++)
{
int licznik=0;
if(i==0)
{
if(j==0)
{
if(T[i][j]==0)
{
if(T[i][j+1]==1) licznik++;
if(T[i+1][j]==1) licznik++;
if(T[i+1][j+1]==1) licznik++;
if(licznik==3)
{
T[i][j]==1;
}
}
else if(T[i][j]==1)
{
if(T[i][j+1]==1) licznik++;
if(T[i+1][j]==1) licznik++;
if(T[i+1][j+1]==1) licznik++;
if(licznik<2)
{
T[i][j]==0;
}
}

                            }
                            else
                            {
                                    if(T[i][j]==0)
                                    {
                                                  if(T[i][j-1]==1) licznik++;
                                                  if(T[i][j+1]==1) licznik++;
                                                  if(T[i+1][j-1]==1) licznik++;
                                                  if(T[i+1][j]==1) licznik++;
                                                  if(T[i+1][j+1]==1) licznik++;
                                                  if(licznik==3)
                                                  {
                                                                T[i][j]==1;
                                                  }
                                    }
                                    else if(T[i][j]==1)
                                    {
                                                  if(T[i][j-1]==1) licznik++;
                                                  if(T[i][j+1]==1) licznik++;
                                                  if(T[i+1][j-1]==1) licznik++;
                                                  if(T[i+1][j]==1) licznik++;
                                                  if(T[i+1][j+1]==1) licznik++;
                                                  if(licznik<2 || licznik>4)
                                                  {
                                                                T[i][j]==0;
                                                  }
                                    }   
                                    else if(j==x-1)
                                    {
                                         if(T[i][j]==0)
                                         {
                                                  if(T[i][j-1]==1) licznik++;
                                                  if(T[i+1][j]==1) licznik++;
                                                  if(T[i+1][j-1]==1) licznik++;
                                                  if(licznik==3)
                                                  {
                                                                T[i][j]==1;
                                                  }
                                         }
                                         else if(T[i][j]==1)
                                         {
                                                  if(T[i][j-1]==1) licznik++;
                                                  if(T[i+1][j]==1) licznik++;
                                                  if(T[i+1][j-1]==1) licznik++;
                                                  if(licznik<2)
                                                  {
                                                                T[i][j]==0;
                                                  }
                                         }
                                    }
                            }
                    }
                    else if(i==x-1)
                    {
                            if(j==0)
                            {
                                    if(T[i][j]==0)
                                    {
                                                  if(T[i][j+1]==1) licznik++;
                                                  if(T[i-1][j]==1) licznik++;
                                                  if(T[i-1][j+1]==1) licznik++;
                                                  if(licznik==3)
                                                  {
                                                                T[i][j]==1;
                                                  }
                                    }
                                    else if(T[i][j]==1)
                                    {
                                                  if(T[i][j+1]==1) licznik++;
                                                  if(T[i-1][j]==1) licznik++;
                                                  if(T[i-1][j+1]==1) licznik++;
                                                  if(licznik<2)
                                                  {
                                                                T[i][j]==0;
                                                  }
                                    }
                                    
                            }
                            else if(j==x-1)
                            {
                                    if(T[i][j]==0)
                                    {
                                                  if(T[i][j-1]==1) licznik++;
                                                  if(T[i-1][j]==1) licznik++;
                                                  if(T[i-1][j-1]==1) licznik++;
                                                  if(licznik==3)
                                                  {
                                                                T[i][j]==1;
                                                  }
                                    }
                                    else if(T[i][j]==1)
                                    {
                                                  if(T[i][j-1]==1) licznik++;
                                                  if(T[i-1][j]==1) licznik++;
                                                  if(T[i-1][j-1]==1) licznik++;
                                                  if(licznik<2)
                                                  {
                                                                T[i][j]==0;
                                                  }
                                    }
                                    
                            }
                            else
                            {
                                    if(T[i][j]==0)
                                    {
                                                  if(T[i][j-1]==1) licznik++;
                                                  if(T[i][j+1]==1) licznik++;
                                                  if(T[i-1][j-1]==1) licznik++;
                                                  if(T[i-1][j]==1) licznik++;
                                                  if(T[i-1][j+1]==1) licznik++;
                                                  if(licznik==3)
                                                  {
                                                                T[i][j]==1;
                                                  }
                                    }
                                    else if(T[i][j]==1)
                                    {
                                                  if(T[i][j-1]==1) licznik++;
                                                  if(T[i][j+1]==1) licznik++;
                                                  if(T[i-1][j-1]==1) licznik++;
                                                  if(T[i-1][j]==1) licznik++;
                                                  if(T[i-1][j+1]==1) licznik++;
                                                  if(licznik<2 || licznik>4)
                                                  {
                                                                T[i][j]==0;
                                                  }
                                    }   
                            }
                    }
                    if(j==0)
                    {
                                    if(T[i][j]==0)
                                    {
                                                  if(T[i-1][j]==1) licznik++;
                                                  if(T[i-1][j+1]==1) licznik++;
                                                  if(T[i][j+1]==1) licznik++;
                                                  if(T[i+1][j]==1) licznik++;
                                                  if(T[i+1][j+1]==1) licznik++;
                                                  if(licznik==3)
                                                  {
                                                                T[i][j]==1;
                                                  }
                                    }
                                    else if(T[i][j]==1)
                                    {
                                                  if(T[i-1][j]==1) licznik++;
                                                  if(T[i-1][j+1]==1) licznik++;
                                                  if(T[i][j+1]==1) licznik++;
                                                  if(T[i+1][j]==1) licznik++;
                                                  if(T[i+1][j+1]==1) licznik++;
                                                  if(licznik<2 || licznik>4)
                                                  {
                                                                T[i][j]==0;
                                                  }
                                    }   
                    }
                    else if(j==x-1)
                    {
                                    if(T[i][j]==0)
                                    {
                                                  if(T[i-1][j-1]==1) licznik++;
                                                  if(T[i-1][j]==1) licznik++;
                                                  if(T[i][j-1]==1) licznik++;
                                                  if(T[i+1][j]==1) licznik++;
                                                  if(T[i+1][j-1]==1) licznik++;
                                                  if(licznik==3)
                                                  {
                                                                T[i][j]==1;
                                                  }
                                    }
                                    else if(T[i][j]==1)
                                    {
                                                   if(T[i-1][j-1]==1) licznik++;
                                                  if(T[i-1][j]==1) licznik++;
                                                  if(T[i][j-1]==1) licznik++;
                                                  if(T[i+1][j]==1) licznik++;
                                                  if(T[i+1][j-1]==1) licznik++;
                                                  if(licznik<2 || licznik>4)
                                                  {
                                                                T[i][j]==0;
                                                  }
                                    }   
                    }
                    else
                    {
                        if(T[i][j]=0)
                        {
                                 if(T[i][j-1]==1) licznik++;
                                 if(T[i][j+1]==1) licznik++;
                                 if(T[i-1][j-1]==1) licznik++;
                                 if(T[i-1][j]==1) licznik++;
                                 if(T[i-1][j+1]==1) licznik++;
                                 if(T[i+1][j-1]==1) licznik++;
                                 if(T[i+1][j]==1) licznik++;
                                 if(T[i+1][j+1]==1) licznik++;
                                 if(licznik==3)
                                 {
                                               T[i][j]==1;
                                 }
                        }
                        if(T[i][j]=1)
                        {
                                 if(T[i][j-1]==1) licznik++;
                                 if(T[i][j+1]==1) licznik++;
                                 if(T[i-1][j-1]==1) licznik++;
                                 if(T[i-1][j]==1) licznik++;
                                 if(T[i-1][j+1]==1) licznik++;
                                 if(T[i+1][j-1]==1) licznik++;
                                 if(T[i+1][j]==1) licznik++;
                                 if(T[i+1][j+1]==1) licznik++;
                                 if(licznik<2 || licznik>=4)
                                 {
                                               T[i][j]==0;
                                 }
                        }
                    }
            }
    }

}

int main()
{
Plansza p;
p.wypisz();
p.sprawdz();
p.wypisz();
system ("pause");
return 0;
}
Z góry dziękuje za pomoc

0

Nie, bo ten kod wygląda strasznie ( złe wcięcia jednak miło, że chociaż próbowałaś ) i nie opłaca się szukać błędów w tym kodzie bo on cały nadaje się do wywalenia. Lepiej zacznij od początku.

0

chodzi mi tylko o metodę o nazwie sprawdz, bo na niej wywala mi sie błąd, nie jestem programistka, jestem tylko biednym matematykiem, któremu każą tworzyc takie cos, czy ktoś mi powie co jest nie tak w funkcji sprawdź

0

tzn, nie o te wszystkie ify, tylko w funkcji main, czy dobrze wywołałam tą sprawdź

0

To ciekawe. Bo zawsze myślałem że nauka matematyki to nauka myślenia. Zgaduję że całą tą funkcje sprawdź można skrócić do 10 max 15 linijek, bez kopiowania ifów...
Nie dziw się że nikt się tego nie tknie. Nie ma sensu rzeźbić w gównie...

0

Ta funkcja sprawdź jest dość toporna - rozważasz wszystkie przypadki. Mozna wykombinować ogólną metodę na sprawdzenie liczby żywych sąsiadów. Wycinek z mojego programu:

int Beings::neighbours(int x, int y) {
    int lives = 0;

    if(x < _x-1 && current[y*_x+x+1]) {
        lives++;
    }
    if(x > 0 && current[y*_x+x-1]) {
        lives++;
    }

    if(y>0 && current[ (y-1)*_x+x]) {
        lives++;
    }
    if(y < _y-1 && current[(y+1)*_x+x]) {
        lives++;
    }

    if(y>0 && x > 0 && current[(y-1)*_x+x-1]) {
        lives++;
    }
    if(y< _y-1 && x > 0 && current[(y+1)*_x+x-1]) {
        lives++;
    }

    if(y>0 && x < _x-1 && current[(y-1)*_x+x+1]) {
        lives++;
    }
    if(y< _y-1 && x < _x-1 && current[(y+1)*_x+x+1]) {
        lives++;
    }

    return lives;
}

Akurat ostatnio też chcę napisać sobie ten program, zapraszam do sprawdzenia: http://tinyurl.com/2vbr44s

0

nie wiem czemu środowisko programistów jest takie niemiłe, nie trzeba od razu obrażać innych tylko dlatego że nie potrafią czegoś zrobic tak jak wy...

0

@Magda problem nie w tym że nie umiesz tego zrobić "tak jak my", a w tym że nie umiesz tego zrobić tak jak powinno się to zrobić. Jako matematyczka powinnaś umieć odszukać pewne zależności, a nie wstawiać wszystkie możliwe przypadki.
Rozumiem że jak liczysz jakieś prawdopodobieństwo to wypisujesz sobie wszystkie przypadki i liczysz ile ich jest? Nie, najpierw MYŚLISZ nad zadaniem i starasz się wyszukać odpowiednie zależności. W programowaniu nie jest inaczej. Rozumiem że gdybym wpadł do ciebie z takim zadankiem z prawdopodobieństwa z wypisanymi na przykład 300 przypadkami i spytał: "gdzie się pomyliłem?", "którego przypadku mi brakuje?" to z uśmiechem na twarzy byś mi to sprawdziła? Czy może jednak popukałabyś sie w głowę i powiedziała "policz to jeszcze raz, ale tym razem jak człowiek"?

0

Mi nie chodzi o te ify, program mi się kompiluje, wpisuje mu liczby, wypisuje mi tablice i nagle mi się wyłącza

0

Czy ty tak poważnie? Program sie nie wyłącza a wysypuje. A gdzie? Ano niestety ale na tych twoich nieszczęsnych ifach.
Wracając do kodu:
co wg ciebie znaczy:

if(licznik==3)
{
  T[i][j]==1;
}

Czy czasem nie miało tam być znaku równości (przypisania)?
A takie cos:

if(T[i][j]=0)

Czy tam czasem nie miało być dwóch znaków równości (porównania?)
I to wszystko podpowiedział mi kompilator w chwili kompilacji. Nie sądzisz że warto CZYTAĆ co on tam sobie wypisuje?...
To oczywiście nie naprawi błędów w algorytmie, ale może zbliży cię do poprawnego rozwiązania.

Szybki rzut okiem po tych ifach i ewidentne błędy:

  • nagminne przekraczanie zakresu tablic. Skoro mamy j<x to zabawy tab[j+1] to terroryzm... tak samo robisz z x'em że robisz sobie -1 i +1 w ogóle nie sprawdzając czy czasem nie miałaś tam 0 albo maxa.

Moja rada: skasować ten kod. Napisać od nowa, używając nie tylko paluszków do klepania po klawiaturze (i wciskania ctrl+c i ctrl+v) ale także mózgu.

0

magdo, nie unoś się bo nie o to chodzi. Problem polega na tym, że prosisz nas o pomoc, a odpowiedź możesz mieć wypisaną na swoim komputerze. Podczas procesu kompilacji w środowisku, w którym piszesz pojawiać się powinny błędy oraz warningi, one ci powiedzą co masz źle składniowo. Ten kod nie ma prawa działać poprawnie w takiej formie. Jeśli natomiast miałabyś bezbłędny kod to twój problem zapewne leżałby w samym algorytmie, który już ty sama powinnaś doskonale znać bądź opracować. Jeśli nie potrafisz sobie poradzić z błędem składniowym lub coś zwraca ci środowisko i nie masz pojęcia co to jest to wrzuć przede wszystkim w pytaniu treść informacji ( wszystko co uważasz, że może nam się przydać. Lepiej pokazać więcej niż mniej ) i opisz dokładnie problem, co się sypie gdzie, w którym momencie gdy co zrobisz itd. W tedy nikt się nie będzie czepiał. Czytelność kodu to już inna sprawa i również powinnaś to poprawić.

0

no właśnie za każdym razem wypisują się błędy, a tym razem nic nie wypisało, tylko się skompilowało i "wysypuje" się dopiero w momencie gdy uruchamia się ta głupia funkcja sprawdź :(

0

Nie błędy a OSTRZEŻENIA się wypisują. Jakby były błędy to by się nie kompilowało...
http://4programmers.net/Pastebin/862
wersja bez żadnego warininga (usunąłem te błędne użycia porównań i przypisań).
Ale program nadal nie działa bo ALGORYTM JEST BŁĘDNY.
Poza tym algorytm jest napisany tak że NIE DA się go poprawić.

0

dziekuje za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1