From 6b389f24178b0402ab15d92a2733e569ce633316 Mon Sep 17 00:00:00 2001 From: Simon Wilkening Date: Thu, 7 Nov 2024 19:59:54 +0100 Subject: [PATCH] Artefakte aktualisiert --- Designphase/Architekturentscheidungen.md | 3 +- Designphase/Klassendiagramme.md | 3 +- Designphase/Sequenzdiagramme.md | 1 + Designphase/Testhandbuch.md | 3 +- Designphase/Zustandsdiagramme.md | 17 +++++ .../Architekturentscheidungen_V1.3.md | 70 ++++++++++++++++++ .../Klassendiagramme/ClassChart_V1.4.svg | 4 + .../Sequenzdiagramme/Würfeln_V1.2.svg | 4 + .../Testhandbuch/Testhandbuch_V2.3.xlsx | Bin 0 -> 27917 bytes .../Zustandsdiagramme/GameStateChart_V1.2.svg | 4 + .../PlayerStateChart_V1.3.svg | 4 + 11 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 uploads/Designphase/Architekturentscheidungen/Architekturentscheidungen_V1.3.md create mode 100644 uploads/Designphase/Klassendiagramme/ClassChart_V1.4.svg create mode 100644 uploads/Designphase/Sequenzdiagramme/Würfeln_V1.2.svg create mode 100644 uploads/Designphase/Testhandbuch/Testhandbuch_V2.3.xlsx create mode 100644 uploads/Designphase/Zustandsdiagramme/GameStateChart_V1.2.svg create mode 100644 uploads/Designphase/Zustandsdiagramme/PlayerStateChart_V1.3.svg diff --git a/Designphase/Architekturentscheidungen.md b/Designphase/Architekturentscheidungen.md index 6bd090a..054b3ba 100644 --- a/Designphase/Architekturentscheidungen.md +++ b/Designphase/Architekturentscheidungen.md @@ -2,4 +2,5 @@ Hier werden die verschiedenen Versionen der Architekturentscheidungen veröffent * [Architekturentscheidungen_V1.0](../uploads/Designphase/Architekturentscheidungen/Architekturentscheidungen_V1.0) * [Architekturentscheidungen_V1.1](../uploads/Designphase/Architekturentscheidungen/Architekturentscheidungen_V1.1) -* [Architekturentscheidungen_V1.2](../uploads/Designphase/Architekturentscheidungen/Architekturentscheidungen_V1.2) \ No newline at end of file +* [Architekturentscheidungen_V1.2](../uploads/Designphase/Architekturentscheidungen/Architekturentscheidungen_V1.2) +* [Architekturentscheidungen_V1.3](../uploads/Designphase/Architekturentscheidungen/Architekturentscheidungen_V1.3) \ No newline at end of file diff --git a/Designphase/Klassendiagramme.md b/Designphase/Klassendiagramme.md index 985831d..635eea7 100644 --- a/Designphase/Klassendiagramme.md +++ b/Designphase/Klassendiagramme.md @@ -3,4 +3,5 @@ Hier werden Klassendiagramme veröffentlicht * [ClassChart_V1.0](../uploads/Designphase/Klassendiagramme/ClassChart_V1.0.svg) * [ClassChart_V1.1](../uploads/Designphase/Klassendiagramme/ClassChart_V1.1.svg) * [ClassChart_V1.2](../uploads/Designphase/Klassendiagramme/ClassChart_V1.2.svg) -* [ClassChart_V1.3](../uploads/Designphase/Klassendiagramme/ClassChart_V1.3.svg) \ No newline at end of file +* [ClassChart_V1.3](../uploads/Designphase/Klassendiagramme/ClassChart_V1.3.svg) +* [ClassChart_V1.4](../uploads/Designphase/Klassendiagramme/ClassChart_V1.4.svg) \ No newline at end of file diff --git a/Designphase/Sequenzdiagramme.md b/Designphase/Sequenzdiagramme.md index b1e7358..04c51d2 100644 --- a/Designphase/Sequenzdiagramme.md +++ b/Designphase/Sequenzdiagramme.md @@ -2,6 +2,7 @@ Hier werden die Sequenzdiagramme veröffenticht * [Würfeln_V1.0](../uploads/Designphase/Sequenzdiagramme/Wuerfeln_V1.0.pdf) * [Würfeln_V1.1](../uploads/Designphase/Sequenzdiagramme/Wuerfeln_V1.1.svg) +* [Würfeln_V1.2](../uploads/Designphase/Sequenzdiagramme/Würfeln_V1.2.svg) --- diff --git a/Designphase/Testhandbuch.md b/Designphase/Testhandbuch.md index 060fd21..bf683c8 100644 --- a/Designphase/Testhandbuch.md +++ b/Designphase/Testhandbuch.md @@ -2,4 +2,5 @@ Folgende Versionen an Testhandbüchern sind bisher in der Designphase entstanden * [Testhandbuch_V2.0](../uploads/Designphase/Testhandbuch/Testhandbuch_V2.0.xlsx) * [Testhandbuch_V2.1](../uploads/Designphase/Testhandbuch/Testhandbuch_V2.1.xlsx) -* [Testhandbuch_V2.2](../uploads/Designphase/Testhandbuch/Testhandbuch_V2.2.xlsx) \ No newline at end of file +* [Testhandbuch_V2.2](../uploads/Designphase/Testhandbuch/Testhandbuch_V2.2.xlsx) +* [Testhandbuch_V2.3](../uploads/Designphase/Testhandbuch/Testhandbuch_V2.3.xlsx) \ No newline at end of file diff --git a/Designphase/Zustandsdiagramme.md b/Designphase/Zustandsdiagramme.md index e69de29..3c3a27f 100644 --- a/Designphase/Zustandsdiagramme.md +++ b/Designphase/Zustandsdiagramme.md @@ -0,0 +1,17 @@ +Hier werden die Zustandsdiagramme reingestellt + +
+GameState + +* [GameState_V1.2](../uploads/Designphase/Zustandsdiagramme/GameStateChart_V1.2.svg) + +
+ +--- + +
+PlayerState + +* [PlayerState_V1.2](../uploads/Designphase/Zustandsdiagramme/PlayerStateChart_V1.3.svg) + +
\ No newline at end of file diff --git a/uploads/Designphase/Architekturentscheidungen/Architekturentscheidungen_V1.3.md b/uploads/Designphase/Architekturentscheidungen/Architekturentscheidungen_V1.3.md new file mode 100644 index 0000000..0e49e5b --- /dev/null +++ b/uploads/Designphase/Architekturentscheidungen/Architekturentscheidungen_V1.3.md @@ -0,0 +1,70 @@ +# Architekturentscheidungen + +## Aufteilung Client Server + +### Server-seitige Aktionen und Berechnungen + +1. **Spielstart und Serververbindung**: + - Der Server wird beim Start des Spiels durch einen Spieler initialisiert, was anderen Spielern den Beitritt ermöglicht (UC-game-01). + - Spieler können sich über die Eingabe von Hostnamen und Portnummer zum Server verbinden (UC-game-07). +2. **Spielmechanik**: + - Zentrale Berechnungen wie die Würfelwürfe (UC-gameplay-02), Mietenberechnungen bei Grundstücksbesitz (UC-gameplay-08), und Strafzahlungen (UC-gameplay-20) werden serverseitig ausgeführt und anschließend an die Clients gesendet. + - Spielaktionen wie der Übergang ins Gefängnis (Gulag) oder der Kauf eines Grundstücks werden ebenfalls auf dem Server ausgeführt, da diese den Status der Spielwelt beeinflussen (UC-gameplay-09, UC-gameplay-07). +3. **Spielzüge und Spielerwechsel**: + - Die Verwaltung der Spielerreihenfolge und das automatische Beenden des Zugs bei Inaktivität erfolgen serverseitig (UC-gameplay-17, UC-gameplay-19). +4. **Handelsberechnungen**: + - Alle Berechnungen und Validierungen für Handelsangebote, z.B., Verifizierung der Verfügbarkeit von Grundstücken und Geldern beim Handel, werden serverseitig durchgeführt (UC-trade-07, UC-trade-08). +5. **Zustandsverwaltung der Spielwelt**: + - Änderungen in den Besitzverhältnissen, wie das Markieren von Grundstücken bei Kauf oder Verpfändung, werden zentral durch den Server verarbeitet und an alle Clients synchronisiert (UC-gameplay-10, UC-gameplay-14). + +### Client-seitige Aktionen und Darstellungen + +1. **UI-Interaktionen und Auswahlmöglichkeiten**: + - Der Client ermöglicht den Spielern, Menüs zu öffnen (z.B., Startmenü, Handelsmenü, Einstellungen) und eigene Aktionen wie den Würfelwurf oder die Auswahl von Handelsoptionen zu initiieren. Diese Aktionen lösen serverseitige Berechnungen aus, bleiben jedoch in der Steuerung und Interaktion clientseitig (UC-game-02, UC-trade-05, UC-menu-01). +2. **Anzeige und Soundeffekte**: + - Die Anzeige von Würfelergebnissen, Karteninformationen und Pop-Ups bei Ereignissen (z.B., Zahlung von Miete oder Startgeld) werden klientenseitig dargestellt. Soundeffekte werden durch clientseitige Trigger abgespielt (UC-sound-01, UC-gameplay-29). +3. **Echtzeit-Anzeigen**: + - Visualisierungen wie der Timeout-Counter und Anzeigen über das Vermögen der Mitspieler werden durch die Clients verwaltet und aktualisiert (UC-gameplay-36, UC-menu-12). +4. **Benachrichtigungen und Popup-Verwaltung**: + - Der Client verwaltet das Ausspielen und Schließen von Pop-ups und Warnhinweisen für den Nutzer, z. B., Timeout-Warnungen und Handelsofferten, die durch serverseitige Signale ausgelöst werden (UC-gameplay-40). + +## Messages + +### 1\. Verbindungsmanagement + +- **Client → Server**: `ConnectRequest` – Spieler sendet eine Anfrage, dem Server beizutreten (mit Hostname und Port). +- **Server → Client**: `ConnectionResponse` – Antwortet, ob die Verbindung erfolgreich hergestellt wurde. +- **Client → Server**: `DisconnectRequest` – Spieler möchte das Spiel verlassen. +- **Server → Client**: `PlayerDisconnected` – An alle Clients gesendete Nachricht, dass ein Spieler das Spiel verlassen hat. +- **Server → Client**: `GameEnd` – Signalisiert allen Spielern, dass der Host das Spiel beendet hat. +- **Client → Server**: `PlayerReady` - Setzt den Status eines Spielers in der Lobby auf Bereit oder nicht Bereit + +### 2\. Spielaktionen und -zustand + +- **Client → Server**: `RollDice` – Spieler fordert einen Würfelwurf an. +- **Server → Client**: `DiceResult` – Sendet das Ergebnis des Würfelwurfs an den Spieler. +- **Server → Client**: `MoveResult` – Bestätigt die Spielfigurbewegung und informiert über das Zielfeld mittels ID (z.B. „Grundstück“, „Steuerfeld“, „Gulag“). +- **Client → Server**: `BuyPropertyRequest` – Spieler möchte ein Grundstück kaufen. +- **Server → Client**: `BuyPropertyResponse` – Antwortet, ob der Kauf erfolgreich war. +- **Server → Client**: `PayRent` – Spieler muss Miete zahlen, wenn er auf einem fremden Grundstück landet. Nachricht enthält den Betrag und den Zahlungsempfänger. +- **Server → Client**: `UpdatePlayerAssets` – Informiert über aktualisierte Besitztümer oder Geldbeträge nach Aktionen (z.B., Kauf eines Grundstücks, Zahlung von Miete). +- **Client → Server**: `EndTurn` – Spieler signalisiert das Ende seines Zugs. +- **Server → Client**: `NextPlayerTurn` – Teilt allen Spielern mit, welcher Spieler an der Reihe ist. +- **Server → Client**: `JailEvent` – Informiert den Spieler über den Eintritt ins oder Austritt aus dem Gulag. + +### 3\. Benachrichtigungen und Statusupdates + +- **Server → Client**: `GameStart` – Teilt mit, dass das Spiel beginnt und alle Spieler bereit sind. +- **Server → Client**: `GameOver` – Informiert über das Spielende, entweder durch Bankrott eines Spielers oder weil ein Spieler gewonnen hat. +- **Server → Client**: `PlayerStatusUpdate` – Sendet allen Spielern Statusänderungen von Mitspielern (z.B. Bankrott, neue Besitztümer). +- **Server → Client**: `TimeoutWarning` – Warnung an einen inaktiven Spieler, dass sein Zug bald automatisch beendet wird. +- **Server → Client**: `EventCardDraw` – Eine Ereigniskarte wird gezogen, die Nachricht enthält die Karte und den Effekt. +- **Server → Client**: `SoundTrigger` – Signalisiert den Clients, bestimmte Soundeffekte auszulösen (z.B. „Würfeln“, „Grundstück kaufen“). + +### 4\. Interaktionen und Handelsmanagement + +- **Client → Server**: `TradeOffer` – Spieler sendet ein Handelsangebot an einen Mitspieler (enthält Details zu Geld, Grundstücken, etc.). +- **Server → Client**: `TradeRequest` – Übermittelt das Handelsangebot an den ausgewählten Handelspartner. +- **Client → Server**: `TradeResponse` – Antwortet auf ein Handelsangebot mit „Annehmen“ oder „Ablehnen“ oder „Gegenangebot“. +- **Client → Server**: `ViewAssetsRequest` – Spieler fordert an, die Besitztümer eines Mitspielers anzuzeigen. +- **Server → Client**: `ViewAssetsResponse` – Antwortet mit einer Übersicht der angeforderten Besitztümer eines Mitspielers. \ No newline at end of file diff --git a/uploads/Designphase/Klassendiagramme/ClassChart_V1.4.svg b/uploads/Designphase/Klassendiagramme/ClassChart_V1.4.svg new file mode 100644 index 0000000..3416461 --- /dev/null +++ b/uploads/Designphase/Klassendiagramme/ClassChart_V1.4.svg @@ -0,0 +1,4 @@ + + + +
Game
 -gameBoard: GameBoard 
 -bank: Bank 
 -timer: Timer 
 -deck: EventCard 
 -musicEnabled: boolean 
 -soundEffectEnabled: boolean 
 -eventCards: List<EventCard> 
 -communityCards: List<CommunityCard> 
 -gameState: GameState
+ initializeGame(): void
+ startTurn(player: Player): void
+ endTurn(player: Player): void
+ checkWinCondition(): boolean
+ applyEventCard(card: EventCard): void
+  rollDice(): DiceResult
- state
Player
-name: String
-color: ColorRGBA
-accountBalance: int
-gamePiece: GamePiece
-properties: List<Property>
-getOutOfJailCard: int
-fieldId: int

+move(steps: int): void
+buyProperty(property: Property): void
+payRent(amount: int): void
+declareBankruptcy(): void
<<abstract>>
GameState
InGame
GameOver
Lobby
-player
<<abstract>>
PlayerState
Active
Brankrup%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22NomalState%22%20style%3D%22swimlane%3BfontStyle%3D0%3BchildLayout%3DstackLayout%3Bhorizontal%3D1%3BstartSize%3D26%3BfillColor%3Dnone%3BhorizontalStack%3D0%3BresizeParent%3D1%3BresizeParentMax%3D0%3BresizeLast%3D0%3Bcollapsible%3D1%3BmarginBottom%3D0%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22-240%22%20y%3D%22380%22%20width%3D%22140%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3
Lobby
InJail
-roundsInJail: Int
WaitForTurn
-game
StartScreen
CreateGame
Settings
GameClosed
Dice
+rollDice(): int
GulagField
-bailCost: int
+payBail(player: Player): void
+checkIfInJail(player: Player): boolean
MenuView
- properties
<<abstract>>
PropertyField
-price: int
-rent: int
-owner: Player
-mortgaged: boolean
TestStreckeField
+collectMoney(player: Player): void
EventField
-bailCost: int
+payBail(player: Player): void
+checkIfInJail(player: Player): boolean
Wache
+sendToJail(player: Player): void
FoodField
-diceCount: int
+applyDiceRollEffect(diceValue: int): void
GateField
-rentLevel: int

+calculateRent(): int
BuildingProperty
-houses: int
-hotel: boolean
+buildHouse(): void
+buildHotel(): void
TradeHandler
-offeredProperties: List<Property>
-offerMoney: int
-offerCards: List<Card>
+initiateTrade(trader: Player, tradee: Player): void
+offerProperty(property: Property): void
+offerMoney(amount: int): void
+finalizeTrade(): boolean
app
fields
MainMenu
+showMenu(): void
+hideMenu(): void
NewGameMenu
+createNewGame(): void
+camcel(): void
SettingMenu
+loadSettings(): void
+saveSettings(): void
+adjustVolume(level: int): void
Trading
+initiateTrade(): void
+confirmTrade(): void
+cancelTrade(): void
PropertyAdmin
+manageProperty(): void
+upgradeProperty(): void
+mortgageProperty(): void
- appState
- control
MonopolyApp
MainSynchronizer
<<abstract>>
ModelViewSynchronizer
MenuState
Camera
<<abstract>>
AppState
network
Client
-host: String
-port: int
+connect(): void
+disconnect(): void
Server
-playerConnections: List<PlayerCo
-gameState: GameState
-port: int
+startServer(): void
+stopServer(): void
+broadcastMessage(msg: String): void
-server
monopoly

<<abstract>>
Property


- name: String
- id: int


+ onPlayerLanding(player: Player): void

PlayerHandler
- playerHandler
- players
2**6
PropertyManager
SimpleApplication
jme
GameControl
+startGame(): void
+endGame(): void
NetworkClient
Server
messages
model
<<abstract>>
ClientMessage
+ accept(ServerInterpreter, int): void
<<abstract>>
ServerMessage
+ accept(ClientInterpreter, int): void
ConnectRequest
DisconnectRequest
PlayerReady
RollDice
BuyPropertyRequest
EndTurn
TradeOffer
TradeOffer
TradeResponse
ViewAssetsRequest
ConnectionResponse
PlayerDisconnected
GameEnd
DiceResult
MoveResult
BuyPropertyResponse
PayRent
UpdatePlayerAssets
NextPlayerTurn
JailEvent
GameEnd
GameStart
GameOver
PlayerStatusUpdate
TimeOutWarning
EventDrawCard
TradeRequest
ViewAssetsResponse
SoundTrigger
ClientInterpreter
ClientInterpreter
\ No newline at end of file diff --git a/uploads/Designphase/Sequenzdiagramme/Würfeln_V1.2.svg b/uploads/Designphase/Sequenzdiagramme/Würfeln_V1.2.svg new file mode 100644 index 0000000..2b5b2d5 --- /dev/null +++ b/uploads/Designphase/Sequenzdiagramme/Würfeln_V1.2.svg @@ -0,0 +1,4 @@ + + + +
würfeln : Button
würfeln : Button
1): "Spieler klickt"
1): "Spieler klickt"
game : Game
game : Game
2): toDice()
2): toDice()
8:
8:
dice1 : Dice
dice1 : Dice
3: getEyes()
3: getEyes()
4: rollDice()
4: rollDice()
7: rollDice()
7: rollDice()
9:
9:
10:
10:
dice2 : Dice
dice2 : Dice
6:getEyes()
6:getEyes()
5:
5:
actor: Player
actor: Play...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/uploads/Designphase/Testhandbuch/Testhandbuch_V2.3.xlsx b/uploads/Designphase/Testhandbuch/Testhandbuch_V2.3.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..51adc867605f8bc82d9228905f5cad0d832c00d6 GIT binary patch literal 27917 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 literal 0 HcmV?d00001 diff --git a/uploads/Designphase/Zustandsdiagramme/GameStateChart_V1.2.svg b/uploads/Designphase/Zustandsdiagramme/GameStateChart_V1.2.svg new file mode 100644 index 0000000..85625b8 --- /dev/null +++ b/uploads/Designphase/Zustandsdiagramme/GameStateChart_V1.2.svg @@ -0,0 +1,4 @@ + + + +
InGame
StartScreen
CreateGame
InLobby
close Game
GameOver
click "Spielen"
recieved(ConnectionResponse) sucessfull
recieved(GameStart)
recieved(GameOver)
GameState
\ No newline at end of file diff --git a/uploads/Designphase/Zustandsdiagramme/PlayerStateChart_V1.3.svg b/uploads/Designphase/Zustandsdiagramme/PlayerStateChart_V1.3.svg new file mode 100644 index 0000000..a575490 --- /dev/null +++ b/uploads/Designphase/Zustandsdiagramme/PlayerStateChart_V1.3.svg @@ -0,0 +1,4 @@ + + + +
Active
recieved(JailEvent) == true
InJail
WaitForTurn
Bankrup%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%26lt%3Bfont%20style%3D%26quot%3Bfont-size%3A%2022px%3B%26quot%3B%26gt%3BActive%26lt%3B%2Ffont%26gt%3B%22%20style%3D%22rounded%3D1%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22360%22%20y%3D%22845%22%20width%3D%22210%22%20height%3D%2270%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Et
Lobby
recieved(GameStart)
send(TurnEnd)
recived(PlayerNextTurn).id == ownID
send(PlayerStatusUpdate).keyword = bankrupt
PlayerState
recieved(JailEvent) == false
rollDice
send(PlayerReady)
\ No newline at end of file