Pliki źródłowe diagramów znajdują się w folderze "docs" w repozytorium.
1. Opis projektu
- Cele
- Założenia
- Problemy
- Podstawowe moduły
2. Moduły
- Mediator
- Network
- NetworkAction
- ViewsManager
3. Wzorce projektowe
- Klient-Serwer
- Obserwator
- Singleton
- Mediator
- Most
- RAII
- Iterator
Cele
Celem projektu jest stworzenie sieciowej, dwuosobowej, multiplatformowej gry - Statki oraz dokumentacji projektowej aby otrzymać zaliczenie z przedmiotu Inżynieria Oprogramowania.
Założenia
- W grze bierze udział 2 graczy
- Gra odbywa się w sieci lokalnej (LAN)
- Zespól projektowy składa się z 2 osób
- Gra jest wykonana w technologii multiplatformowej Qt (C++/QML) co pozwala na jej uruchomienie na bardzo wielu systemach operacyjnych (m.in Windows, Linux, OS X, Android, iOS, ...)
- Obaj gracze musza znajdować się w tej samej sieci LAN, aby nawiązać połączenie
- Połączenie dwóch graczy odbywa się automatycznie, tworząc stół gracz zaczyna rozgłaszać swój adres w sieci, dołączający do stołu nasłuchuje i gdy napotka na wiadomość, dołącza do serwera
- Kod źródłowy przechowywany jest na repozytorium github i jest objęty licencją LGPL-3.0
Problemy
- Termin oddania projektu
- Dostępność czasowa członków zespołu
- Zerowy budżet :)
Podstawowe moduły
- Moduł GUI (pliki QML) - odpowiadają za warstwę wizualną aplikacji i interakcje z użytkownikiem
- Moduł sieciowy - odpowiada nawiązanie połączenia i wymianę danych z drugim graczem
- Moduł logiczny - spaja oba powyższe moduły
Diagram klas wykorzystanych w projekcie (kliknij, aby powiększyć):
Diagram przypadków użycia (kliknij, aby powiększyć):
Diagram aktywności dla przebiegu rozgrywki (kliknij, aby powiększyć):
Mediator
Służy do łączenia logiki gry z GUI. cała komunikacja przetwarzana jest właśnie przez tę klasę.
Diagram sekwencji procesu tworzenia/dołączania do nowej gry (kliknij, aby powiększyć):
Zmienne readonly, ich zmiana wywołuje aktualizację GUI:
EView::View activeView
- ekran wyświetlany aktualnie przez GUIbool yourTurn
- czy trwa tura graczaboardIsValid
- czy plansza zawiera potrzebne statkiboardHasErrors
- czy statki są ustawione poprawniepreparingBoardPhase
- czy trwa faza przygotowywania grywaitingForEnemyBoard
- czy przeciwnik przygotowuje planszę do grywaitingToConnect
- czy trwa oczekiwanie na połączenie Moduł łączący logikę zapisaną w C++ z GUI pisanym w QML. Obsługa rozpoczę
Funkcje wykorzystywane przez GUI:
void createServer()
- utwórz serwer gryvoid joinGame()
- dołącz do gryvoid exitGame()
- zamknij gręvoid playerIsReady()
- zaakceptuj przygotowaną planszęvoid toggleFirstTile(int x, int y)
- przestaw pierwsze pole planszyvoid toggleTile(int x, int y)
- przestaw pole planszyvoid attackTile(int x, int y)
- zaatakuj polevoid surrender()
- poddaj sięvoid goBackToMainMenu()
- wróc do głównego menuvoid showCredits()
- wyświetl napisy końcowevoid exitFromCredits()
- zamknij napisy końcowe
Sygnały nasłuchiwane przez GUI:
prepareToNewGame()
- przygotuj się do nowej gryrenderShip(int id, int x, int y)
- wyświetl statek na planszyremoveShip(int id)
- usuń statek z planszyrenderShot(int x, int y, bool accurate, bool enemyBoard)
- wyświetl strzał na planszy. Jeśliaccurate == true
, to trafiony został statek. JeślienemyBoard == true
, strzał został wykonany na planszy przeciwnika. W przeciwnym razie strzał został oddany na naszej planszę.newMessageToDisplay(QString message)
- wyświetl krótką wiadomość
Network
Klasa odpowiedzialna za łączenie graczy ze sobą oraz komunikacji poprzez sieć. Jest wykorzystywana w postaci singletona w klasie Mediator
.
Diagram sekwencji procesu tworzenia nowego połączenia sieciowego (kliknij, aby powiększyć):
Diagram sekwencji procesu przesyłania i odbierania danych (kliknij, aby powiększyć):
Diagram sekwencji procesu zamykania połączenia (kliknij, aby powiększyć):
NetworkAction
Pojedyncza akcja przesyłana przez sieć. Możliwe rodzaje akcji to "Shot", "BoardExchange", "Surrend".
ViewsManager
Obiekt odpowiedzialny za zmianę aktualnie wyświetlanego ekranu. Nasłuchuję na zmienną activeView
, klasy Mediator
i w zależności od jej wartości aktywuje odpowiedni widok.
Klient-Serwer
Gracz tworzący grę jest serwerem - udostępnia usługę gry i czeka na połączenie gracza dołączającego, który jest klientem.
Klient
Serwer
Obserwator
Cały mechanizm sygnałów w Qt działają w oparciu o ten wzorzec. Kiedy łączymy jakiś slot do sygnału to sygnał staje się obserwowanym, a sloty do niego podłączone - obserwującymi.
Łączenie sygnału ze slotem
Singleton
Klasa Network
jest singletonem, ponieważ nie przewidujemy połączenia z więcej niż jednym graczem podczas rozgrywki.
Network.h
Mediator
Klasa Mediator
jak sama nazwa wskazuje jest mediatorem, ponieważ komunikuje się innymi klasami, którymi zarządza, a do QML'a wystawia tylko prosty interfejs
Mediator
Most
Wszystkie klasy (c++) w tym projekcie korzystają z tego wzorca, ponieważ oddzielają interfejs od implementacji rozmieszczając je odpowiednio w plikach *.h
i *.cpp
.
RAII
Zabór Zasobu Jest Inicjalizacją (Resource Acquisition Is Initialization) - z tego wzorca korzysta klasa Network
, ponieważ używa QScopedPointer
który w momencie jego niszczenia, niszczy tez obiekt przypisany do niego, w tym przypadku sockety i serwer.
Network.h
Iterator
Obiekt zapewniający sekwencyjny dostęp do podobiektów zgrupowanych w większym obiekcie.
Mediator.cpp