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
PlayerControllsreaguje na input i odsyła przetworzony input (np. ruch góra/dół/lewo/prawo) do obiektuPlayerdo metodymove, tam jest reszta akcji, np. sprawdzenie, czy teraz jest kolej tego gracza poprzez sprawdzenie zmiennejisMoving. Jednak abyPlayerControllsmógł odwołać się do obiektuPlayer, który go ma,PlayerControllsmusi mieć zmienną, która się do niego odnosi, przez coPlayerControllsdostajethisw konstruktorze lub w metodziesetPlayerpodczas inicjalizowania konkretnegoPlayer. Teraz przy inicjalizacjiPlayerControllswPlayertrzeba wołać tę metodę. Czy takie coś jest raczej ok?
Podobnie jest z klasąRender. Taki obiekt też musi dostać odniesienie doBoardiPlayers, 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, gdyPlayerControllswołamovenaPlayeri ten sprawdza, że jest jego kolejka, wtedy odwołuje się doBoardaby formalnie wykonać ruch i doRender, aby odświeżyć wyświetlaną rozgrywkę. To akurat można by sprowadzić do fasady wGameWrapper, ale wtedyPlayerpowinien 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?