Zunifikowana tablica wskaźników do obiektów

Odpowiedz Nowy wątek
2011-05-14 16:11
0

Chcę napisać prostą, konsolową grę planszową - coś na wzór alkohińczyka. Po skompliowaniu programu wyświetla się: "Program alkohińczyk.exe przestał działać... ble ble ble". Mam w planie stworzyć jedną virtualną klasę bazową pole a w klasach które będą z niej dziedziczyć wyświetlać dodatkowo konkretny dla rodzaju pola napis i wykonywać charakterystyczne działanie. Póki co mam zunifikowaną tablicę wskaźników która niestety nie chce działać. Dodam że kiedy tablica zawierała obiekty a nie wskaźniki bylo ok. Program działał (póki co przesuwał pionki po planszy ;) ). Co jest nie tak?? Wczesniej pisałem program opierajacy się na tej samej zasadzie i wszystko działało. Oto kod:

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

void gotoxy(int x, int y)
{
COORD cord;
cord.X = x;
cord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cord);
}

class pole {
public:
       pole() {wartosc=0; pionek1=0; pionek2=0; pionek3=0; pionek4=0;}

       int zwx()          {return x;}

       void pocz()  {pionek1=1;pionek2=1;pionek3=1;pionek4=1;}

       void wprowWartosc(int a) {wartosc=a;}

       void wprowX(int b) {x=b;}

       void wprowY(int c) {y=c;}

       void wprowP1(int d) {pionek1=d;}

       void wprowP2(int e) {pionek2=e;}

       void wprowP3(int f) {pionek3=f;}

       void wprowP4(int g) {pionek4=g;}

      // virtual void zadanie() = 0;
      // virtual void dzialanie() = 0;

       void rysuj() {gotoxy(x,y);
                     cout << " ____";
                     gotoxy(x,y+1);

                     cout << "|";
                     if (wartosc<=9) cout << wartosc << " "; else cout << wartosc;  
                     cout << "  |";
                     gotoxy(x,y+2);
                     cout << "| ";
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
                     if ((pionek1==1) && (pionek2==0)) cout << "A ";
                     else if ((pionek1==1) && (pionek2==1)) 
                     {
                     cout << "A";
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 5);
                     cout << "B";
                     } 
                     else if ((pionek1==0) && (pionek2==1))
                     {
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 5);
                     cout << " B";
                     }
                     else cout << "  ";
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
                     cout << " |" << endl;
                     gotoxy(x,y+3); 
                     cout << "|_";
                     if ((pionek3==1) && (pionek4==0)) 
                     {
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 6);
                     cout << "C"; 
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
                     cout << "_";
                     }
                     else if ((pionek3==1) && (pionek4==1)){
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 6);
                     cout << "C";
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 9);
                     cout << "D"; 
                     }
                     else if ((pionek3==0) && (pionek4==1))
                     {
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15); 
                     cout << "_";
                      SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),9);
                     cout << "D";
                     }
                     else
                     {
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
                     cout << "__";
                     }
                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
                     cout << "_|" << endl;
                     }  

private:
         int wartosc,pionek1,pionek2,pionek3,pionek4,x,y;

};

pole* p[50];

class poleZwykle: public pole {
};
class poleNiespodzianka: public pole {
};
class poleKara: public pole {
};
class poleDopalacz: public pole {
};

int main()
{
    int zy=0,i,j,zx=0,pomoc=0,kostka, wybor=1, pomoc2=1;
    p[1]->pocz();

poleZwykle* pz = new poleZwykle;
poleKara* pk = new poleKara;
poleDopalacz* pd = new poleDopalacz;
poleNiespodzianka* pn = new poleNiespodzianka;

for(i=2;i<50;i++)
{
if (i%10==0) p[i]=pz;
else if  (i%10==9) p[i]=pk;
else if (i%10==8) p[i]=pd;
else p[i]=pn;

}    
    for (i=1;i<51;i++)
        {
        p[i]->wprowWartosc(i);
        }
for(j=1;j<6;j++)
{
for (i=1;i<11;i++)
        {
        p[i+pomoc]->wprowX(zx);
        zx=zx+5;
        p[i+pomoc]->wprowY(zy);
        }
zy=zy+4;
zx=0;
pomoc=pomoc+10;
}
p[50]->wprowX(45);
p[50]->wprowY(16);

int a=1, b=1, c=1, d=1, kolejka=1;

while(!wybor==0)
{
srand(time(NULL));
kostka=rand() % 6;

if (kolejka%4==1)  // wybór który gracz sie przesuwa
{
p[a]->wprowP1(0);
a=a+kostka+1;
p[a]->wprowP1(1);   
}
else if (kolejka%4==2)
{
p[b]->wprowP2(0);
b=b+kostka+1;
p[b]->wprowP2(1);
}
else if (kolejka%4==3)
{
p[c]->wprowP3(0);
c=c+kostka+1;
p[c]->wprowP3(1);   
}
else
{
p[d]->wprowP4(0);
d=d+kostka+1;
p[d]->wprowP4(1);   
}
kolejka=kolejka+1;

    for (i=1;i<51;i++)
        {
        p[i]->rysuj();
        }

gotoxy(60,2);
cout <<  "Kostka: " <<  kostka+1;
gotoxy(60,4);
cout << "0 - wyjscie";
gotoxy(60,5);
cout << "1 - dalej";
gotoxy(60,6);
cout << "Wybor: ";
cin >> wybor;
system("cls");
}             

return 0;
}

Pozostało 580 znaków

2011-05-14 16:19
0

Nie analizowałem całego kodu, ale masz tablicę pole* p[50]; - te wskaźniki nie wskazują na nic konkretnego w tym momencie, a Ty od razu co robisz? p[1]->pocz(); ;)


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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