[C++] Dwuwymiarowa tablica obiektów klasy.

0

Witam,

Mam za zadanie napisać program warcaby, ale bez żadnej sztucznej inteligencji. Po prostu ma to być dla 2 graczy. I ma to być w konsoli. Z językiem C++ dopiero zaczynam przygodę. Wcześniej było Delphi i Java. Ale dobra, przejdźmy do sedna. Otóż stworzyłem klasę CPionek, wygląda ona na razie tak:

class CPionek
{
  private:
        int kolor;   // 0 - bialy, 1 - czarny
        bool dama;   // czy pionek jest dama?

  public:
        CPionek(int k);
        int GetKolor();
        bool GetDama();
        void Ruch();
};

A tu jej implementacja:

CPionek::CPionek (int k):
kolor(k),
dama(false)
{
};

int CPionek::GetKolor()
{
  return kolor;
};

bool CPionek::GetDama()
{
  return dama;
};

Więc jak na razie nic szczególnego jeszcze tu nie ma. Ale mam problem ze stworzeniem tablicy obiektów z klasy CPionek, która będzie moją planszą. Robię to tak:

CPionek** plansza;

#pragma argsused
int main(int argc, char* argv[])
{
    plansza = new CPionek* [N];
    for(int i=0;i<N;i++)
      plansza[i] = new CPionek [N];

  getch();

  return 0;
}

Przy próbie kompilacji wyskakuje mi taki oto błąd:
[C++ Error] Main.cpp(22): E2248 Cannot find default constructor to initialize array element of type 'CPionek'

Czyli nie może znaleźć domyślnego konstruktora. Gdy stworzyłem mu domyślny konstruktor:

CPionek::CPionek()
{
};

to wszystko zadziałało, stworzyła się tablica dwuwymiarowa, jednak mi zależało, żeby była ona w całości wypełniona NULLami. Bo teraz gdy próbuję z jakiegoś pola wyciągnąć kolor to wyświetla się wartość 0. Przy próbie przypisania NULL do wszystkich pól tablicy, a następnie przy prostym sprawdzeniu:

if (plansza[1][2]==NULL)
  {
    std::cout << "null";
  }

wyskakuje błąd:
[C++ Error] Main.cpp(33): E2094 'operator==' not implemented in type 'CPionek' for arguments of type 'int'

Nie wiem za bardzo jak sobie z tym poradzić. A wiadomo, że w warcabach pionki nie stoją na wszystkich polach, więc potrzebne to będzie do sprawdzania, czy na danym polu stoi pionek, czy nie. Jeżeli nie ma tam pionka to chcę, aby można było to spradzić przez przyrównanie do NULLa, bo chyba tak najlepiej. A może ktoś ma jakiś inny pomysł na rozwiązanie tego. Bardzo proszę o pomoc.

0

Bo dzięki domyślnemu konstruktorowi cała tablica jest wypełniona Pionkami a nie NULLami.
Albo przeładuj sobie operator == w klasie i zrób skladową która odpowiada za to czy pionek jest czy nie.
Albo (lepiej) zrób osobną klasę Plansza, która będzie przechowywać tablicę - planszę oraz np. boolowską tablicę określającą czy pionek jest czy też go nie ma w danym miejscu.

Najpierw PRZEMYŚL problem, a potem zabieraj się za pisanie ;)

0

CPionek** plansza;

#pragma argsused
int main(int argc, char* argv[])
{
plansza = new CPionek* [N];
for(int i=0;i<N;i++)
plansza[i] = NULL;

getch();

return 0;
}

0

A po co klasa na pionek? Ja bym po prostu zdefiniował enuma i tablicę tych enum'ów.

const int BoardSize = 8;
const int MaxRowBlackFieldCount = (BoardSize+1)/2;

enum Field {
     Empty, /* puste pole */
     WhitePawn=2, /*2*/ /* bit zerowy (najmłodszy oznacza kolor) kolejny bit oznacza, że to pion*/
     BlackPawn, /*3*/
     WitheQuen, /*4*/ /* a następny bit oznacza, że to królowa - damka */
     BlackQuen  /*5*/
};

class Game {
private:
    Field board[MaxRowBlackFieldCount][MaxRowBlackFieldCount];

public:
     ....
     void restartGame();
     bool endOfGame();
     bool move(int fromX, int fromY, int toX, int toY);
     ....
};
0

Dzięki za pomoc, myślałem, że pionek ma być obiektem, bo tak się dogadałem z moim wykładowcą, że ma być to obiektowo, aby zaliczyć przedmiot. Ale myślę, że z tego też będzie zadowolony.

Tylko nie bardzo rozumiem tej tablicy board i jej zakresu.

0

Pionki i damka poruszają się tylko po czarnych polach, więc efektywnie masz planszę 4 na 4, tyle że reguły poruszania się mogą ci się wydać pokręcone.
Jeśli będzie ci łatwiej zrób plansze 8 na 8 marnując co drugą komórkę.

Zresztą teraz widzę, że pokręciłem bo powinno być:

Field board[BoardSize][MaxRowBlackFieldCount];
0

No teraz rozumiem. Tylko w tej linijce:

const int MaxRowBlackFieldCount = (BoardSize+1)/2;

po co do BoardSize dodajemy 1?

0

tak na wszelki wypadek jeśli ktoś wpadłby na pomysł ustalenia BoardSize na nieparzystą wartość.

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