Cześć
Chciałem się spytać o jakieś sugestie odnośnie obiektowego designu dla planszowej gry turowej opartej o grid. Gra składa się z planszy n x m
, po której porusza się dowolna liczba graczy, każdy sterowany z klawiatury i myszki lub np. poprzez sieć (serwer odpowiada za komunikację między graczami lub nawet p2p bez serwera). Pisane jest to w JS, ale to nie powinno mieć dużego znaczenia na razie. Dotychczas napisałem klasę GameWrapper
, która ma klasy (obiekty klas) Render
, Board
, Players
. Render
ma być wymienne i aktualnie statycznie inicjalizowany jest obiekt klasy Render
(lub niepisanego interfejsu render), która korzysta z canvas
i na nim renderuje. Players
zawiera tablicę graczy klasy Player
, a każdy Player
ma jeszcze PlayerControlls
. Board
zawiera dwuwymiarową tablicę obiektów klasy Field
. W skrócie to tak właśnie wygląda.
- Czy taki design byłby uznany całkiem ok, czy polecany byłby jakiś inny, ewentualnie z jakimiś wzorcami konkretnymi?
- Odpowiedni obiekt
PlayerControlls
reaguje na input i odsyła przetworzony input (np. ruch góra/dół/lewo/prawo) do obiektuPlayer
do metodymove
, tam jest reszta akcji, np. sprawdzenie, czy teraz jest kolej tego gracza poprzez sprawdzenie zmiennejisMoving
. Jednak abyPlayerControlls
mógł odwołać się do obiektuPlayer
, który go ma,PlayerControlls
musi mieć zmienną, która się do niego odnosi, przez coPlayerControlls
dostajethis
w konstruktorze lub w metodziesetPlayer
podczas inicjalizowania konkretnegoPlayer
. Teraz przy inicjalizacjiPlayerControlls
wPlayer
trzeba wołać tę metodę. Czy takie coś jest raczej ok?
Podobnie jest z klasąRender
. Taki obiekt też musi dostać odniesienie doBoard
iPlayers
, aby sprawdzić kolory pól i położenia graczy i potem to wyświetlić. Na dodatek następna iteracja w pętli gry (której tutaj nie ma w typowej postaci) dzieje się wtedy, gdyPlayerControlls
wołamove
naPlayer
i ten sprawdza, że jest jego kolejka, wtedy odwołuje się doBoard
aby formalnie wykonać ruch i doRender
, aby odświeżyć wyświetlaną rozgrywkę. To akurat można by sprowadzić do fasady wGameWrapper
, ale wtedyPlayer
powinien mieć jeszcze zmienną odnoszącą się do tego obiektu.
Czy taki design jest raczej ok? Czy to odnoszenie się do obiektów, przez obiekty zawarte i zmienne, które się do nich odnoszą oraz te metody w stylusetPlayer
, które w znacznej części wypadków dostają obiekt, który zawiera dany obiekt jest też raczej ok?