CAW1 2019 Projet de Célia COUILLER et Louis KLEIN

De Ensiwiki
Aller à : navigation, rechercher
Project schedule.png
Titre du projet Moon Cat
Cadre Projet web (alternants 2a)
Page principale Test

Encadrants Sébastien Viardot


Objectif

Créer un système de salle de discussion permettant de jouer à un jeu inspiré des Loups Garous de Thiercelieux à la manière de Loups Garous en ligne.

Réalisation

Le rendu final comporte

- un chat sur lesquels des utilisateurs peuvent communiquer.

- une traduction automatique permet a des joueurs anglais et français de jouer ensemble.

- le modèle de jeu présent est simplifié au maximum, ne gardant que les deux rôles principaux du loup garou, le loup garou (chacal) et les villageois (chat).

Limitations

- Le jeu n'est malheureusement pas tout à fait fonctionnel. Il est toutefois possibles de créer un compte, se connecter, et chatter avec d'autres personnes.

- Le rendu final tourne encore sur le serveur de développement de Django. Ce n'est pas idéal, il faudrait un serveur plus robuste de type Nginx. Néanmoins, avec l'utilisation de websockets de façon asynchrone, cela induit l'utilisation de deux interfaces de passerelles , un pour les requêtes classiques, synchrones (GET, POST, etc.), avec par exemple l'application gunicorn, et une interface pour les requêtes asynchrones des websockets, comme daphne.

Choix de Conception

TourDeJeuV0.jpg

   #entrée dans le salon de discussion
   #lancer une partie
   #Attribution des rôles
   # Afficher "Début de la partie.
               Bienvenue à vous, chats habitants d'Ock.
               Prenez garde, parmis vous se dissimule une bande de Chacals ! 
               Eliminez les pour survivre, avant qu'ils ne vous Chassassine dans votre sommeil."
   # Tant qu'il n'y a pas de vainqueur : 
       #Afficher "Début du vote dans 20s"
       #Attendre 20s
       #Lancer vote
           #Afficher "Début du vote"
           ...
           #Appliquer résultat du vote
               #Afficher le nom du voté : "Le village à décidé d'exclure $nom"
               #On ajoute le joueur à la liste des exclus
       #Si il n'y a pas de vainqueur
           #Afficher "Les chats d'Ock s'endorment, mais les chacals restent"
           #Uniquement pour les chacals   
               #Afficher "Début du vote dans 20s"
               #Attendre 20s
               #Lancer vote de nuit
                   #Afficher "Début du vote"
                   ...
                   #Appliquer résultat du vote
                       #Afficher le nom du voté : "Vous avez décidé d'exclure $nom"
                       #On ajoute le joueur à la liste des exclus
           #Afficher le nom du voté : "Au réveil, vous constatez la perte de $nom"
   # Afficher le vainqueur

A partir de ce script, on obtient le diagramme d'état suivant : StateDiagramV1.png


Rôles

Chacal

Tente d'éliminer tous les chats. Se réunissent durant la nuit pour choisir leur prochaine victime. Le jour, se dissimule parmi les chats.

Chat

Tente d'éliminer tous les chacals parmi eux. Se réunissent dans la journée pour exclure l'un des leurs.

Choix Techniques

Framework : le framework Django a été choisi pour des raisons de simplicité. Nous ne sommes pas forcément les plus à l'aise avec les technologies web, on a donc privilégié un langage de programmation simple et peu verbeux, que nous avions tous les deux déjà utilisé. Afin de créer le chat, le module django channels à été choisi. Il permet de créer sans trop de difficultés des websockets et de faire du code asynchrone.

Base de Données : Redis pour le chat car cette base s'intègre facilement avec channels. SQLite pour le reste, car l'on stocke assez peu de données en base, et SQLite est suffisant pour nos besoins.

CDN : Bootstrap a été utilisé pour simplifier l'intégration CSS, et fournir une base de design adaptatif pour petits écrans.

Itérations

1) Le premier objectif est de créer un chat, auquel des utilisateurs peuvent accéder et sur lequel ils peuvent s'échanger des messages.

2) Ensuite, on ajoute la notion de rôle.

a)Les "joueurs" qui se connecte au chat se voit attribuer un rôle : Chat ou Chacal.

3) C'est la marche la plus importante, introduire le le déroulement d'une partie. Deux période se succèdent : le jour et la nuit. A chaque phase les joueurs doivent pouvoir voter pour éliminer l'un d'entre eux.

4) Seuls les Chacals peuvent voir des messages et voter durant la nuit


DiagrammeClasse1.jpg

Integration d'API externe : Traduction automatique

Concept

L'idée est de traduire automatiquement les messages des joueurs pour que des gens parlant différentes langues puissent communiquer ensemble. Pour l'instant, une démonstration de faisabilité a été faite, supportant les deux langues suivantes :

- Français

- Anglais

Mais des langues supplémentaires pourraient être rajoutées sans difficulté.

Au moment de l'inscription l'utilisateur choisit sa langue préférée, soit anglais, soit français. Tous les messages qu'il recevra seront traduit dans cette langue. L'illustration ci dessous donne une idée du résultat :

Chat translation.png

Inclusion Technique

Deux API ont été considérées : DeepL et Google Translate API. Cependant, DeepL ne propose pas d'essai gratuits. Pour des raisons de coût, l'API de Google Translate a été privilégiée.

Cette dernière propose une bibliothèque python, ce qui a considérablement facilité son inclusion : inutile de faire des requêtes sur une API rest (avaec la blioth`ue requests, par exemple), il suffit juste d'installer la bibliothèque google-cloud-translate. Une fois cette dernuère installée, on peu instancier un objet de type Client, qui se charge de faire les requêtes à l'API. Le code est donc réduit, puisqu'il s'agit seulement de :

from google.cloud import translate
client = translate.Client()
msg = client.translate("Your message", source='en', dest='fr')
print(msg) # affiche "Votre message"

Conclusion

Ressources

https://channels.readthedocs.io/en/latest/tutorial/part_2.html https://getbootstrap.com/docs/4.3/ https://docs.djangoproject.com/en/2.2/intro/

http://www.ecolebizu.org/chasse-aux-mots/cha-jeu-de-mot.html