Skip to main content

Six Degrees of Kevin Bacon

Six Degrees — Analyse & Prototype

Ce document présente l’analyse, le design, le modèle de données et un prototype minimal (backend + frontend) pour un jeu en ligne inspiré du principe des Six Degrees of Kevin Bacon.


Jeu

📊web Sourceinspiré du concept des six degrés de données

séparation (variante "Six Degrees of Kevin Bacon"). Le but : relier deux acteurs entre eux en passant par des films qu'ils ont tournés en commun, en un minimum d'étapes.

  • TMDB (The Movie Database)Dépôt
      :
    • API gratuite avec cléhttps://git.hugo-pierret.be/Hugyouu/six-degrees
    • ExcellenteApp couverture
    • :
    • Simple à utiliser
    • Extraction d’un sous-ensemble (personnes + films/séries) stocké en local pour éviter les limites de requêtes
    https://six-degrees.hugo-pierret.be

💾 StockageFonctionnalités

  • PostgreSQLDéfi +quotidien Apache AGEune paire d'acteurs par jour, commune à tous les joueurs
  • Mode infini — parties en solo avec des paires aléatoires
  • Multijoueur temps réel — lobbys via WebSocket (SignalR)
  • Calendrier — historique des défis quotidiens passés
  • Visualisation graphe — représentation interactive acteur → film → acteur (D3.js)

⚙️Stack Backendtechnique

  • Node.js
    • Mise
    • en place rapide
    • Endpoints REST simples pour recherche et calcul de chemin

    • 🎨 Frontend

      • React + Vite
        • Léger et moderne
        • WebSocket pour mode temps réel (co-op, challenge)

      📐 Modèle

      Noeuds

      popularity}
    • Title
    • {id,year,type}

      Arêtes

        Title)
      • CREWED
      • Title)
        CoucheTechnologie
        BackendASP.NET Core 8.0 (Express)C#)
        Base de données PostgreSQL
          +
        • PersonEntity {id,Framework name,Core type,8.0
        Temps name,réel SignalR
        Frontend React
      • ACTED_IN18 + Vite
      • StylesTailwind CSS + Material Tailwind
        Graphereact-force-graph-2d (PersonD3.js)
        API (Personexterne TMDB
        DéploiementDocker + Docker Compose

        🔎 AlgorithmesArchitecture

          six-degrees/
          
        • ├── backend/ │ ├── SixDegrees.Api/ # Contrôleurs, hubs SignalR, config │ ├── SixDegrees.Domain/ # Logique métier, services, entités │ └── SixDegrees.Infrastructure/ # Accès données, migrations EF Core ├── frontend/ │ └── src/ │ ├── pages/ # Vues (Home, DailyChallenge, Lobby…) │ ├── components/ # Composants réutilisables │ └── hooks/ # Hooks custom (SignalR, username…) ├── docker-compose.yml └── .env.example
        • Algorithme

          Bidirectional BFS pour trouver le chemin le plus court (rapideentre etdeux efficace)

        • Cache mémoireacteurs (simple Map en Node.js) pour stocker les résultats récents
        • Profondeurprofondeur max = 12 (équivalent à 6 degrés)
        • .


        🎮 Modes

        Modèle de jeu

        données

        Stocké en PostgreSQL via Entity Framework Core :

        • ClassicPerson :{ trouverid, lename, cheminpopularity le} plus court entre deux acteurs/célébrités
        • Challenge TempsTitle :{ limiteid, dename, 2year, minutestype pour} trouver unfilms cheminet séries
        • Co-opRelation :Person 2 àTitle 4 joueurs construisent le chemin ensemble via WebSocket(ACTED_IN)

        Données importées depuis l'API TMDB.


        🏆Lancer le projet

        Prérequis

        • Docker et Docker Compose
        • Clés API TMDB (compte gratuit sur themoviedb.org)

        Démarrage rapide

        cp .env.example .env
        # Remplir TMDB_API_KEY, TMDB_ACCESS_TOKEN, etc.
        docker compose up --build
        

        Application disponible sur http://localhost (ou APP_PORT).

        Variables d'environnement

        VariableDescription
        TMDB_API_KEYClé API TMDB (requise)
        TMDB_ACCESS_TOKENToken d'accès TMDB (requis)
        DB_CONNECTION_STRINGChaîne de connexion PostgreSQL
        APP_PORTPort exposé pour le frontend (défaut : 80)

        Développement local

        Backend

        cd backend
        dotnet restore
        dotnet run --project SixDegrees.Api/
        # API sur http://localhost:8080
        # Swagger : http://localhost:8080/swagger
        

        Frontend

        cd frontend
        npm install
        npm run dev
        # Dev server sur http://localhost:5173
        

        CI/CD

        Workflow Gitea (.gitea/workflows/deploy.yaml) déclenché automatiquement sur chaque tag v*.*.* — rebuild et redéploiement via Docker Compose.

        git tag v1.0.0
        git push --tags
        

        Notes de conception initiale

        Lors de la phase de prototype, plusieurs choix ont été évalués :

        CritèreOption retenueAlternatives envisagées
        BDD graphePostgreSQL + EF CoreApache AGE (extension PG), Neo4j
        BackendASP.NET Core (C#)Node.js / Express
        Algo cheminBidirectional BFSBFS simple, Dijkstra
        Source donnéesTMDBWikidata, IMDb

        Scoring

         (mode challenge)
        • Base points =: (6 - degrees)degrés) × 100 points
        • Bonus temps : +50 pointspts si trouvé en moins de d'1 minute
        • Bonus rareté : +50 pointspts si le chemin inclut un titre peu populaire (< seuil TMDB popularity)

        🌐 API

        • GET /api/people?q=search → recherche personnes
        • GET /api/title?q=search → recherche films/séries
        • POST /api/path → calcule chemin { fromPersonId, toPersonId }
          • Retourne : chemin (liste de nodes/edges), longueur, score calculé

        🏗️ Architecture finale

        • Data ingestion : script Node.js qui appelle TMDB et insère dans Neo4j
        • Backend : Express + Neo4j-driver + cache mémoire
        • Frontend : React + Vite + WebSocket
        • Auth : simple login par pseudo (pas besoin d’OAuth pour usage privé)
        • Analytics : log en mémoire des chemins joués (top 10 affichés en frontend)

        🚀 Prototype minimal (MVP)

        • Script d’ingestion TMDB → PostgreSQL
        • Backend Express avec 3 endpoints
        • Frontend React avec :
          • Formulaire pour choisir deux personnes
          • Affichage du chemin (liste ou graphe visuel avec vis.js ou d3.js)
          • Timer pour mode Challenge Temps
          • WebSocket pour mode Co-op