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::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