diff --git a/Analysephase/Gestaltungsrichtlinien.md b/Analysephase/Gestaltungsrichtlinien.md index c6941a0..5defe29 100644 --- a/Analysephase/Gestaltungsrichtlinien.md +++ b/Analysephase/Gestaltungsrichtlinien.md @@ -3,4 +3,4 @@ Hier wird die Gestaltungsrichtlinie veröffentlicht * [Gestaltungsrichtlinie_V1.0](../uploads/Analysephase/Gestaltungsrichtlinien/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.0.pdf) * [Gestaltungsrichtlinie_V1.1](../uploads/Analysephase/Gestaltungsrichtlinien/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.1.pdf) * [Gestaltungsrichtlinie_V1.2](../uploads/Analysephase/Gestaltungsrichtlinien/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.2.pdf) -* [Gestaltungsrichtlinien_V1.3.pdf](uploads/f0d83a8c72258ef81b1bc5c3d557d9e7/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.3.pdf) \ No newline at end of file +* [Gestaltungsrichtlinie_V1.3](../uploads/Analysephase/Gestaltungsrichtlinien/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.3.pdf) \ No newline at end of file diff --git a/Designphase/Klassendiagramme.md b/Designphase/Klassendiagramme.md index 6cfaa6d..ca1814f 100644 --- a/Designphase/Klassendiagramme.md +++ b/Designphase/Klassendiagramme.md @@ -9,6 +9,7 @@ Hier werden Klassendiagramme veröffentlicht * [ClassChart_V2.0](../uploads/Designphase/Klassendiagramme/ClassChart_V2.0.svg) * [ClassChart_V2.1](../uploads/Designphase/Klassendiagramme/ClassChart_V2.1.svg) * [ClassChart_V3.0](../uploads/Designphase/Klassendiagramme/ClassChart_V3.0.svg) +* [ClassChart_V3.1](../uploads/Designphase/Klassendiagramme/ClassChart_V3.1.svg) --- diff --git a/Protokolle/Gruppentreffen/17.11.2024_Discord.md b/Protokolle/Gruppentreffen/17.11.2024_Discord.md index 051aaec..eefb76c 100644 --- a/Protokolle/Gruppentreffen/17.11.2024_Discord.md +++ b/Protokolle/Gruppentreffen/17.11.2024_Discord.md @@ -51,4 +51,8 @@ * GUI und Spielfeld (Schmidt) * Blenderfiguren (Malkmus) * Code und Änderungen im Klassendiagramm (Schmelz) - * Benutzerhandbuch \ No newline at end of file + * Benutzerhandbuch + +**3. Sonstiges** + +* Stand 17.11.2024 ist der GUI-Branch der aktuellste \ No newline at end of file diff --git a/Protokolle/Präsentationen/11.11.2024.md b/Protokolle/Präsentationen/11.11.2024.md index a5643c6..646a8d7 100644 --- a/Protokolle/Präsentationen/11.11.2024.md +++ b/Protokolle/Präsentationen/11.11.2024.md @@ -40,10 +40,6 @@ * keine besonderen Anmerkungen zu "Spielzug_V2.1" und "Spielende_V2.1" -* Diagramm ist zu detailliert und zu nah an der tatsächlichen Implementierung für die Analysephase - * Klassendiagramme sollten bisher nur die notwendigsten Attribute enthalten - * Es der Fokus hätte auf den existierenden Objekten als solche liegen müssen und wie diese miteinander Interagieren, weniger auf die Attribute der einzelnen Objekte - **3. Sequenzdiagramme (Malkmus)** * Deutliche Verbesserung der Syntax und der Qualität der Sequenzdiagramme diff --git a/uploads/2b0b6add1f34563a9ba910959473adc0/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.1.pdf b/uploads/2b0b6add1f34563a9ba910959473adc0/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.1.pdf deleted file mode 100644 index c2e7f99..0000000 Binary files a/uploads/2b0b6add1f34563a9ba910959473adc0/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.1.pdf and /dev/null differ diff --git a/uploads/f0d83a8c72258ef81b1bc5c3d557d9e7/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.3.pdf b/uploads/Analysephase/Gestaltungsrichtlinien/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.3.pdf similarity index 100% rename from uploads/f0d83a8c72258ef81b1bc5c3d557d9e7/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.3.pdf rename to uploads/Analysephase/Gestaltungsrichtlinien/Gestaltungsrichtlinien_Monopoly_UniBw_Edition_V1.3.pdf diff --git a/uploads/Designphase/Klassendiagramme/ClassChart_V3.1.svg b/uploads/Designphase/Klassendiagramme/ClassChart_V3.1.svg new file mode 100644 index 0000000..d190ba5 --- /dev/null +++ b/uploads/Designphase/Klassendiagramme/ClassChart_V3.1.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
Bankrupt%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
+checkInJail(player: Player): boolean
- properties
TestStreckeField
- money: int
+collectMoney(player: Player): void
EventField
+payBail(player: Player): void
+checkIfInJail(player: Player): boolean
WacheField
+sendToJail(player: Player): void
FoodField
- factor: int
+applyDiceRollEffect(diceValue: int): void
GateField
-rentLevel: int

+calculateRent(): int
BuildingProperty
-houses: int
-hotel: boolean
+buildHouse(p: Player): void
+buildHotel(p: Player): 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
fields
monopoly

<<abstract>>
Field


- name: String

- id: int


+ accept(v: FieldVisitor, p: Player, g: Game)

PlayerHandler
- playerHandler
- players
2**6
GameBoard
~ fieldAt(id: int)
~ fieldId(f: Field)
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
DeckHelper
- cards: Queue<Cards>
- shuffle(List<Cards>): void
+ drawCard(): Card
Card
- description: String
+ accept(v: CardVisitor, p: Player, g: Game): void
~ getDescription(): String
card
<<interface>>
CardVisitor
+ visit(c: Card, p: Player, g: Game)
<<interface>>
FieldVisitor
+ visit(f: FoodField, p: Player, g: Game)
+ visit(f: BuildingField, p: Player, g: Game)
+ visit(f: GateField, p: Player, g: Game)
+ visit(f: GulagField, p: Player, g: Game)
+ visit(f: EventField, p: Player, g: Game)
+ visit(f: TestStreckeField, p: Player, g: Game)
+ visit(f: WacheField, p: Player, g: Game)
<<abstract>>
PropertyField
- price: int
- rent: int
- owner: Player
- mortaged: boolean
~ setOwner(p: Player): void
- visual
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

<<interface>>
ClientInterpreter


<<interface>>
ServerInterpreter



MonopolyApp


- MonopolyApp():


- escape(boolean): void
+ main(String[]): void
- makeServerConnection(): ServerConnection
+ simpleInitApp(): void
+ receivedEvent(InfoTextEvent): void
- close(): void
- makeSettings(): AppSettings
+ stop(boolean): void
~ confirmDialog(String, Runnable): void
+ closeApp(): void
+ simpleUpdate(float): void
+ requestClose(boolean): void
~ errorDialog(String): void
- attachGameSound(): void
- setupInput(): void
- setupStates(): void
- attachGameMusic(): void
+ receivedEvent(ClientStateEvent): void
- setupGui(): void


config: MonopolyAppConfig
dialogManager: DialogManager
infoText: String
executor: ExecutorService
gameLogic: ClientGameLogic
draw: Draw

MonopolyAppConfig


+ MonopolyAppConfig():


+ useGammaCorrection(): boolean
- makeColorRGBA(String): ColorRGBA
# convertToType(String, Class<?>): Object
+ fullScreen(): boolean
+ useRetinaFrameBuffer(): boolean


showStatistics: boolean
topColor: ColorRGBA
resolutionWidth: int
resolutionHeight: int
showSettings: boolean

MonopolyAppState


# MonopolyAppState():


+ showsDialog(): boolean
# enableState(): void
+ initialize(AppStateManager, Application): void
# disableState(): void


gameLogic: ClientGameLogic
enabled: boolean
app:MonopolyApp

<<interface>>
FileAction


+ run(File): void

GameMusic


+ GameMusic():


+ volumeInPreferences(): float
- loadSound(Application, String): AudioNode
+ initialize(AppStateManager, Application): void
+ enabledInPreferences(): boolean
+ toggleSound(): void


enabled: boolean
volume: float

GameSound


+ GameSound():


+ initialize(AppStateManager, Application): void
+ toggleSound(): void
+ enabledInPreferences(): boolean
- loadSound(Application, String): AudioNode
+ passGo(): void
+ cardEvent(): void

+ goJail(): void

+ rollDice(): void

+ earnMoney(): void

+ looseMoney(): void

+ acceptOffer(): void

+ refuseOffer(): void

+ winnerSound(): void

+ looserSound(): void

+ receivedEvent(SoundEvent): void


enabled: boolean

MapView


~ MapView(GameBoard, MonopolyApp):


- setupBackground(): void
+ mouseToModel(Vector2f): IntPoint
+ addGrid(): void
- gridLine(Position, Position): Geometry
~ unregister(): void
+ modelToView(float, float): Position
+ viewToModel(float, float): IntPoint


height: float
width: float
app: MonopolyApp
node: Node
map: MonopolyMap

MapViewSynchronizer


+ MapViewSynchronizer(MapView):


+ visit(Pawn): Spatial
+ visit(House): Spatial
+ visit(Hotel): Spatial

Menu


+ Menu(MonopolyApp):


- handle(FileAction, TextInputDialog): void
- fileDialog(FileAction, String): void
+ update(): void
- saveDialog(): void
- loadDialog(): void
+ update(float): void
+ escape(): void

NetworkDialog


~ NetworkDialog(NetworkSupport):


- connect(): void
- startServerInThread(): void
+ update(float): void
- initNetwork(): Object
- success(): void
- failure(Throwable): void
- openProgressDialog(): void

NetworkSupport


+ NetworkSupport(MonopolyApp):


+ send(ClientMessage): void
~ initNetwork(String, int): void
+ clientDisconnected(Client, DisconnectInfo): void
+ disconnect(): void
+ messageReceived(Client, Message): void
+ clientConnected(Client): void
+ connect(): void


connected: boolean
app: MonopolyApp

ParticleEffectFactory


~ ParticleEffectFactory(MonopolyApp):


~ createSmokeEmitter(): ParticleEmitter
+ createConfetti(): ParticleEmitter

GameBoardSynchronizer


+ SeaSynchronizer(MonopolyApp, Node, GameBoard):


- removePawn(Pawn): void
+ visit(Pawn): Spatial
- createBox(Pawn): Spatial
+ visit(House): Spatial
+ visit(Hotel): Spatial
- createPawn(Pawn): Spatial
- createHouse(House): Spatial
- createColoredMaterial(ColorRGBA): Material
- createHotel(Hotel): Spatial
- calculateRotationAngle(Rotation): float

HouseControl


+ HouseControl(House, Node):


# controlRender(RenderManager, ViewPort): void
# controlUpdate(float): void

PawnControl


+ PawnControl(Pawn, Node):


# controlRender(RenderManager, ViewPort): void
# controlUpdate(float): void

VolumeSlider


+ VolumeSlider(GameMusic):


+ update(): void

gui

MainSynchronizer


# GameBoardSynchronizer(GameBoard, Node):


# addExisting(): void
+ receivedEvent(ItemRemovedEvent): void
+ receivedEvent(ItemAddedEvent): void
# translate(Item): Spatial

client
MainMenu
+showMenu(): void
+hideMenu(): void
NewGameMenu
+createNewGame(): void
+cancel(): void
SettingMenu
+loadSettings(): void
+saveSettings(): void
+adjustVolume(level: int): void
Trading
+initiateTrade(): void
+confirmTrade(): void
+cancelTrade(): void
PropertyAdmin
+manageProperty(): void
+upgradeProperty(): void
+mortgageProperty(): void

MonopolyServer


+ run(): void
+ messageReceived(HostedConnection, Message): void
+ send(int, ServerMessage): void
- registerListeners(): void
+ main(String[]): void
+ connectionRemoved(Server, HostedConnection): void
- startServer(): void
+ connectionAdded(Server, HostedConnection): void
- exit(int): void
- processNextMessage(): void
- initializeSerializables(): void

<<record>>
ReceivedMessage


~ ReceivedMessage(ClientMessage, int):


~ process(ClientInterpreter): void
+ message(): ClientMessage
+ from(): int

server
<<interface>>
VisualVisitor<T>
+ visit(house :House): T
+ visit(playerFigure :PlayerFigure): T
+ visit(hotel: Hotel): T

Pawn


- rotation: Rotation
- status: Status
- position: Vector3f


+ accept(VisualVisitor): void
+ contains(IntPosition): boolean
+ toString(): String
+ moveTo(IntPosition): void
+ moveTo(int, int): void
+ rotated(): void
+ accept(Visitor<T>): T
+ contains(int, int): boolean

- updateRotation(Vector3f, Vector3f): void

IntPoint


+ IntPoint(int, int):
- IntPoint():


+ toString(): String
+ equals(Object): boolean
+ hashCode(): int


y: int
x: int

<<interface>>
IntPosition


y: int
x: int

<<interface>>
Item


+ accept(VoidVisitor): void
+ accept(Visitor<T>): T

Hotel


- rotation: Rotation
- status: Status
- position: Vector3f


+ accept(VisualVisitor): void
+ contains(IntPosition): boolean
+ toString(): String
+ moveTo(IntPosition): void
+ moveTo(int, int): void
+ rotated(): void
+ accept(Visitor<T>): T
+ contains(int, int): boolean

- updateRotation(Vector3f, Vector3f): void

House


- rotation: Rotation
- status: Status
- position: Vector3f


+ accept(VisualVisitor): void
+ contains(IntPosition): boolean
+ toString(): String
+ moveTo(IntPosition): void
+ moveTo(int, int): void
+ rotated(): void
+ accept(Visitor<T>): T
+ contains(int, int): boolean

- updateRotation(Vector3f, Vector3f): void

<<enumeration>>
Rotation


- Rotation():


+ dx(): int
+ rotate(): Rotation
+ values(): Rotation[]
+ dy(): int
+ valueOf(String): Rotation

<<record>>
ClientStateEvent


+ ClientStateEvent():


+ notifyListener(GameEventListener): void

<<interface>>
GameEvent


+ notifyListener(GameEventListener): void

<<interface>>
GameEventBroker


+ notifyListeners(GameEvent): void

<<interface>>
GameEventListener


+ receivedEvent(ClientStateEvent): void
+ receivedEvent(ItemRemovedEvent): void
+ receivedEvent(SoundEvent): void
+ receivedEvent(InfoTextEvent): void
+ receivedEvent(ItemAddedEvent): void

<<record>>
InfoTextEvent


+ InfoTextEvent(String):


+ notifyListener(GameEventListener): void
+ key(): String

<<record>>
ItemAddedEvent


+ ItemAddedEvent(Item, GameBoard):


+ map(): GameBoard
+ item(): Item
+ notifyListener(GameEventListener): void

<<record>>
ItemRemovedEvent


+ ItemRemovedEvent(Item, GameBoard):


+ item(): Item
+ map(): GameBoard
+ notifyListener(GameEventListener): void

<<enumeration>>
Sound


- Sound():


+ values(): Sound[]
+ valueOf(String): Sound

<<record>>
SoundEvent


+ SoundEvent(Sound):


+ notifyListener(GameEventListener): void
+ sound(): Sound

notification
GoField
frame
Das messages-Package organisiert Netzwerk-Nachrichten für die Kommunikation zwischen Client und Server und nutzt Interpreter zur Verarbeitung
Die Visitor-Interfaces ermöglichen flexible Aktionen auf Karten, Feldern und grafischen Objekten im Spiel
Das server-Package steuert die Serverlogik, verwaltet Verbindungen und verarbeitet Client-Nachrichten
Das card-Package verwaltet Ereignis- und Gemeinschaftskarten und ermöglicht deren flexiblen Einsatz im Spie
Das notification-Package verwaltet Spielereignisse und ermöglicht es, Listener bei bestimmten Aktionen wie Item-Änderungen oder Sounds zu benachrichtigen
Das fields-Package organisiert verschiedene Spielfelder und erlaubt spezifische Aktionen je nach Feldtyp
Das frame-Package steuert den gesamten Spielablauf im Monopoly-Spiel, verwaltet Spieler, das Spielfeld, Spielfiguren und deren Interaktionen. Es bildet die logische Basis des Spiels.
Das gui-Subpackage steuert die Benutzeroberfläche des Monopoly-Clients in der jMonkeyEngine, einschließlich Spielbrettanzeige, Menüs und Soundsteuerungen und Effekte
Das client-Package steuert die Hauptlogik des Monopoly-Clients in der jMonkeyEngine, einschließlich Netzwerk, Konfiguration, Sound und Benutzerinteraktionen in einer 3D-Umgebung
\ No newline at end of file