Gra w życie

0

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;
} 
 
0
  1. po kiego masz int map i int buf skoro potrzebujesz tylko bool, wtedy całość się upraszcza.
  2. gdzie inicjalizujez zerami mapę i bufor? Nie zainicjalizowałeś - masz śmiecie.

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