Próbuję się zorientować, jak projektować i myśleć w sposób zorientowany obiektowo i chcę uzyskać opinie społeczności na ten temat. Poniżej znajduje się przykład gry w szachy, którą chciałbym zaprojektować w sposób OO. To bardzo szeroki projekt i na tym etapie skupiam się tylko na zidentyfikowaniu, kto jest odpowiedzialny za jakie komunikaty i jak obiekty oddziałują na siebie, aby symulować grę. Proszę wskazać, czy są elementy złego projektu (wysokie sprzężenie, zła spójność itp.) I jak je poprawić.
Gra w szachy ma następujące klasy
- Deska
- Gracz
- Kawałek
- Plac
- Gra w szachy
Tablica składa się z kwadratów, więc może ona odpowiadać za tworzenie obiektów Square i zarządzanie nimi. Każdy element również znajduje się na kwadracie, więc każdy element ma również odniesienie do kwadratu, na którym się znajduje. (Czy to ma sens?). Każdy pionek jest następnie odpowiedzialny za przemieszczanie się z jednego pola na drugie. Klasa gracza zawiera odniesienia do wszystkich elementów, które posiada, a także jest odpowiedzialna za ich tworzenie (czy gracz powinien tworzyć elementy?). Gracz ma metodę takeTurn, która z kolei wywołuje metodę movePiece należącą do klasy figury, która zmienia lokalizację figury z jej aktualnej lokalizacji na inną. Teraz nie wiem, za co dokładnie musi być odpowiedzialna klasa Board. Założyłem, że trzeba było określić aktualny stan gry i wiedzieć, kiedy gra się skończyła. Ale kiedy kawałek to zmienia s lokalizacja w jaki sposób należy aktualizować tablicę? czy powinien utrzymywać oddzielną tablicę kwadratów, na których istnieją figury i która jest aktualizowana wraz z ruchem pionków?
Ponadto ChessGame początkowo tworzy planszę i obiekty gracza, które z kolei tworzą odpowiednio kwadraty i figury i rozpoczynają symulację. Krótko mówiąc, może tak wyglądać kod w ChessGame
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();
}
Nie jestem pewien, w jaki sposób będzie aktualizowany stan tablicy. Czy kawałek powinien mieć odniesienie do tablicy? Gdzie powinna leżeć odpowiedzialność? Kto posiada jakie referencje? Proszę, pomóż mi ze swoimi danymi wejściowymi i wskaż problemy w tym projekcie. Celowo nie skupiam się na żadnych algorytmach ani dalszych szczegółach rozgrywki, ponieważ interesuje mnie tylko aspekt projektowy. Mam nadzieję, że ta społeczność dostarczy cennych informacji.
takeTurn()
jeśli ruch p1 kończy grę. Mniej złośliwy komentarz: bardziej naturalne jest dzwonienie do graczywhite
iblack
.