[C++] Wzorce projektowe do gry planszowej

Piszę grę planszową w C++ obiektowo. Założenia:

  1. Warstwa logiki jest oddzielona od warstwy prezentacji

  2. Można podpiąć dowolną warstwę prezentacji (konsola, MFC, coś innego)

  3. 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:

  1. Kiedy gracz wykonuje ruch, warstwa logiki musi się o tym dowiedzieć i wykonać obliczenia

  2. 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:

  1. Listę dozwolonych ruchów dla danego pionka w przedstawionej sytuacji na planszy

  2. Rozpoczęcie lub zakończenie gry (rezygnacja lub zwycięstwo/porażka)

  3. Posunięcie (ruch) komputera i użytkownika

  4. Ustawienie imion graczy i kto gra (komputer czy człowiek)

  5. Obliczanie korzystnego ruchu przez komputer

  6. Opcjonalnie: dostęp do języka i ustawień

  7. Dużo więcej…

Rozpisałem się. Podsumujmy. Jeżeli macie doświadczenie w C++, odpowiedzcie na pytania:

  1. Jakie warstwy wydzielić, jakie wzorce zastosować i jak ograniczyć im kompetencje?

  2. Jak skutecznie zrealizować komunikację w obie strony? Bezpośrednio, przez kontroler? Tworzyć wiele metod zdarzeń czy 1 obserwator?

  3. Od czego w ogóle zacząć? Jakie obiekty utworzyć w main(), a gdzie inicjować resztę w dobrze napisanej aplikacji?

  4. Inne uwagi związane z implementacją i “przekazywaniem piłki” między klasami?