Piszę grę planszową w C++ obiektowo. Założenia:
-
Warstwa logiki jest oddzielona od warstwy prezentacji
-
Można podpiąć dowolną warstwę prezentacji (konsola, MFC, coś innego)
-
Obiekty nie wchodzą sobie w kompetencje - wykonują tylko swoje zadania
Jaki wzorzec wybrać? Myślałem o MVC, ale bardziej nadaje się do aplikacji webowych. Pojawiają się problemy:
-
Kiedy gracz wykonuje ruch, warstwa logiki musi się o tym dowiedzieć i wykonać obliczenia
-
Kiedy komputer wykonuje ruch, pionki na planszy muszą się przestawić
Zachodzi komunikacja obustronna. Jak ona powinna wyglądać? Jakie warstwy wydzielić i do czego ograniczyć im kompetencje?
Początkujący programiści zaczynają od ustawienia komponentów na oknie. Piszą zdarzenia do przycisków i funkcje typu: wczytaj grę, zapisz grę, nowa gra. Dane o pozycji pionków, imiona graczy, przebieg zapisują i odczytują bezpośrednio z komponentów (TImage, TEdit, ukryty TListBox). Takie pisanie aplikacji byłoby łatwiejsze. Chcę jednak uniezależnić aplikację od systemu i biblioteki okienkowej, stworzyć logiczną hierarchię klas - a to trzeba umieć połączyć.
Jakie rozwiązanie proponujecie?
Podczas pisania pojawi się dużo problemów implementacyjnych. Oto przykłady, co trzeba współdzielić między warstwami:
-
Listę dozwolonych ruchów dla danego pionka w przedstawionej sytuacji na planszy
-
Rozpoczęcie lub zakończenie gry (rezygnacja lub zwycięstwo/porażka)
-
Posunięcie (ruch) komputera i użytkownika
-
Ustawienie imion graczy i kto gra (komputer czy człowiek)
-
Obliczanie korzystnego ruchu przez komputer
-
Opcjonalnie: dostęp do języka i ustawień
-
Dużo więcej…
Rozpisałem się. Podsumujmy. Jeżeli macie doświadczenie w C++, odpowiedzcie na pytania:
-
Jakie warstwy wydzielić, jakie wzorce zastosować i jak ograniczyć im kompetencje?
-
Jak skutecznie zrealizować komunikację w obie strony? Bezpośrednio, przez kontroler? Tworzyć wiele metod zdarzeń czy 1 obserwator?
-
Od czego w ogóle zacząć? Jakie obiekty utworzyć w main(), a gdzie inicjować resztę w dobrze napisanej aplikacji?
-
Inne uwagi związane z implementacją i “przekazywaniem piłki” między klasami?