[C++] Użycie typu wyliczeniowego - projektowanie planszy


(Quentin) #1

Witam!

Mój program ilustruje jakby takie plansze:

schematt.png

(W rzeczywistości jest ich trochę więcej). Posługujemy się w nimi nazewnictwem północ, południe, wschód, zachód.

Moje pytanie dotyczy łączeń pomiędzy tymi planszami. Ustalam je z poziomu kodu źródłowego (nie w run-time) i mam 2 pomysły na to.

Załóżmy, że ustalam łączenie dla planszy 4-tej. Mogę to zrobić tak:

plansza[3].ustaw_poln(plansza[0]);plansza[3].ustaw_wsch(plansza[4]); [/code]

lub tak:

[code=php]plansza[3].polacz_z_planszami(na_polnoc | na_wschod); 


Jeżeli łączyłbym planszę ze wszystkimi dookoła (używałbym 4 kierunków), to w pierwszym przypadku musiałbym pisać 4 linijki, a w drugim jedną (zawsze jedną). To jest zaleta typu wyliczeniowego i alternatywy bitowej. 

Natomiast wada tego rozwiązania to to, że w tej funkcji będę musiał bawić się w odejmowanie i dodawanie numerów plansz. Będę musiał stworzyć nienazwany typ wyliczeniowy i składnik statyczny, który będzie zawierał numer aktualnej planszy i jak np. połączę planszę 4 z planszą z północy to będę musiał zrobić takie odejmowanie:

class Plansza{    Plansza* poln, pold, wsch, zach;    enum { na_polnoc = 0x1, na_poludnie = 0x2, na_wschod = 0x4, na_zachod = 0x8 };  //Północ = 0001, Południe = 0010 itd...    static int nr_planszy;//...    public:    Plansza() : poln(0), pold(0), wsch(0), zach(0) { nr_planszy++; }    //Chcę żeby numeracja zaczynała się od zera,                                                                         //więc obiekt nr_planszy zainicjalizuję na początku -1    void polacz_z_planszami(int z_ktorymi)    {        //...        if(z_ktorymi  na_polnoc)            poln = plansza[nr_planszy - 3];   //O to odejmowanie chodzi    } [/code]



W przypadku wschodu czy zachodu będzie to odpowiednio dodanie 1 lub odjęcie 1. Natomiast w przypadku południa będzie to dodanie 3.



---------------------------------------------------------------------------------------



Które rozwiązanie jest bardziej eleganckie, że tak powiem :?: :lol:

([alex]) #2

Wszystko zależy od tego co to będzie.

Jeżeli masz zawsze przejście do sąsiedniej planszy i zawsze obustronne i zawsze te plansze ustawione na płaszczyźnie to może warto zadawać przejścia dwoma tablicami:

Plansze Tb[ileWierszy][ileKolumn];

bool Pion[ileWierszy-1][ileKolumn]={ {1,0,1} }; // dla tej narysowanej

bool Poziom[ileWierszy][ileKolumn-1]={ {1,0}, {1,1} }; // dla tej narysowanej

więc sprawdzenie czy z planszy (y,x) której numer jest (y*IleKolumn+x+1) można dostać się:

na północ: if(Pion[y-1][x])

na południe: if(Pion[y][x])

na zachód: if(Poziom[y][x-1])

na wschód: if(Poziom[y][x])

Będzie to to samo co twój drugi wariant ale o wiele prostsze.

Jeżeli ilość kolumn nigdy nie przekroczy 64 szt to może warto się zastanowić nad konwersją tablic Pion i Poziom na jednowymiarowe tablicy liczb gdzie przejścia będą zaznaczone bitami.

Jeżeli zaś przewidujesz nieco dziwniejsze przejścia (jednostronne lub teleporty) to tylko pierwszy wariant da sobie rady.