2011-08-05 8 views
6

Projektuję grę w szachy w Javie (bez sztucznej inteligencji, tylko kontrolowana przez użytkownika) i wciąż przyzwyczajam się do OOP. Mam dwa pytania.Projektowanie obiektów do gry w szachy w java

Myślałam o konieczności, oprócz Game, Cell, Piece i Board obiektów, a Player obiektu.

Moje pytanie brzmi: czy naprawdę muszę? Oczywiście nie muszę, ale czy jest to opcja uważana za lepszą konstrukcję? Z jednej strony wydaje się, że gracz jest przydatny do przechowywania informacji o graczach i powinien zawierać takie metody, jak takeTurn(). (Dla mojej implementacji chcę również śledzić wszystkie możliwe ruchy, więc będę miał metodę getAllMoves()). Z drugiej strony, czy nie jest to po prostu reorganizacja istniejących danych? Każdy element ma już wskazanie, do którego gracza należy. A ponieważ moja gra nie zawiera sztucznej inteligencji, może mieć sens, by takeTurn() należało do Game, a nie do Player. Z pierwszej strony ponownie może Player może mieć tylko metodę getAllMoves(), która używa swoich danych, ale nie podejmuje działania.

Drugie pytanie, istotne, jeśli odpowiedź na pierwsze pytanie brzmi "tak", brzmi: jak uporządkować relacje między obiektami? getAllMoves() przyjmie jako dane wejściowe tablicę komórek; ale wydaje się dziwne, że wtedy klasa Player zależy od faktu, że jej komórki pasują (są podzbiorem) komórek przekazanych jako dane wejściowe. Byłoby lepiej, gdyby dane podzielone na komórki były przechowywane razem z tablicą wszystkich komórek w Tablicy i aktualizowane razem, gwarantując tym samym, że się zgadzają. Oczywiście, gwarancja, że ​​się zgadzają, istniałaby tak czy inaczej, ale wydaje się, że obiekt Gracza nie powinien być świadomy gwarancji, która ma miejsce w obiekcie Board.

Jak radzić sobie z tymi pytaniami?

Dzięki!

+1

To brzmi tak, jakbyś próbował [BDUF] (http://en.wikipedia.org/wiki/Big_Design_Up_Front) - być może mógłbyś rozważyć alternatywny sposób wyparcia twojego modelu obiektowego, np. [TDD] (http://msdn.microsoft.com/en-us/magazine/dd882516.aspx) – razlebe

+1

BTW Myślę, że projektowanie gry w szachy jest bardzo dobrym podejściem do zapoznania się z OOP. Pamiętaj, aby faworyzować asocjaty przez interfejs nad bezpośrednimi podklasami, ponieważ te ostatnie tworzą ścisłe sprzężenie, które nie zawsze jest konieczne. –

Odpowiedz

2

IMHO o obiekcie gracza to dobry projekt.
Możesz nawet udoskonalić go później do interfejsu i mieć implementację AIPlayer i HumanPlayer.
Dzisiaj potrzebujesz tylko metody getAllMoves, ale później będziesz potrzebować więcej. Posiadanie przedmiotu pomoże ci przedłużyć wytrzymałość gracza.

Dla twojego drugiego punktu, nie jestem pewien, że odtwarzacz powinien implementować bezpośrednio metodę getAllMoves().

Powierzyłbym to obiektowi ChessGame. Gracz będzie w tym przypadku mieć odniesienie do gry i powierza getAllMoves wywołanie tej instancji Gra, podobnie jak to:

pseudo-kod :)

hej gier, jakie są dostępne dla tego kawałka porusza ?

+0

Zgadzam się. Posiadanie getAllMoves wewnątrz odtwarzacza sprawiłoby, że byłby wszechwiedzący. Istnieje ryzyko, że takie podejście doprowadzi do ułożenia logiki wewnątrz jednej klasy. W prawdziwym życiu gracz może być postrzegany jako oceniający możliwe ruchy, patrząc na planszę. Można to przetransponować jako wiadomość odzwierciedlającą podany przez ciebie pseudo-kod. –

+0

Dzięki! Myślałem, że gracz nie powinien mieć odniesienia do Gry, ale wydaje mi się, że ma to sens. Innym miejscem, do którego się potknę, jest Piece. Wydaje się, że powinien on przechowywać logikę dla różnych ruchów dostępnych dla różnych elementów - dlatego stworzyłem klasę dla każdego typu elementu. Ale znowu, aby ustalić, czy może wykonać ruch, musi wiedzieć o otaczających komórkach. Czy to coś, co powinna zrobić Gra lub Kawałek? – user64480

+0

@ user880129, dobrze jest zadać sobie to pytanie, a ja wciąż gubię się w tego rodzaju rozważaniach. Kiedyś OOP zmusza nas do myślenia zbyt wiele :) Dla twojego przypadku utworzę klasę centralną, która będzie działać jako hub i będzie w stanie odpowiedzieć na wszystkie pytania związane z stanem gry, np .: czy ta komórka jest wolna, które są otaczającymi kawałkami, czy to jest poruszaj się poza tablicą, ... Więc ten fragment będzie zawierał tylko opis ruchu i małą logikę. Może powinieneś spróbować znaleźć grę w szachy open source, aby sprawdzić, jak się to robi. To pomoże ci zbudować własny system. – Guillaume

1

Pytanie, czy potrzebny jest obiekt "Gracza" - zadaj sobie pytanie, czy ten obiekt ma interakcję/relacje z innymi obiektami w systemie. Czy ma też jakieś dane lub informacje o stanie, które chcesz nagrać? Mogę wymyślić kilka rzeczy, które możesz chcieć śledzić w powiązaniu z graczem - przechwycone kawałki, może wynik punktowy.

BTW dobrym pomysłem byłoby skonstruowanie modelu obiektowego w celu wizualizacji wzajemnego powiązania obiektów. Dzięki temu uzyskasz lepszy obraz interfejsów między obiektami i wymaganych metod.

+2

... nazwa gracza, kolor rozgrywany –

1

Czy znasz UML, a dokładniej Diagramy przypadków użycia i sekwencji? Brzmi to jak ćwiczenie w modelowaniu i dobrze byłoby również przyjrzeć się koncepcji modelu domeny.

Aktorzy przypadków użycia, tacy jak odtwarzacz, są zazwyczaj transponowani jako klasy (jako substytuty). Inne klasy można określić, rozpoczynając od przybliżonego diagramu sekwencji dla każdego Przypadku użycia z klasą Aktora po jednej stronie i globalną Klasy Systemu po drugiej.

Ta klasa systemu może zostać stopniowo rozłożona podczas przeglądania różnych komunikatów. Jeśli metoda/messsage nie jest bezpośrednio do pojedynczej instancji klasy i jej atrybutów/stanu wewnętrznego, istnieje prawdopodobieństwo, że należy ona do innej lokalizacji (np. Klasa BankAccount nie ma takiej samej odpowiedzialności jak klasa BankAccountManager). Możesz pogrupować metody zgodnie z naturą i powinieneś zobaczyć kilka innych klas.

Od tego miejsca powinien być prosty przypadek ustalenia, czy między nimi istnieją relacje 1 do 1, jeden do wielu i wiele do wielu. W Javie będą one reprezentowane przez pojedyncze instancje lub Listy i kierunkowość (czy klasa A wie o klasie B, czy jest to ulica jednokierunkowa?) Jest reprezentowana przez obecność lub brak odniesień wewnątrz odpowiednich klas.

P.S: Zauważ, że to, co opisuję luźno, to podejście do metodologii, podczas gdy UML po prostu zawiera się w opisie systemu z różnych widoków.

Powiązane problemy