Witam,
Chciałbym użyć metodę Set w kodzie poniżej. Jednak przy wywołaniu pozostałe elementy przyjmują wartość -842150451. Jak temu zaradzić ?
main
#include <stdio.h>
#include <iostream>
#include "life.h"
using namespace std;
int main()
{
char c; // przechowuje znak z klawiatury
CLife s(10, 10);
s.Initialize();
// przykład użycia funkcji Set(int, int), można wtedy zakomentować s.Initialize();, by ustawić własne żywe komórki startowe
//s.Set(0,0);
//s.Set(1,0);
//s.Set(2,0);
cout << "Naciśnij ENTER, by zacząć grę lub dowolny klawisz i ENTER, by zakończyć grę.";
c = getchar(); // pobiera znak z klawiatury
// główna pętla programu
while(c == '\n')
{
s.Show();
s.Next();
cout << "Naciśnij ENTER, by kontynuować lub dowolny klawisz i ENTER, by zakończyć grę.";
c = getchar();
}
return 0;
}
life.h
#ifndef LIFE_H
#define LIFE_H
class CLife
{
int Nx, // liczba wierszy
Ny, // liczba kolumn
N; // Nx*Ny
int i, x, y, c, l; // zmienne pętli
int *map, // wskaźnik plansza // 1 - żywa komórka, 0 - martwa komórka
*buf; // wskaźnik bufor planszy do obliczeń //
int nr, // numer pokolenia (zliczanie od 0)
nn; // liczba sąsiadów komórki
public:
CLife();
CLife(int Nx, int Ny);
~CLife();
void Initialize();
void Show();
void Next();
int X(int x);
int Y(int y);
void Set(int x, int y);
};
#endif // LIFE_H
life.cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "life.h"
using namespace std;
// konstruktor bezargumentowy (tworzy planszę 10x10)
CLife::CLife()
{
nr = 0; // ustawia numer pokolenia na 0
Nx = 10;
Ny = 10;
N = Nx*Ny;
map = new int[N]; // tworzy tablicę dynamiczną planszy
buf = new int[N]; // tworzy tablicę dynamiczną bufora planszy
}
// konstruktor z argumentami (Nx - ustala liczbę wierszy, Ny - ustala liczbę kolumn)
CLife::CLife(int Nx, int Ny)
{
nr = 0;
this->Nx = Nx;
this->Ny = Ny;
N = Nx*Ny;
map = new int[N];
buf = new int[N];
}
void CLife::Initialize()
{
srand( time( NULL ) ); // inicjalizacja generatora liczb pseudolosowych
for(i = 0; i < N; i++) *(map+i) = rand()%2; // nadaje wartość 0 (brak życia) lub 1 (jest życie) komórkom planszy
}
// wypisuje planszę w konsoli
void CLife::Show()
{
cout << endl;
cout << "Pokolenie: " << nr << endl;
for(y = 0; y < Ny; y++)
{
for(x = 0; x < Nx; x++)
{
cout << *(map+y*Ny+x) << " ";
}
cout << endl;
}
}
// wylicza nowe pokolenie organizmów do *buf, przenosi *buf do *map
void CLife::Next()
{
for(x = 0; x < Nx; x++)
for(y = 0; y < Ny; y++)
{
nn = 0; // liczba sąsiadów komórki
// oblicza liczbę sąsiadów komórki [x,y]
for(c = -1; c < 2; c++)
for(l = -1; l < 2; l++)
if(((c != 0) || (l != 0)) && (*(map+Y(y + l)*Ny+X(x + c)) == 1)) nn++;
// sprawdza reguły przeżycia komórki lub narodzin nowej
if(*(map+y*Ny+x) == 1) // gdy komórka żywa
{
if((nn == 2) || (nn == 3)) *(buf+y*Ny+x) = 1;
else *(buf+y*Ny+x) = 0;
}
else // gdy komórka martwa
{
if(nn == 3) *(buf+y*Ny+x) = 1;
else *(buf+y*Ny+x) = 0;
}
}
// przenosimy *buf do *map
for(i = 0; i < N; i++) *(map+i) = *(buf+i);
nr++; // zwiększa numer pokolenia o 1
}
// wylicza współrzędną x w obrębie pola gry
int CLife::X(int x)
{
if(x == Nx) x = 0;
if(x < 0) x = Nx-1;
return x;
}
// wylicza współrzędną y w obrębie pola gry
int CLife::Y(int y)
{
if(y == Ny) y = 0;
if(y < 0) y = Ny-1;
return y;
}
// ustawia w punkcie [x, y] żywą komórkę
void CLife::Set(int x, int y)
{
*(map+y*Ny+x) = 1;
}
//zwalnia pamięć map oraz buf
CLife::~CLife()
{
delete [] map;
delete [] buf;
}