Trivial Pursuit

1. Vue Globale

@startuml

[Utilisateur] as U
[Administrateur] as A
[Lobby] as L
[Partie] as P
[QuestionsDatabase] as QDB
[PartiesDatabase] as PDB
[UtilisateursDatabase] as UDB

() "Jouer" as itf_jouer
() "Connection" as itf_connection
() "Valider" as itf_valid
() "Administrer" as itf_adm
() "Manager" as itf_man
() "Vérifier" as itf_enr

A -down-( itf_connection
A -down-( itf_adm
L -left-() itf_adm
L -up-() itf_connection
L -left-( itf_jouer
P -right-() itf_jouer
U -down-( itf_connection
QDB -up-() itf_valid
P -down-( itf_valid
PDB -up-() itf_man
P -down-( itf_man
UDB -up-() itf_enr
L -down-( itf_enr

@enduml

1.1. Composants

1.1.1. Composant Lobby

Responsabilités du composant
  • Serveur :

    • Permet aux joueurs de se regrouper pour jouer ensemble, ou de quitter un groupe dont ils sont membres.

      • Gère les connexions des utilisateurs au serveur.

      • Gère l’authentification des utilisateurs.

    • Fournit des fonctionnalités pour créer, rejoindre, quitter et supprimer une partie.

    • Permet à l’administrateur d’effectuer des actions spécifiques, comme supprimer une partie dont il n’est pas propriétaire.

Interfaces fournies
Interface Administrer
@startuml
interface Connection {
  + supprimerPartie(idPartie: String): void
  + gérerUtilisateur(idJoueur: String, action: String): void
}
@enduml
context Administrer::supprimerPartie(idPartie: String): void
pre: idPartie.size() > 0

context Administrer::gérerUtilisateur(idJoueur: String, action: String): void
pre: idJoueur.size() > 0 and action.size() > 0
post:
-- Pas de postconditions
Interface Connection
@startuml
interface Connection {
  + seConnecter(identifiant: String, motDePasse: String): void
  + seDeconnecter(identifiant: String): void
}
@enduml

Contraintes sur les opérations :

context Connection::seConnecter(identifiant: String, motDePasse: String): void
pre: identifiant.size() > 0 and motDePasse.size() > 0
post:
-- Pas de postconditions

context Connection::seDeconnecter(identifiant: String, motDePasse: String): void
pre: identifiant.size() > 0 and motDePasse.size() > 0
post:
-- Pas de postconditions

1.1.2. Composant Partie

Responsabilités du composant
  • Serveur :

    • Crée tous les objets de jeu : joueurs, cartes et les initialise.

    • Démarre la partie lorsque tous les joueurs sont prêts.

    • Gère le déroulement des tours de la partie.

      • À chaque tour, reçoit les informations essentielles : la nouvelle position du joueur, le paquet de cartes non jouées, la carte jouée…​

      • Vérifie si la réponse du joueur est correcte, met à jour le score du joueur.

    • Définit le joueur gagnant à la fin de la partie.

Interfaces fournies
@startuml
interface Jouer {
  + créerPartie(idPartie: String, idPropriétaire: String): Partie
  + lancerPartie(idPartie: String): void
  + gererTour(): void
  + avancer(identifiant: String): void
  + répondreQuestion(questionId: String, réponse: String): void
  + definirJoueurGagnant(): Joueur
}
@enduml

Contraintes sur les opérations :

context Jouer::créerPartie(idPartie: String, idPropriétaire): Partie
pre: // Le lobby doit contenir entre 2 et 6 joueurs
post: partie.getJoueurs().size() > 1 && partie.getJoueurs().size() < 7

context lancerPartie(idPartie: String) : void
pre: idPartie != null //&& la partie est existante
post:
-- Pas de postconditions

context Jouer::gererTour(): void
pre: // partie en cours
post:
-- Pas de postconditions

context Jouer::avancer(identifiant: String): void
pre: identifiant != null && identifiant == partie.getJoueurs().getId() && partie.getCase(nouvelle_position).isEmpty()
post:
-- Pas de postconditions

context Jouer::distribuerCartes(joueur: Joueur, nombreCartes: Integer): void
pre:
    nombreCartes > 0 && partie.getJoueurs().contains(joueur)
post:
-- Pas de postconditions

context Jouer::répondreQuestion(questionId: int, reponse: String): void
pre:
     questionId > 0 && reponse != null
post:
-- Pas de postconditions

context Jouer::definirJoueurGagnant(): Joueur
pre:
-- Pas de préconditions
post:
    gagnant != null && partie.getJoueurs().contains(gagnant)

1.1.3. Composant UtilisateursDatabase

Responsabilités du composant
  • Serveur :

    • Stocker et gérer les données relatives aux utilisateurs et aux informations d’authentification.

Interfaces fournies
@startuml
interface Verifier {
  + créerUtilisateur(idUtilisateur: String, motDePasse: String): void
  + modifierMotDePasse(idUtilisateur: String, nouveauMotDePasse: String): void
  + récupérerInformationsJoueur(idUtilisateur: String): Joueur
  + supprimerJoueur(idUtilisateur: String): void
  + vérifierAdministrateur(idUtilisateur: String): Boolean
}
@enduml

Contraintes sur les opérations :

context Verifier::créerUtilisateur(idUtilisateur: String, motDePasse: String): void
pre:
  idUtilisateur.size() > 0 and motDePasse.size() > 0
post:
-- Pas de postconditions

context Verifier::modifierMotDePasse(idUtilisateur: String, nouveauMotDePasse: String): void
pre:
  idUtilisateur.size() > 0 and nouveauMotDePasse.size() > 0
post:
-- Pas de postconditions

context Verifier::récupérerInformationsJoueur(idUtilisateur: String): Joueur
pre:
  idUtilisateur.size() > 0
post:
-- Pas de postconditions

context Verifier::supprimerJoueur(idUtilisateur: String): void
pre:
  idUtilisateur.size() > 0
post:
-- Pas de postconditions

context Verifier::vérifierAdministrateur(idUtilisateur: String): Boolean
pre:
  idUtilisateur.size() > 0
post:
-- Pas de postconditions

1.1.4. Composant PartiesDatabase

Responsabilités du composant
  • Serveur :

    • Stocker et gérer les données relatives aux parties du jeu, les joueurs présents et leurs scores.

    • Créer de nouvelles parties, les modifier et les supprimer.

Interfaces fournies
@startuml
interface Manager {
  + créerPartie(idPartie: String): Boolean
  + supprimerPartie(idPartie: String): Boolean
  + récupérerJoueursPartie(idPartie: int): List<Joueur>
  + récupérerPartie(idPartie: String): Partie
  + modifierPartie(idPartie: String)
}
@enduml

Contraintes sur les opérations :

context Manager::créerPartie(idPartie: String): Boolean
pre:
  idPartie.size() > 0
post:
  -- Pas de postconditions

context Manager::supprimerPartie(idPartie: String): Boolean
pre:
  idPartie.size() > 0
post:
  -- Pas de postconditions

context Manager::récupérerJoueursPartie(idPartie: int): List<Joueur>
pre:
  idPartie > 0
post:
  -- Pas de postconditions

context Manager::récupérerPartie(idPartie: String): Partie
pre:
  idPartie.size() > 0
post:
  -- Pas de postconditions

context Manager::modifierPartie(idPartie: String)
pre:
  idPartie.size() > 0
post:
  -- Pas de postconditions

1.1.5. Composant QuestionsDatabase

Responsabilités du composant
  • Serveur :

    • Stocker et fournir les réponses et les questions utilisées dans le jeu.

Interfaces fournies
@startuml
interface Valider {
  + récupérerRéponse(idQuestion: String): Réponse
}
@enduml

Contraintes sur les opérations :

context Valider::récupérerRéponse(idQuestion: String): Réponse
pre: idQuestion != null
post: reponse != null

1.2. Interactions

Diagramme de séquence à propos de la connexion d’un utilisateur
@startuml

actor Utilisateur as U
participant "Lobby" as L
database "UtilisateursDatabase" as UDB

U -> L: seConnecter(String identifiant, String mdp)
activate L
L -> UDB: validerIdentifiants(String identifiant, String mdp)
activate UDB
UDB --> L: Identifiants validés
deactivate UDB
L -> U: Connexion réussie
deactivate L

U -> L: seDeconnecter(String identifiant)
activate L
L -> UDB: déconnecterUtilisateur()
activate UDB
UDB --> L: Utilisateur déconnecté
deactivate UDB
L -> U: Déconnexion réussie
deactivate L

@enduml
Diagramme de séquence de la suppression d’une partie par un administrateur
@startuml

actor Administrateur as A
participant "Lobby" as L
database "UtilisateursDatabase" as UDB

A -> L: supprimerPartie(String nomPartie)
activate L
L -> UDB: vérifierAdministrateur(String identifiant)
activate UDB
UDB --> L: Administrateur validé
deactivate UDB
L -> UDB: supprimerPartie(String nomPartie)
activate UDB
UDB --> L: Partie supprimée
deactivate UDB
L -> A: Confirmation de suppression de la partie
deactivate L

A -> L: gérerUtilisateur(String idUtilisateur, String action)
activate L
L -> UDB: vérifierAdministrateur(string identifiant)
activate UDB
UDB --> L: Administrateur validé
deactivate UDB
L -> UDB: effectuerActionSurUtilisateur(String idUtilisateur, String action)
activate UDB
UDB --> L: Action réalisée sur l'utilisateur
deactivate UDB
L -> A: Confirmation de l'action sur l'utilisateur
deactivate L

@enduml
Diagramme de séquence d’un joueur qui avance et qui répond à une question
@startuml

actor Joueur as J
participant "Partie" as P
database "Parties Database" as PDB
database "QuestionsDatabase" as QDB

J -> P: avancer()
activate P
P -> PDB: déplacerJoueur(String identifiant)
activate PDB
PDB --> P: Position mise à jour
deactivate PDB
P -> J: Confirmation de l'avancement
deactivate P

J -> P: répondreQuestion(int questionId, String réponseUtilisateur)
activate P
P -> QDB: récupérerRéponse(int questionId, String réponseUtilisateur)
activate QDB
QDB --> P: Réponse
deactivate QDB
P -> J: Résultat : réponseUtilisateur == réponse
deactivate P

@enduml