próbuję poczuć, jak projektować i myśleć w sposób Object Oriented i chcą uzyskać pewne informacje zwrotne od społeczeństwa na ten temat. Poniżej znajduje się przykład gry w szachy, którą chcę zaprojektować w stylu OO. Jest to bardzo szeroki projekt i na tym etapie skupiam się tylko na tym, aby określić, kto jest odpowiedzialny za komunikaty i sposób, w jaki obiekty współdziałają ze sobą, aby symulować grę. Proszę wskazać, czy istnieją elementy złego projektu (wysokie sprzężenie, słaba spójność itp.) I jak je poprawić.Object Oriented Design for gry w szachy
Gra Chess ma następujących klas
- Board
- gracza
- Kawałek
- Plac
- ChessGame
Zarząd składa się z kwadratów i tak Nadzorczej może być odpowiedzialny za tworzenie i zarządzanie Square ob jekty. Każdy kawałek jest również na kwadracie, więc każdy kawałek ma również odniesienie do kwadratu, na którym się znajduje. (Czy to ma sens?). Każdy kawałek jest odpowiedzialny za przesunięcie się z jednego kwadratu do drugiego. Klasa gracza zawiera odniesienia do wszystkich utworów, które posiada, a także jest odpowiedzialna za ich tworzenie (czy gracz powinien tworzyć kawałki?). Gracz ma metodę takeTurn, która z kolei wywołuje metodę movePiece, która należy do utworu Class, która zmienia położenie fragmentu z bieżącej lokalizacji na inną lokalizację. Teraz jestem zdezorientowany, za co dokładnie odpowiedzialna jest klasa Board. Zakładałem, że było to konieczne, aby określić aktualny stan gry i wiedzieć, kiedy gra się skończyła. Ale kiedy utwór zmienia jego położenie, w jaki sposób płyta powinna zostać zaktualizowana? czy powinien on utrzymywać oddzielną tablicę kwadratów, na których znajdują się części i która otrzymuje aktualizacje w miarę przesuwania się kawałków?
Również ChessGame intially tworzy planszy i odtwarzacz obiektów, które z kolei tworzą kwadraty i kawałki odpowiednio i uruchomić symulację. W skrócie, to może być to, co w ChessGame kod może wyglądać
Player p1 =new Player();
Player p2 = new Player();
Board b = new Board();
while(b.isGameOver())
{
p1.takeTurn(); // calls movePiece on the Piece object
p2.takeTurn();
}
jestem jasne, w jaki sposób stan planszy będą aktualizowane. Czy element powinien mieć odniesienie do tablicy? Gdzie powinna leżeć odpowiedzialność? Kto posiada jakie referencje? Proszę, pomóż mi swoimi uwagami i wskaż problemy w tym projekcie. Rozmyślnie nie skupiam się na żadnych algorytmach ani innych szczegółach gry, ponieważ interesuję się tylko aspektem projektowania. Mam nadzieję, że ta społeczność może dostarczyć cennych informacji.
nitpicky komentarz: p2 nie powinno nazywać 'takeTurn()' jeśli ruch P1 kończy grę. Mniej nijaki komentarz: bardziej naturalne jest nazywanie graczy "białymi" i "czarnymi". –
Uzgodnione. Ale jak powiedziałem, bardziej interesują mnie aspekty projektowe i to, co Obiekty powinny być odpowiedzialne za to, jakie działania i kto posiada jakie referencje. – Sid