Domino est un jeu de dominos multijoueur développé avec Godot pour le front et Django REST Framework (DRF) pour l'API.
Ce projet permet aux joueurs de s'affronter en ligne avec un système de sessions.
- Backend (API) : Python, Django, Django REST Framework (DRF)
- Frontend (Jeu) : Godot Engine (Version 4.3)
- Base de données : PostgreSQL (hébergée sur Neon) et Redis (hébergée sur Northflank)
- Déploiement API : Northflank avec Docker
- Worker Celery : Déployé sur Northflank avec Docker
- WebSockets : Communication en temps réel entre les joueurs
- Celery : Gestion des tâches programmées
- Exécutable Godot : Le jeu peut être utilisé directement via un exécutable généré
📌 Prérequis : Python 3.12, pip, virtualenv
cd api
python -m venv venv
source venv/bin/activate # (ou venv\Scripts\activate sous Windows)
pip install -r requirements.txt📌 Fichier .env à configurer :
SECRET_KEY=''
DEBUG=False
DATABASE_URL=''
REDIS_URL=''
EXTERNAL_HOSTNAME=''📌 Migrations de la base de données :
python manage.py migrate📌 Lancer le serveur Django :
python manage.py runserver
celery -A API_Domino worker --log-level=info L'API est accessible sur http://127.0.0.1:8000/
📌 Prérequis : Godot Engine 4.3
Installer Godot 4.3 et importer le dossier Godot_front
Le projet s’ouvre directement, prêt à être lancé en mode debug. Pour utiliser en mode débug il faudra mettre en place tout l'environnement (Serveur Django, BDD PostgreSQL, BD Redis et le worker Celery)
La version exécutable et le projet godot utilisent l'api déployée sur Northflank.
Notez que le front n'est pas terminé, il n'implémente pas tout ce que l'api peut offrir. L'API elle est pleinement fonctionnelle
POST /signup→ Inscription d’un nouvel utilisateur- Champs :
pseudo(string, requis) → Pseudo unique (UTF-8)mdp(string, requis) → Mot de passe (8-20 caractères)image(string, optionnel) → Avatar encodé en Base64
- Champs :
POST /login→ Connexion à un compte existant- Champs :
pseudo(string, requis) → Identifiant du joueurmdp(string, requis) → Mot de passe du compte
- Champs :
POST /access→ Rafraîchissement du token JWT- Champs :
refresh_token(string, requis) → Token de rafraîchissement valide
- Champs :
GET /stats→ Récupère les stats du joueur (🔒Token requis)
POST /create→ Créer une session de jeu- Champs :
session_name(string, optionnel) → Nom de la sessionmax_players_count(int, optionnel) → Nombre de joueurs max (2-4)reflexion_time(int, optionnel) → Temps de réflexion (20-100 sec)definitive_leave(bool, optionnel) → Autoriser les départs définitifsis_public(bool, optionnel) → Session publique ou privée
- Champs :
GET /sessions→ Lister les sessions publiques disponiblesGET /join→ Rejoindre une session existante- Champs :
code(string, requis) → Code unique de la session
- Champs :
POST /update→ Modifier les paramètres d’une session- Champs :
session_name(string, optionnel) → Nouveau nom de sessionmax_players_count(int, optionnel) → Nombre max de joueursreflexion_time(int, optionnel) → Temps de réflexion mis à jourdefinitive_leave(bool, optionnel) → Autoriser les départs définitifsis_public(bool, optionnel) → Rendre la session publique ou privéeorder(string, optionnel) → Nouvel ordre de jeu [pseudo, pseudo, …]hote(int, optionnel) → Nouvel hôte de la session (son pseudo)
- Champs :
GET /kill→ Quitter et supprimer une session- Champs :
session_id(string, requis) → Identifiant de la session
- Champs :
GET /start→ Démarrer une partie- Champs :
session_id(int, requis) → Identifiant de la session
- Champs :
POST /play→ Jouer un domino- Champs :
session_id(int, requis) → Identifiant de la sessionround_id(int, requis) → Identifiant du round en coursdomino_id(int, requis) → Identifiant du domino jouéside(string, requis) → Côté où le domino est joué ("left"ou"right")
- Champs :
GET /dominos→ Récupérer la liste des dominos en jeu
L’API Domino utilise WebSockets pour assurer la communication en temps réel entre les joueurs. Cette connexion est utilisée pour la gestion des sessions, des parties et des interactions en direct.
ws://<EXTERNAL_HOSTNAME>/ws/session/?session_id=<SESSION_ID>&token=<ACCESS_TOKEN>
<EXTERNAL_HOSTNAME>: URL du serveur.<SESSION_ID>: Identifiant unique de la session en cours.<ACCESS_TOKEN>: Token JWT valide pour l’authentification.
Si le token ou l'id de session est absent ou invalide, la connexion est refusée. La connexion également sera refusée si le token correspond à un joueur qui ne fait pas partie de la session [mentionnée avec session_id]
Tous les messages WebSocket respectent le format suivant :
{
"action": "string",
"data": { ... } | null
}
action: Nom de l’action exécutée.data: Objet contenant les informations associées (ounullsi aucune donnée).
Le serveur envoie les messages suivants à tous les joueurs connectés à la session :
| Action | Description |
|---|---|
session.player_join |
Un joueur a rejoint la session |
session.player_leave |
Un joueur a quitté la session |
session.hote_leave |
L’hôte a quitté, la session est fermée |
session.player_statut |
Statut d’un joueur mis à jour |
session.start_game |
Début d’une partie |
session.end_game |
Fin de la session |
game.someone_mix_the_dominoes |
Un joueur a mélangé les dominos |
game.new_round |
Nouveau round démarré |
game.someone_played |
Un joueur a joué un domino |
game.someone_pass |
Un joueur a passé son tour |
game.someone_win |
Un joueur a gagné la partie |
game.blocked |
La partie est bloquée, tous les joueurs sont boudés |
chat_message |
Un message publique envoyé par un autre joueur de la session |
Le serveur envoie certains messages uniquement au joueur concerné :
| Action | Description |
|---|---|
game.your_turn |
C'est le tour du joueur, contient également les dominos jouables |
game.your_turn_no_match |
C'est le tour du joueur, mais aucun domino jouable |
chat_message |
Un message privé envoyé par un autre joueur de la session |
Le client peut envoyer les messages suivants au serveur :
| Action | Description |
|---|---|
game.pass |
Passer son tour [round_id=int] |
session.player_statut |
Modifier son statut (prêt ou non) [statut_id : 6,7] (6=not_ready, 7=ready) |
game.mix_the_dominoes |
Mélanger les dominos [data : null] |
session.chat_message |
Le joueur envoie un message à 1 ou tout les joueurs de la session [channel : "global" ou "pseudo", message: "text"] |
- Inscription et connexion des joueurs.
- Créer une session avec :
- Nom de session
- Temps de réflexion configurable
- Option de reconnexion à une partie quittée ou non
- Choix de 2, 3 ou 4 joueurs max
- Session publique ou privée
- Rejoindre une session
- privée en saisissant un code (si aucune partie n’a encore commencé).
- publique depuis le menu qui affiche toutes les sessions disponibles.
- Lancer une partie depuis le lobby (hôte uniquement).
- Gestion des départs :
- Hôte quitte → Session supprimée entièrement.
- Quitter en cours de partie → Statut Hors Ligne → Auto Play activé.
- Reconnexion possible si "Quitter définitivement" n’est pas coché.
- Statuts de Joueurs
- AFK (30s d'inactivité) → Statut AFK
- Inactivité sur plusieurs tours → Statut Hors ligne → Auto Play activé.
- Une session peut avoir X parties.
- Une partie est gagnée en remportant 3 manches.
- Suivi des statistiques par session :
- Nombre de parties gagnées par joueur.
- Nombre de "cochons" (joueurs ayant gagné 0 manches durant une partie).
- Distribution de 7 dominos par joueur.
- Premier joueur :
- À 4 joueurs → Celui qui a le double 6 commence.
- À 2 ou 3 joueurs → Celui qui a le plus grand domino commence.
- Si temps de réflexion écoulé → Un domino valide est joué au hasard par le serveur. (désactivé)
- Boudé :
- Affichage du message "Vous êtes boudé", délai de 3 à 5s avant de passer son tour. (délai désactivé)
- Seuls les dominos jouables sur la table peuvent être posés.
- Possibilité de jouer un domino à droite ou à gauche.
- Un joueur pose son dernier domino → Victoire immédiate.
- Le jeu est "mort" (tout le monde boudé) → Décompte des points de chaque main.
- Le joueur ayant le moins de points gagne la manche.
- Un joueur remporte 3 manches → Victoire de la partie.
- Si un joueur n’a gagné aucune manche durant cette partie → il obtient un cochon (Il est COCHON!).
- Retour au lobby avec possibilité de relancer une partie.
- Documentation API : [En cours de réalisation]
🎲 Projet réalisé en MASTER MIAGE 2ème Année
📅 Dates : 1 Décembre 2024 → 4 mars 2025
👤 Développeurs :
- Bastien SINITAMBIRIVOUTIN
- Nicolas BARBEU
- Julio GERMADE
- Obed HALIAR