Compare commits

..

85 Commits

Author SHA1 Message Date
loris OBRY 474544432e debug
continuous-integration/drone/push Build is passing Details
2 years ago
loris OBRY f9a073559c stub
2 years ago
loris OBRY f07bd2a89b stubCarte
2 years ago
loris OBRY c9d98fb914 Merge branch 'master' of https://codefirst.iut.uca.fr/git/leon.enault/SAE-S2.01_MAUI
continuous-integration/drone/push Build is passing Details
2 years ago
loris OBRY 6239b3c949 ajustement en cast carte Equals
2 years ago
Loris OBRY d2a4482d2e Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Leon ENAULT b54c62c239 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Leon ENAULT 99a18f0449 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Leon ENAULT ea1b9d6d27 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 55de58e9d8 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 49612901ff Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 6ed26481a2 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY a1baad0746 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 6fe4328808 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 7856c0bf0f Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY ab470a0a56 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 21ce350cbd Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 7acec3d696 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 0562fa502b Mise à jour de 'README.md'
continuous-integration/drone/push Build was killed Details
2 years ago
Loris OBRY fa252c7eda Mise à jour de 'README.md'
continuous-integration/drone/push Build was killed Details
2 years ago
Loris OBRY 369e282f54 Mise à jour de 'README.md'
continuous-integration/drone/push Build was killed Details
2 years ago
Loris OBRY 90d4781e29 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY e7472de222 Mise à jour de 'README.md'
continuous-integration/drone/push Build was killed Details
2 years ago
Loris OBRY 5025293e32 Mise à jour de 'README.md'
continuous-integration/drone/push Build was killed Details
2 years ago
Loris OBRY ada63dbfe6 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 195282e2d6 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY ba50a76375 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 6e89733411 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 31e229a72a Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 9a063c84d4 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 6c59061090 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 2fa960a251 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY d2715add13 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY aae8fdb925 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 284fda023e Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 37c6aac8a7 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 40895f9734 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY ce225053a7 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 38c2512c8f Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 84b11b5291 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY a5274c25fa Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 746fa1a5e7 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY c19ef346ba Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 8d22dbf5a3 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 5ac2579683 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 75de8194ce Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY e1ba6c2596 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 719cdf90e7 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY d7f0bd0e5a Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY f6d7721373 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 017f45c83d Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY c1b45f2813 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY f19279506e Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 91db7ada4e Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY af54e89324 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 12dab0819a Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 0d8179e311 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 11c198750f Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 3bd38e30ba Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY d3a4024357 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 70d4bc542b Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 2425c2568d Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY bed17cc8f8 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 02db2d5e57 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY b21150c664 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 22c7a15d42 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Leon ENAULT 0b8cefa6c4 Mise à jour de 'XMLFile1.xml'
continuous-integration/drone/push Build is passing Details
2 years ago
Leon ENAULT c8a224e0ef Mise à jour de 'XMLFile1.xml'
continuous-integration/drone/push Build is passing Details
2 years ago
Leon ENAULT aa87b1b4e7 Mise à jour de 'XMLFile1.xml'
continuous-integration/drone/push Build is passing Details
2 years ago
Leon ENAULT 70dcf72b23 Mise à jour de 'XMLFile1.xml'
continuous-integration/drone/push Build is passing Details
2 years ago
Leon ENAULT e603a30924 Mise à jour de 'XMLFile1.xml'
continuous-integration/drone/push Build is passing Details
2 years ago
Leon ENAULT 268e520174 Mise à jour de 'XMLFile1.xml'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 837e821289 Modification carte
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY c30a15c19d modification consoleapp
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 72e85162ec Resolution conflits pour le merge avec persistance
continuous-integration/drone/push Build is failing Details
2 years ago
Loris OBRY c42ce1290d Merge remote-tracking branch 'origin/Persistance'
2 years ago
Loris OBRY 0a7ee83120 Ajout dossier Classes
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 4da35da005 ajout de camp.cs
2 years ago
Loris OBRY 45dfdb77d6 Passage en List pour les commentaires, ajout du OnPropertyCHange pour le pack et les commentaires et quelques corrections dans le code
continuous-integration/drone/push Build is failing Details
2 years ago
Loris OBRY 1d23609474 Ajout de la liste de commentaire dans carte
2 years ago
Loris OBRY 067a5ca9c5 fix commentaire ctr
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 18f1fd95d2 Commentaire et Icontenu
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY fdd3b1c30a Utilisateur cs
continuous-integration/drone/push Build is passing Details
2 years ago
Leon ENAULT 8b826ae70e Mise à jour de 'XMLFile1.xml'
continuous-integration/drone/push Build is passing Details
2 years ago
Loris OBRY 3cb6bedf55 Merge pull request 'Modification OnPropertyCHanched avec CallerMemberName et ajout des onPrepertychanged' (#2) from DebutDataBinding into master
continuous-integration/drone/push Build is passing Details
2 years ago

@ -1,74 +1,134 @@
# SAE-S2.01_MAUI
# Diagramme de paquetage - Jeu de cartes Loup garou
![Jeu de carte Loup garou](https://media.discordapp.net/attachments/447796473938182155/1114996448262623334/Packtage_diagram.drawio_4.png?width=842&height=676)
Diagramme de classe de l'application
Le diagramme de paquetage comprend trois projets dans la solution :
## Projet "Tests"
Ce projet contient les tests unitaires qui se concentrent sur le code de la partie modèle. Les tests dépendent du projet "Model" pour vérifier le comportement attendu des fonctionnalités du modèle.
## Projet "Model"
Ce projet contient les classes, les stubs, la sérialisation et la logique de l'application. Les données utilisées pour afficher les détails d'une carte sont initialisées dans les stubs du modèle. Les autres parties de l'application, y compris le projet "Views", dépendent du modèle pour accéder et afficher les données.
Dans Classes L'`IDataManager` fournit une interface pour accéder et gérer les données nécessaires pour le fonctionnement du modèle, il permet d'instancier un manager en utilisant soit un stub, soit l'xml, c'est l'injection de dépendance.
Le projet "Model" comprend également la sérialisation, permettant de convertir les objets en une représentation sérialisée, en XML, et inversement. Cela facilite le stockage et l'échange de données dans l'application.
## Projet "MauiApp1" (ou "Views")
Ce projet contient les vues de l'application. Les vues utilisent les données du modèle pour afficher les différentes pages, notamment la page de détails de la carte. Les vues dépendent du projet "Model" pour accéder aux données nécessaires à l'affichage.
Les vues sont responsables de la présentation des données au sein de l'interface utilisateur de l'application. Elles utilisent les fonctionnalités fournies par le projet "Model" pour récupérer et afficher les informations pertinentes. Ainsi, les utilisateurs peuvent interagir avec l'application et visualiser les différentes pages et fonctionnalités proposées par le jeu de cartes Loup garou.
# Diagramme de classe
```plantuml
@startuml
Class IdataManager {
.. Gestion Persistance ..
+ IEnumerable<Carte> loadCarte()
+ void saveCarte(List<Carte>)
+ IEnumerable<Pack> loadPack()
+ void savePack(List<Pack>)
+ IEnumerable<User> loadUser()
+ void saveUser(List<User)
}
Class Manager {
- ReadOnlyObservableCollection<Carte> Cartes
- ReadOnlyObservableCollection<Pack> Packs
- ReadOnlyObservableCollection<User> User
.. Methodes Cartes ..
+ Carte addCarte(Carte c)
+ Carte removeCarte(Carte c)
+ List<Carte> getCartes(Carte c)
.. Methodes Pack ..
+ Pack addPack(Pack p)
+ Pack removePack(Pack p)
+ List<Pack> getPack(Pack p)
.. Methodes User ..
+ User addUser(User u)
+ User removePack(Pack p)
+ List<User> getUser(User u)
.. Gestion Persistance ..
+ IEnumerable<Carte> loadCarte()
+ void saveCarte(List<Carte>)
+ IEnumerable<Pack> loadPack()
+ void savePack(List<Pack>)
+ IEnumerable<User> loadUser()
+ void saveUser(List<User)
}
Class User {
- String pseudo
- String mot_de_passe
+ int getNote(Carte)
+ int setNote(Carte)
+ int getNote(Pack)
+ int setNote(Pack)
+ string getCommentaire(Commentaire)
+ string setCommentaire(Commentaire)
+ int getLike(Commentaire)
+ int setLike(Commentaire)
+ int getSignale(Commentaire)
+ int setSignale(Commentaire)
}
Class Carte {
+ event INotiFyPropertyChanged PropertyChanged
- String nom
- String description
- String pouvoir
- String strategies
- int note
- String lienImage
+ int getNbCommentaire(Commentaire)
+ int getCommentaire(Commentaire)
+ int getNote()
+ int setNote()
- Set<User> likes
+ void addCommentaire(User)
+ void removeCommentaire(User)
+ bool hasLiked(User)
+ void addLike(User)
+ void removeLike(User)
}
Class Commentaire {
+ event INotiFyPropertyChanged PropertyChanged
- String contenu
- int signale
- int nblike
- int nbdislike
+ int getLike()
+ int setLike()
- Set<User> likes
+ bool hasLiked(User)
+ void addLike(User)
+ void removeLike(User)
}
Class Pack {
- String nom
+ event INotiFyPropertyChanged PropertyChanged
- String nom
- String description
- int note
- String lienImage
- Vector<Carte> cartes
+ int getNbCommentaire(Commentaire)
+ int getCommentaire(Commentaire)
+ Vector<&Carte> getCartes()
- Set<Carte> cartes
- Set<User> likes
+ void addCommentaire(User)
+ void removeCommentaire(User)
+ bool hasLiked(User)
+ void addLike(User)
+ void removeLike(User)
}
Class Camp {
- String nom
- String description
- String lienImage
- Vector<Carte> cartes
+ Vector<&Carte> getCartes()
- Set<Carte> cartes
}
User --> Pack
User --> Carte
User --> Commentaire
Commentaire *--> Pack
Commentaire *--> Carte
User --* Commentaire : auteur
Commentaire <-- Pack : List lCommentaires
Commentaire <-- Carte : List lCommentaires
Pack --|> Carte
Camp --|> Carte
Manager --> Carte
Manager --> Pack
Manager --> User
Manager o-- IdataManager : IDataManager (Injection de dépendances)
hide circle
allowmixing
skinparam classAttributeIconSize 0
@ -77,6 +137,205 @@ skinparam classBorderColor #800000
skinparam classArrowColor #800000
skinparam classFontColor #black
skinparam classFontName Tahoma
class Commentaire #line:green;back:lightblue
@enduml
```
Voici le diagramme de classe général représentant les classes et leurs attributs. Il faut noter que nous avons utiliser les propriété a la place des attributs afin de définir des règles de lecture et d'écriture directement.
__IDataManager__ est une interface qui définit les méthodes pour la gestion de la persistance des données. Elle propose des méthodes pour charger et enregistrer des listes de cartes, de packs et d'utilisateurs.
### Manager
__Manager__ est une classe concrète qui implémente l'interface IDataManager. Elle est responsable de la gestion des collections de cartes, de packs et d'utilisateurs. Elle contient également des méthodes spécifiques pour chaque type d'objet, telles que l'ajout, la suppression et l'obtention de cartes, de packs et d'utilisateurs.
### User
__User__ représente un utilisateur de notre application. Il est capable d'ecrire des commentaires sur les cartes et les packs de jeu.
### Carte
__Carte__ représente une carte du jeu. Elle contient des attributs tels que le nom, la description, le pouvoir, les stratégies, la note, le lien vers l'image, une liste de commentaires et un ensemble d'utilisateurs qui ont aimé cette carte. Elle possède également des méthodes pour gérer les commentaires et les likes.
On utilise INotiFyPropertyChanged pour que la liste des commentaires affichés soit mit a jour apres modification.
### Commentaire
__Commentaire__ représente un commentaire sur une carte ou un pack. Il contient des attributs tels que l'auteur, le contenu, le nombre de signalements, le nombre de likes et de dislikes, ainsi qu'un ensemble d'utilisateurs qui ont aimé ce commentaire. Il possède des méthodes pour gérer les likes.
On utilise INotiFyPropertyChanged pour modifier les commentaires sur la vue si ils sont modifiés.
### Pack
__Pack__ représente un pack de cartes dans le système. Il contient des attributs tels que le nom, la description, la note, le lien vers l'image, un ensemble de cartes, une liste de commentaires et un ensemble d'utilisateurs qui ont aimé ce pack. Il possède également des méthodes pour gérer les commentaires et les likes.
On utilise INotiFyPropertyChanged pour que la liste des commentaires affichés soit mit a jour apres modification.
### Camp
__Camp__ représente un camp de cartes tel que Loup-Garou, Villageois ou encore Solo. Il contient des attributs tels que le nom, la description, le lien vers l'image et un ensemble de cartes. Un camp est une relation d'association entre des cartes.
### Likes
Chaque utilisateur ne peut 'liker' qu'une fois une carte/pack, on utilise donc un set pour avoir des clés uniques, évitant les doublant. Le set nous permet également d'effectuer des opération de recherche plus rapidement pour verifier si un utilisateur à déjà 'liker' ou non.
### Commentaires
Chaque utilisateur peut commenter autant de fois qu'il veut une carte/pack, il peut également supprimer les commentaires qu'il à écrit.
# Diagramme de classe pour la persistance
```plantuml
@startuml
Class stubCarte {
-List<Carte> lCarte
- IEnumerable<Carte> CreateCartes()
+ List<Carte> getCartes()
}
Class stubPack{
-List<Carte> lPack
- IEnumerable<Pack> CreatePack()}
+ List<Pack> getPack()
}
Class stubCommentaire{
-List<Commentaire> lCommentaire
- IEnumerable<Commentaire> CreateCommentaire()
+ List<Commentaire> getCommentaires()
}
Class stubCamp{
-List<Camp> lCamp
- IEnumerable<Carte> CreateCartes()
+ List<Carte> getCartes()
}
Class stubUser{
-List<User> lUser
- IEnumerable<Carte> CreateUsers()
+ List<Carte> getUsers()
}
Class stubManager {
.. Gestion Persistance ..
+ IEnumerable<Carte> loadCarte()
+ void saveCarte(List<Carte>)
+ IEnumerable<Pack> loadPack()
+ void savePack(List<Pack>)
+ IEnumerable<User> loadUser()
+ void saveUser(List<User)
.. Get pour chaque type d'instance ..
+ IEnumerable<Carte> getCartes()
+ IEnumerable<Commentaire> getCommentaires()
+ IEnumerable<Camp> getCamps()
+ IEnumerable<User> getUsers()
+ IEnumerable<Pack> getPack()
}
Class xmlSerializer{
.. Gestion Persistance ..
+ IEnumerable<Carte> loadCarte()
+ void saveCarte(List<Carte>)
+ IEnumerable<Pack> loadPack()
+ void savePack(List<Pack>)
+ IEnumerable<User> loadUser()
+ void saveUser(List<User)
}
Class IdataManager {
.. Gestion Persistance ..
+ IEnumerable<Carte> loadCarte()
+ void saveCarte(List<Carte>)
+ IEnumerable<Pack> loadPack()
+ void savePack(List<Pack>)
+ IEnumerable<User> loadUser()
+ void saveUser(List<User)
}
Class Manager {
- ReadOnlyObservableCollection<Carte> Cartes
- ReadOnlyObservableCollection<Pack> Packs
- ReadOnlyObservableCollection<User> User
.. Methodes Cartes ..
+ Carte addCarte(Carte c)
+ Carte removeCarte(Carte c)
+ List<Carte> getCartes(Carte c)
.. Methodes Pack ..
+ Pack addPack(Pack p)
+ Pack removePack(Pack p)
+ List<Pack> getPack(Pack p)
.. Methodes User ..
+ User addUser(User u)
+ User removePack(Pack p)
+ List<User> getUser(User u)
.. Gestion Persistance ..
+ IEnumerable<Carte> loadCarte()
+ void saveCarte(List<Carte>)
+ IEnumerable<Pack> loadPack()
+ void savePack(List<Pack>)
+ IEnumerable<User> loadUser()
+ void saveUser(List<User)
}
stubManager o-- stubCarte : -stubCarte
stubManager o-- stubPack : -stubPack
stubManager o-- stubUser: -stubUse
stubManager o-- stubCamp : -stubCamp
stubManager o-- stubCommentaire : -stubCommentaire
Manager --> Carte
Manager --> Pack
Manager --> User
Manager o-- IdataManager : iDatamanager (Injection de dépendance)
xmlSerializer ..|> IdataManager
stubManager ..|> IdataManager
hide circle
allowmixing
skinparam classAttributeIconSize 0
skinparam classBackgroundColor #ffffb9
skinparam classBorderColor #800000
skinparam classArrowColor #800000
skinparam classFontColor #black
skinparam classFontName Tahoma
@enduml
```
Les seules données pouvant être modifiées dans le modèle Master-Detail sont les _commentaires_ et les _likes_ des __packs__ et des __cartes__. Ainsi, ce sont les seules données qui sont enregistrées à chaque modification, ajout ou suppression.
Cependant, nous devons charger une premiere fois toutes les données au moins une fois pour avoir notre Mastre-Details.
# Diagramme de séquence
```plantuml
@startuml
actor User
participant "User Interface" as UI
participant Model
participant Pack
participant Carte
autonumber
User -> UI: Sélectionne une carte/pack à liker
UI -> Model: Demande de like pour la carte/pack sélectionné(e)
alt Sélection d'un pack
Model -> Pack: Vérifie si l'utilisateur a déjà liké le pack
alt Pack déjà liké par l'utilisateur
Model --> UI: Affiche un message indiquant que le pack a déjà été liké
else
autonumber 4
Model -> Pack: Ajoute le like de l'utilisateur au pack
Pack --> Model: Confirme l'ajout du like au pack
Model --> UI: Affiche un message de succès pour le like du pack
end
else Sélection d'une carte
autonumber 3
Model -> Carte: Vérifie si l'utilisateur a déjà liké la carte
alt Carte déjà likée par l'utilisateur
Model --> UI: Affiche un message indiquant que la carte a déjà été likée
else
autonumber 4
Model -> Carte: Ajoute le like de l'utilisateur à la carte
Carte --> Model: Confirme l'ajout du like à la carte
Model --> UI: Affiche un message de succès pour le like de la carte
end
end
UI -> User : Affichage d'un coeur indiquant que la carte a déjà été likée
@enduml
```
Lorsque l'utilisateur interagit est sur la page d'une carte ou d'un pack, il a la possibilité d'exprimer son appréciation en likant.
Si l'utilisateur choisit un pack, le modèle commence par vérifier si l'utilisateur l'a déjà liké. Si c'est le cas, le modèle informe l'interface utilisateur que le pack a déjà été liké. Dans le cas contraire, le modèle enregistre le like de l'utilisateur pour le pack sélectionné. Une confirmation est échangée entre le pack et le modèle afin de valider l'ajout du like, suivi de l'envoi d'un message de succès à l'interface utilisateur pour lui indiquer que le like du pack a été enregistré avec succès.
Dans le cas où l'utilisateur sélectionne une carte, le processus est similaire.
Enfin, pour offrir une visualisation de l'état du like, l'interface utilisateur affiche un symbole de cœur pour indiquer que la carte ou le pack a été liké.
# Voici un diagramme représentant l'architecture d'un projet .NET MAUI
![architecture](https://cdn.discordapp.com/attachments/1092005835112198224/1115021122514198588/Diagramme_sans_nom.drawio_1.png)
Le code sera déployé et fonctionnel sur IOS et Android. La documentation du code, quand à elle, se fait en utilisant doxygen.
Le projet en lui-même est dévelopé en utilisant l'outil Drone pour build, tester et publier le projet. Enfin, La sérialisation est réalisée en utilisant XML et enregistrée dans un fichier.xml.

@ -1,7 +1,8 @@
using Model;
using Model.Classes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Text;
@ -21,7 +22,13 @@ namespace ConsoleApp
Carte loup_garou = new Carte("Loup-Garou", "Il peut se reveiller chaque nuit pour voter avec les autres de son clan qui ils vont manger", "Il doit se faire passer pour un role du village, voter pour un de ses compagnons pour gagner la confiance peut etre un moyen", 4, "loup-garou", "Le loup-garou est un rôle très appréciable à jouer");
Carte voyante = new Carte("Voyante", "La voyante est capable de voir le role d'un joueur, et ce, chaque nuit", "Elle ne doit pas se faire découvrir, surtout en debut de partie, donner des indices subtiles sans braquer tout les soupçons des loup-garou vers vous est l'objectif", 4, "villageois", "Une carte tres interessante et difficile a la fois, ce role emmene souvent à faire des sacrifices");
Carte voyante = new("Voyante", "La voyante est capable de voir le role d'un joueur, et ce, chaque nuit", "Elle ne doit pas se faire découvrir, surtout en debut de partie, donner des indices subtiles sans braquer tout les soupçons des loup-garou vers vous est l'objectif", 4, "villageois", "Une carte tres interessante et difficile a la fois, ce role emmene souvent à faire des sacrifices");
Utilisateur Kylian = new("Kyky", "12345", null);
Carte C = new("Villageois", "Aucuns", "Doit voter inteligemment", null, "lien", "une carte peu apprécié mais necesaire");
C.commentaires.Add(new Commentaire("Cette carte est la base du jeu, cool pour les debutants", Kylian ));
Pack P = new Pack("Jeu de base", "C'est la premiere version du jeu", 5);
Console.WriteLine(P.Nom);
Console.WriteLine(C.commentaires[0]);
string relativePath = "..\\..\\..\\Persistance";
@ -35,6 +42,7 @@ namespace ConsoleApp
serializer.WriteObject(writer, villageois);
}
}
Console.ReadKey();
}
}
}

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<carte xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Model">
<carte xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Model.Classes">
<Description>La carte de base</Description>
<LienImage>villageois</LienImage>
<Nom>Villageois</Nom>

@ -1,4 +1,4 @@
using Model;
using Model.Classes;
using System.Diagnostics;
namespace MauiApp1;

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Model.Classes
{
public class Camp
{
public string Nom { get; set; }
public string Description { get; set; }
public string LienImage { get; set; }
public List<Carte> Cartes { get; set; }
public Camp(string Nom, string Description, string LienImage)
{
this.Nom = Nom;
this.Description = Description;
this.LienImage = LienImage;
Cartes = new List<Carte>();
}
}
}

@ -9,13 +9,13 @@ using System.Runtime.CompilerServices;
using System.Net.Http.Headers;
using System.Runtime.Serialization;
namespace Model
namespace Model.Classes
{
[DataContract(Name = "carte")]
public class Carte : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
void OnPropertyChanged([CallerMemberName] string ?propertyName = null)
void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
@ -32,10 +32,11 @@ namespace Model
[DataMember]
public string Description {
get => description;
set {
set
{
description = value;
OnPropertyChanged(nameof(Description));
}
}
}
private string description;
[DataMember]
@ -88,6 +89,16 @@ namespace Model
OnPropertyChanged(nameof(LienImage));
}
}
public List<Commentaire> commentaires;
public List<Commentaire> Commentaires
{
get => commentaires;
set
{
commentaires = value;
OnPropertyChanged(nameof(Commentaires));
}
}
private string lienImage;
public Carte(string nom, string pouvoir, string strategie, int? note, string lienImage, string description)
{
@ -97,19 +108,21 @@ namespace Model
this.strategie = strategie;
this.note = note;
this.lienImage = lienImage;
this.commentaires = new List<Commentaire>();
}
public override int GetHashCode()
=> Nom.GetHashCode();
public override bool Equals(object right)
public override bool Equals(object? right)
{
if (object.ReferenceEquals(right, null)) return false;
if (object.ReferenceEquals(right, this)) return true;
if (this.GetType() != right.GetType()) return false;
return this.Equals(right as Carte);
if (right is null) return false;
if (ReferenceEquals(right, this)) return true;
if (GetType() != right.GetType()) return false;
return Equals((Carte)right);
}
public bool Equals(Carte other)
{
return (this.nom == other.nom);

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Model.Classes
{
public class Commentaire
{
public string Texte { get; set; }
public Utilisateur Proprietaire { get; set; }
public Commentaire(string Texte, Utilisateur Proprietaire)
{
this.Texte = Texte;
this.Proprietaire = Proprietaire;
}
}
}

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Model.Classes
{
public interface IContenu
{
public string Nom { get; set; }
public string Description { get; set; }
public int? Note { get; set; }
}
}

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Model.Classes
{
public interface IDataManager
{
IEnumerable<Carte> GetCartes();
void SaveCarte(List<Carte> cartes);
}
}

@ -6,7 +6,7 @@ using System.Threading.Tasks;
using System.Collections.ObjectModel;
using System.Data;
namespace Model
namespace Model.Classes
{
public class Manager : IDataManager
{
@ -16,7 +16,7 @@ namespace Model
private IDataManager DataMgr { get; set; }
public Manager(IDataManager dataManager)
{
DataMgr = dataManager;
DataMgr = dataManager;
Cartes = new(cartes);
}
public bool AddCarte(Carte carte)
@ -26,7 +26,6 @@ namespace Model
if (cartes.Contains(carte)) return false;
cartes.Add(carte);
DataMgr.AddCarte(carte);
return true;
}
@ -52,9 +51,17 @@ namespace Model
int i = Cartes.IndexOf(carte);
{
cartes[i] = carte;
DataMgr.UpdateCarte(carte);
}
}
public IEnumerable<Carte> GetCartes()
{
throw new NotImplementedException();
}
public void SaveCarte(List<Carte> cartes)
{
throw new NotImplementedException();
}
}
}

@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace Model.Classes
{
public class Pack : IContenu, INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public string nom;
public string Nom
{
get => nom;
set
{
nom = value;
OnPropertyChanged(nameof(Nom));
}
}
public string description;
public string Description
{
get => description;
set
{
nom = value;
OnPropertyChanged(nameof(Description));
}
}
private int? note;
public int? Note
{
get
{
return note;
}
set
{
if (value < 0 || value > 10)
{
throw new ArgumentOutOfRangeException(nameof(value), "La valeur de la note doit être comprise entre 0 et 10.");
}
note = value;
OnPropertyChanged(nameof(Note));
}
}
public List<Commentaire> commentaires;
public List<Commentaire> Commentaires
{
get => commentaires;
set
{
commentaires = value;
OnPropertyChanged(nameof(Commentaires));
}
}
public Pack(string nom, string description, int? note)
{
this.nom = nom;
this.description = description;
this.note = note;
commentaires = new List<Commentaire>();
}
}
}

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace Model.Classes
{
public class Utilisateur : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private readonly string pseudo;
public string Pseudo => pseudo;
public string motDePasse;
public string MotDePasse => motDePasse;
public string? UrlPdp
{
get => urlPdp;
set
{
urlPdp = value;
OnPropertyChanged(nameof(UrlPdp));
}
}
private string? urlPdp;
public Utilisateur(string pseudo, string motDePasse, string? urlPdp = null)
{
this.pseudo = pseudo;
this.motDePasse = motDePasse;
this.urlPdp = urlPdp;
}
}
}

@ -1,18 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Model
{
public interface IDataManager
{
ReadOnlyObservableCollection<Carte> Cartes { get; }
bool AddCarte(Carte carte);
bool RemoveCarte(Carte carte);
List<Carte> GetAllCartes();
void UpdateCarte(Carte carte);
}
}

@ -0,0 +1,31 @@
using Model.Classes;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Model.Stub
{
public class StubCarte
{
public ReadOnlyObservableCollection<Carte> LCarte { get; }
static IEnumerable<Carte> CreateCartes()
{
List<Carte> cartes = new()
{
new Carte("Villageois", "Le villageois á pour seul pouvoir le vote", "Comme vous n'avez pas de pouvoir, vous devriez vous concentrer sur les autres joueurs pour récupérer des informations", 2, "villageois", "Ses seules armes sont la capacité danalyse des comportements pour identifier les Loups-Garous, et la force de conviction pour empêcher lexécution de linnocent quil est."),
new Carte("Loup-Garou", "Le loup garou se reveille la nuit avec ses confrères pour choisir une personne à dévorer", "Assurez vous de en pas vous faire suspecter par les autres membres du village, pour se faire, évitez de défendre les autres loups garous, ceux qui l'accuse ont surement de bonnes raison de penser qu'il est un Loup. Immiscer un vote sur un Loup Garou peut vous innocenter aux yeux du village.", 4, "loup-garou", "Le loup Garou est un carte interessante à jouer"),
new Carte("Voyante", "La voyante se reveille la nuit pour regarder le role d'un membre du village", "Trouver les loup garou et conduire le village à voter pour leur expultion et votre objectif, tout en essayant de sauver les innocents, attention, une approche trop directe vous brulerez les ailes, les loup garou essayerons toujours de tuer la voyante dans les premier, soyez subtil", 3, "voyante", "La voyante est un rôle très puissant du village.")
};
return cartes;
}
public StubCarte()
{
LCarte = (ReadOnlyObservableCollection<Carte>)CreateCartes();
}
}
}

@ -0,0 +1,36 @@
using Model.Classes;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace Model.Stub
{
public class StubManager : IDataManager
{
public StubCarte StubCarte;
public StubManager()
{
StubCarte = new StubCarte();
}
public IEnumerable<Carte> GetCartes()
{
return StubCarte.LCarte;
}
public void SaveCarte(List<Carte> cartes)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<Carte>));
using (TextWriter writer = new StreamWriter("cartes.xml"))
{
serializer.Serialize(writer, cartes);
}
}
}
}

@ -1,87 +1,42 @@
<Window x:Class="MonApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Ma fenêtre" Height="450" Width="800">
<Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Orientation="Horizontal">
<ItemsControl ItemsSource="{Binding ImageData}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Command="{Binding DataContext.ImageSelectedCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}">
<Image Source="{Binding ImagePath}" Width="100" Height="100" Margin="10"/>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding ImageData}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="10">
<TextBlock Text="{Binding ImageName}" FontWeight="Bold"/>
<TextBlock Text="{Binding ImageDescription}" TextWrapping="Wrap"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</ScrollViewer>
</Grid>
</Window>
<Window x:Class="MonApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Ma fenêtre" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<!-- Ligne pour les boutons -->
<RowDefinition Height="*"/>
<!-- Ligne pour le contenu scrollable -->
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal">
<!-- Ajoutez ici vos boutons -->
<Button Content="Bouton 1" Width="100" Margin="10"/>
<Button Content="Bouton 2" Width="100" Margin="10"/>
<Button Content="Bouton 3" Width="100" Margin="10"/>
</StackPanel>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<!-- Ajoutez ici votre contenu scrollable -->
<StackPanel>
<TextBlock Text="Contenu Scrollable" Margin="10"/>
<TextBlock Text="Ligne 1" Margin="10"/>
<TextBlock Text="Ligne 2" Margin="10"/>
<TextBlock Text="Ligne 3" Margin="10"/>
<!-- Autres éléments -->
</StackPanel>
</ScrollViewer>
</Grid>
</Window>
<Window x:Class="MonApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Ma fenêtre" Height="450" Width="800">
<Grid Background="LightBlue">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<!-- Ligne pour le texte -->
<RowDefinition Height="Auto"/>
<!-- Ligne pour la zone carrée -->
</Grid.RowDefinitions>
<!-- Zone de texte -->
<TextBox Grid.Row="0" Background="White" Margin="10" Padding="5" />
<!-- Zone carrée avec des bords arrondis -->
<Border Grid.Row="1" Background="LightCoral" Margin="10" Padding="20" CornerRadius="10" />
</Grid>
</Window>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp1.NewPage1"
Title="NewPage1">
<Grid Background="Bisque">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<!-- Ligne pour le titre -->
<RowDefinition Height="*"/>
<!-- Ligne pour le contenu défilable -->
</Grid.RowDefinitions>
<VerticalStackLayout>
<Label
Text="Bienvenue sur l'app Loup-Garou"
VerticalOptions="Center"
HorizontalOptions="Center"/>
<!-- Titre -->
<Label Text="Home" FontSize="20" HorizontalTextAlignment="Center" VerticalTextAlignment="Center"/>
<!-- Contenu défilable -->
<ScrollView Grid.Row="1">
<StackLayout Orientation="Vertical">
<StackLayout>
<Image Source="oip.jpg" WidthRequest="100" HeightRequest="100"/>
<Label Text="Description de l'image 1" FontSize="16"/>
</StackLayout>
<StackLayout>
<Image Source="ppp.jpg" WidthRequest="100" HeightRequest="100"/>
<Label Text="Description de l'image 2" FontSize="16"/>
</StackLayout>
<StackLayout>
<Image Source="tele.jpg" WidthRequest="100" HeightRequest="100"/>
<Label Text="Description de l'image 3" FontSize="16"/>
</StackLayout>
</StackLayout>
</ScrollView>
</VerticalStackLayout>
</Grid>
</ContentPage>
Loading…
Cancel
Save