diff --git a/doc/diagrammes.md b/doc/diagrammes.md new file mode 100644 index 0000000..d3e02f7 --- /dev/null +++ b/doc/diagrammes.md @@ -0,0 +1,143 @@ +# Diagrammes d'architecture + + +## Diagramme de Classes / Structures + +Ce diagramme montre les relations statiques entre les composants principaux. + +@startuml + +!theme vibrant + +package "client_cli" { + class GameRunner { + - state: GameState + - bots: Vec + + new(Vec>) + + handle_event(&GameEvent) + } +} + +package "bot" { + class Bot { + - strategy: Box + + new(Box) + + handle_event(&GameEvent): Option + } + + interface BotStrategy { + + choose_move(): (CheckerMove, CheckerMove) + + get_game(): &GameState + ' ... autres méthodes + } + + class DefaultStrategy + class DqnStrategy + class ErroneousStrategy +} + +package "store" { + class GameState { + + stage: Stage + + turn_stage: TurnStage + + board: Board + + active_player_id: PlayerId + ' ... + + validate(&GameEvent): bool + + consume(&GameEvent) + } + + class GameEvent +} + +GameRunner "1" *-- "1..2" Bot : contient +Bot "1" *-- "1" BotStrategy : utilise +BotStrategy <|.. DefaultStrategy : implémente +BotStrategy <|.. DqnStrategy : implémente +BotStrategy <|.. ErroneousStrategy : implémente + +GameRunner ..> GameState : dépend de +GameRunner ..> GameEvent : gère +Bot ..> GameState : dépend de +Bot ..> GameEvent : traite et génère +BotStrategy ..> GameState : analyse +@enduml + + +## Diagramme de Séquence : Boucle de jeu d'un Bot + +Ce diagramme montre les interactions dynamiques lors d'un tour de jeu où c'est à un bot de jouer. + +@startuml +!theme vibrant +autonumber + +participant "main (client_cli)" as Main +participant "runner: GameRunner" as Runner +participant "bot: Bot" as Bot +participant "strategy: BotStrategy" as Strategy +participant "state: GameState" as GameState + +Main -> Runner: new(strategies, seed) +activate Runner +Runner -> GameState: new() +activate GameState +GameState --> Runner: state +deactivate GameState +Runner -> Main: runner +deactivate Runner + +... Boucle de jeu principale ... + +Main -> Runner: handle_event(event) +activate Runner + +Runner -> GameState: validate(event) +activate GameState +GameState --> Runner: bool +deactivate GameState + +Runner -> GameState: consume(event) +activate GameState +deactivate GameState + +Runner -> Bot: handle_event(event) +activate Bot + +note right of Bot: Le bot vérifie si c'est son tour de jouer + +Bot -> Strategy: get_mut_game() +activate Strategy +Strategy --> Bot: &mut GameState +deactivate Strategy + +' Supposons que c'est au bot de jouer un coup +Bot -> Strategy: choose_move() +activate Strategy +Strategy -> GameState: Accède à l'état (board, dice, etc.) +activate GameState +deactivate GameState +Strategy --> Bot: moves +deactivate Strategy + +Bot --> Runner: Some(GameEvent::Move) +deactivate Bot + +Runner -> Runner: handle_event(GameEvent::Move) +note right of Runner: Appel récursif pour traiter le coup du bot + +Runner -> GameState: validate(GameEvent::Move) +activate GameState +GameState --> Runner: true +deactivate GameState + +Runner -> GameState: consume(GameEvent::Move) +activate GameState +note right of GameState: L'état du jeu est mis à jour\n(pions déplacés, joueur actif changé) +deactivate GameState + +Runner --> Main: Option (ou None) +deactivate Runner + +@enduml +