Wielodziedziczenie - figury szachowe

Odpowiedz Nowy wątek
2011-07-21 21:03
Cpp
0

Chcę aby królowa, do wygenerowania swoich możliwych ruchów, skorzystała z funkcji generacyjnej zawartej w Wieży oraz Gońcu. Jak to poprawnie zrobić ?

class Fig
{
        public:
        virtual bool gen() = 0;
};
 
class Rock: public Fig
{
        public:
        void genTemp() {}
        bool gen()
        {
        }
};
 
class Bishop: public Fig
{
        public:
        void genTemp() {}
        bool gen()
        {
        }
};
 
class Queen: public Rock, public Bishop
{
        public:
        bool gen()
        {
                Rock::genTemp();
                Bishop::genTemp();
        }
};
 
int main()
{
        Fig* a = new Queen;
        a->gen();
 
        return 0;
}

Pozostało 580 znaków

2011-07-21 21:17
0

W tym wypadku musisz zmienić:

class Rock: public Fig
...
class Bishop: public Fig
...

na

class Rock: public virtual Fig
...
class Bishop: public virtual Fig
...

Dlaczego tak nie będę tłumaczył, bo jestem zbyt zmęczony, a post byłby długi. Info w necie znajdziesz bez problemu - szukaj pod hasłem "dziedziczenie wirtualne".


edytowany 1x, ostatnio: byku_guzio, 2011-07-21 21:37

Pozostało 580 znaków

2011-07-21 22:14
Cpp
0

Dziękówa, działa.
Może jutro jak odpoczniesz, podsuniesz dobre rozwiązanie takiegoż problemu:

żeby ruszyć jakąś figurą, figura ta musi mieć dostęp do wszystkich innych pozostałych figur na planszy (aby ocenić możliwość ruchów i zbić) i teraz:
1) w konstruktorze figury przekazywać referencję do kontenera, który przetrzymuje wskaźniki figur (klasa board by miała taki kontener, i w niej bym tworzył figury i przekazywał referencję do tegoż kontenera)
2) utworzyć statyczny wektor wskaźników figur w klasie figura.

Tak czy owak, brzydko to "pachnie" i mam duży mętlik jak to rozwiązać elegancko !

Pozostało 580 znaków

2011-07-21 22:44
0

Ja zrobiłbym całkiem innaczej-większość wpakował w klasę Szachownica,i to ona wiedziałaby,jakie ruchy są dozwolone dla danego typu figury,a także zawierałaby listę położeń wszystkich figur i na tej podstawie określałaby,jake ruchy która figura może zrobić.
Klasa Figura byłaby wtedy bardzo prosta,jeśli wręcz nie zbędna-zawierałaby tylko pole type,najlepiej typu enum.(tak rozmyślając na szybko)


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-07-21 22:45

Pozostało 580 znaków

2011-07-21 22:56
Cpp
0

No wiem, bardzo dużo by to uprościło takie podejście i zapewne byłoby szybsze. Początkowo tak zamierzałem zrobić, ale chciałem wybrać ambitniejszą drogę - czyli polimorfizmu :-D

Na razie pozostaje aktualne pytanie co do tamtego problemu....

Jak koniecznie chcesz tak,to Ci byku_guzio odpowiedział już,jak zrobić żeby było dobrze - MasterBLB 2011-07-21 22:58

Pozostało 580 znaków

2011-07-21 23:02
Cpp
0

Co do dziedziczenia to tak - działa.
Pozostaje kwestia dostępu do innych figur wewnątrz figury. Nie ma na to jakiegoś wzorca czy coś ? Chyba nie jestem pierwszy z takim problemem :>

Pozostało 580 znaków

2011-07-21 23:16
0

Ja bym proponował trochę inaczej MasterBLB. To jakie ruchy są dozwolone dla danej figury powinna znać tylko figura, poruszać figurą powinien gracz, szachownica wystarczy, ze będzie wiedziała czy pole ma wolne czy zajęte.
W skrócie: obiekt klasy gracz każe figurze się poruszyć->obiekt klasa odpowiadający za logikę pyta daną figurę czy w ogóle może się tak przemieścić, następnie sprawdza czy na szachownicy jest wolne pole, czy coś się tam znajduje->w zależności od tych sprawdzeń wykonuje akcje(np. zbicie figury przeciwnika, zaakceptowanie przesunięcia, czy odrzucenie ruchu ze względu na złamanie zasad).
Wymyślone na szybko, bez przemyślenia, i nie na trzeźwo więc może coś być nie do końca sensowne. ;)


Pozostało 580 znaków

2011-07-21 23:23
Cpp
0

Czyli szachownica posiada pionki, ale każdy pionek powinien mieć dostęp do szachownicy (w kwestii implementacyjnej).
Więc chyba najrozsądniej w konstruktorze figury, przekazać referencję do szachownicy.... ?

Pozostało 580 znaków

2011-07-21 23:27
0

Pionek nie ma dostępu do szachownicy - pionek co najwyżej może podać gdzie może się przemieścić biorąc pod uwagę położenie. Szachownica nie ma dostępu do figury, wie tylko że coś się tam w danym miejscu znajduje(ewentualnie trzyma wskaźnik do figury). Gracz ma dostęp do pionków i szachownicy, on widzi całość gry. Logika gry mu zezwala lub odmawia wykonania danego ruchu.

Zaznaczam, że to jest moja koncepcja(tak to widzę intuicyjnie). Fajnie by było jakby wypowiedział się na ten temat jeszcze ktoś(najlepiej z doświadczeniem).


edytowany 1x, ostatnio: byku_guzio, 2011-07-21 23:27

Pozostało 580 znaków

2011-07-22 01:12
Cpp
0

Hmm, czyli w kwestii samych klas figur:
figura nic nie wie o innych figurach. Wirtualne metody odpowiednich typów figur, zwrócą wszystkie możliwe współrzędne przesunięć figury i warstwa wyższa zadecyduje co z tym zrobić. Więc odpadałaby kwestia przekazywania do nich wskaźnika kontenera innych figur.

Co do "właścicielstwa" figur: Ja bym zaproponował tu jeszcze jedną klasę - "Stan gry". Bo z bieżącego stanu gry - tworzymy drzewo gry (mówię o tu IQ komputera), więc chyba relacja byłaby taka klas: Figura<-StanGry<-Szachownica<-Gracz

No ale może ktoś ma jeszcze jakieś uwagi....

wystarczyłoby, żeby figura sprawdzała czy przesunięcie się na dane pole jest dozwolonym ruchem - byku_guzio 2011-07-22 01:20

Pozostało 580 znaków

2011-07-22 03:12
0

Podumałem,i nim pójdę spać i zapomnę to zapodam,jakbym to widział.
Klasa Szachownica zawierać będzie Figura *plansza[8][8]; zainicjowaną zerami-będzie odpowiadać za przechowywanie układu figur.Zmiana położenia będzie uzyskiwana przez przepisanie wskaźnika na poruszaną figurę pod nowy indeks,a pod stary będzie przypisywane 0.Usuwanie figury z planszy zaś po prostu uzyska się poprzez delete plansza[a][b],po czym plansza[a][b]=0.Tak chyba będzie najprościej i najszybciej.

Klasa figura będzie zawierać:

class Figura
{
public:
   enum KierunekRuchu
   {
       ZłyRuch,Poziomo,Pionowo,NaSkos,LiteraL itd...
   }
   int x,y;//położenie figury na planszy,czyli indeksy tablicy plansza siedzącej w klasie Szachownica
   bool kolor;//true to biały,false to czarny.Jak ktoś bardzo chce,to może dać tutaj enuma
   virtual KierunekRuchu sprawdźLegalnośćRuchu(int indexX,int indexY)=0;
   virtual List<Pair<x,y> > * bicie(bool &czyMaInneBicieNiżDozwolonyRuch)//to potrzebne z uwagi na bijące po skosie pionki
   {
      czy...=false;
   }
}

Teraz jak to ma pomykać:
1.Coś chce przesunąć daną figurę na pole x,y.Nie widzę konieczności wprowadzania klasy Gracz,ja wstępnie dałbym to do klasy Szachownica
2.Szachownica wywołuje plansza[a][b]->sprawdźRuch(x,y) i dostaje kierunek ruchu
3.Szachownica sprawdza,czy aby nie dostała Figura::KierunekRuchu::ZłyRuch.Jak tak,to nie wiem,pokazuje stosowny komunikat "A SPRDLJ z takim ruchem" i dalsza część algorytmu nie wykonuje się.
4.Teraz czas sprawdzić,czy na drodze do docelowej lokacji aby coś nie stoi.Łatwo to uzyskać badając tablicę plansza[x+offset][y+offset],gdzie x i y to położenie ruszanej figury,a offset jest liczony w zależności od wyniku jaki da funkcja sprawdźRuch.Jeśli nic nie znajdzie się pomiędzy lokacją startową a docelową figury,to można figurę przesunąć.
5.Rozpatrzenie zbicia figury,opisane przy szachownicy wyżej (czyli delete i ustawienie wskaźnika w planszy na 0)
6.Przesunięcie figury jest wykonywane poprzez przepisanie wskaźnika w tablicy plansza pod nowy indeks,a w stary wstawiane jest 0

EDIT:
Po namyśle jednak przychylę się do swej 1 koncepcji,tj że za sprawdzenie legalnościu ruchu opowiada szachownica-a to przez nietypowe poruszanie się i bicie pionków,które rozwalają pomysł z tego posta.Klasa figura uprości się więc do:

class Figura
{
public:
   enum RodzajFigury
   {
       Pionek,Goniec,Wieża,Konik itd...
   };
 
   RodzajFigury rodzaj;
   int x,y;//położenie figury na planszy,czyli indeksy tablicy plansza siedzącej w klasie Szachownica
   bool kolor;//true to biały,false to czarny.Jak ktoś bardzo chce,to może dać tutaj enuma
 
   Figura(const RodzajFigury &jaka):rodzaj(jaka)
   {};
}

Szachownica zaś wzbogaci się o funkcję:

bool sprawdźRuch(Figura *figura,int x,int y);//co do zwrotu,może być lepszy jakiś enum określający,czy ruch będzie poza planszę,czy jest blokowany przez figurę,czy też nastąpi zbicie

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 3x, ostatnio: MasterBLB, 2011-07-22 12:27
jest jeszcze bicie w przelocie, ciekawe jak to zaimplementujecie :] - msm 2011-07-22 07:48
Jakie bicie w przelocie?O konika Ci chodzi MSM? - MasterBLB 2011-07-22 12:28

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