• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Tablica zmiennych globalnych w pliku nagłówkowym. Błąd w odczycie danych w definicji metod.

Cloud VPS
0 głosów
316 wizyt
pytanie zadane 24 lutego 2018 w C i C++ przez Poczprogramista123 Bywalec (2,900 p.)
zamknięte 24 lutego 2018 przez Poczprogramista123

Witam. Pisze grę Tron z użyciem bliblioteki SFML i w celu określenia gdzie gracz zostawił ślad stworzyłem mapę w oparciu na tablicy dwuwymiarowej typu bool. Jak sie pewnie domyślacie na początku cała tablia jest wypełniona wartością false a tam gdzie gracz zostawił ślad zmieniamy na true, proste. Jenak zalerzało mi by ta gra była napisana obiektowo (Jest to moja pierwsza gra OOP) i dodatkowo podzielona na kilka plików. Wiec stworzyłem plik nagłówkowy i w nim wszystkie potrzebne deklaracje klas. I teraz sedno sprawy. Zadeklarowałem w tym pliku nagłówkowym  tą tablice z użyciem "extern" i póżniej w pliku z definicjami metod klas zdefiniowałem. I teraz cały problem.

Plik .cpp z definicjami metod klas


const int W=800;//X
const int H=600;//Y
bool pole[600][800];
int Gracz::liczbaobiektow=1;
/////////////////////////////////////////////////////
/// KLASA GRACZ
Gracz::Gracz(Color color,int kierunek,int xpocztkowy,int ypoczatkowy)
    {
        if(liczbaobiektow==1) 
/// by nie ustawiało tablicy dla nowych obietkow bo poco
        for(int i=0; i<H; i++)
        for(int j=0; j<W; j++)
        pole[i][j]=false;
        liczbaobiektow++; 

/// NIZEJ RESZTA KODU NIE ISTOTNA

}

void Gracz::ruch()
/// wazna metoda ustawia obecna pozycje gracza na true i zmienia pozycje
    {
        pole[y][x]=true;
/// i to powinno na stale zmienic ta zmienna o takich indeksach
   
        /// GORA DOL
        if (dir==0)y+=1;
        if (dir==3)y-=1;

        /// NA BOKI
        if (dir==1)x-=1;
        if (dir==2)x+=1;

        /// jak wyjdzie na bok
        if (x>=W) x=0;
        if (x<0)  x=W-1;
        if (y>=H) y=0;
        if (y<0) y=H-1;
    }

void Gracz::czykolizja()/// SEDNO PROBLEMU
    {
        if (pole[y][x])
/// I NIE OGARNIAM CZEMU TEN IF SIE NIE WYKONUJE
        {
            this->czyprzegral=true;
            return;
        }

Jak pokazałem nie rozumiem czemu ten "if" się nie wykonuje. Przecierz jest to tablica globalna i zmiana jej wartosci w metodzie "ruch()" powinna być widoczna wszędzie. W momencie kiedy linia gracza nalorzy sie na linie swoja albo przeciwnika to przecierz to miejsce powino miec wartość true. Pewnie coś źle robie w deklaracji tablicy ale nie wiem. Wiem że stosowanie zmiennych globalnych jest słabym pomysłem i próbowałem rozwiazać ten problem tworząc taką tablice w klasie "Gracz" static bool pole[600][800], ale nie wiem czy takie coś w ogole istnieje. Brałem to na logike bo static mówi że jest to zmienna która jest dla wszystkich obiektow tej klasy i jest tworzona tylko raz a jednoczesnie miałbym ta tablice schowana w klasie. Jeśli obrałem zła drogę to będę wdzieczny za wskazanie nowej. Dziękuje za pomoc i liczę na wyrozumiałość.

komentarz zamknięcia: Rozwiazane
komentarz 24 lutego 2018 przez Poczprogramista123 Bywalec (2,900 p.)
Dobra juz problem rozwiazalem. Zamiast takiej deklaracji w pliku naglowkowym extern bool pole[600][800] to zamiast extern uzylem static i wszystko dziala.

Podobne pytania

+1 głos
3 odpowiedzi 2,969 wizyt
pytanie zadane 5 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
3 odpowiedzi 458 wizyt
pytanie zadane 30 marca 2016 w C i C++ przez TheFeniks Gaduła (4,690 p.)
0 głosów
0 odpowiedzi 750 wizyt
pytanie zadane 17 kwietnia 2019 w C# przez WojMen Początkujący (330 p.)

93,483 zapytań

142,417 odpowiedzi

322,763 komentarzy

62,895 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...