Aller au contenu

Zappy — Présentation

Zappy est un projet réseau d'Epitech : un jeu de plateau multijoueur en temps réel se déroulant sur une carte de tuiles. Plusieurs équipes y font évoluer leurs joueurs en collectant des ressources et en réalisant des rituels d'élévation, jusqu'à atteindre le niveau maximal.

L'objectif du jeu

Chaque équipe contrôle un ensemble de joueurs (les « drones ») disséminés sur une carte torique (un monde sans bord : sortir par la droite réapparaît à gauche, par le haut réapparaît en bas). Le but est de faire monter ses joueurs du niveau 1 au niveau 8 grâce à des incantations (rituels d'élévation) qui consomment des ressources et exigent un certain nombre de joueurs réunis sur une même tuile.

Condition de victoire

La première équipe à posséder 6 joueurs de niveau 8 remporte la partie. Le serveur diffuse alors l'événement de fin de partie (seg <équipe>) et s'arrête une fois les derniers messages transmis.

Pour survivre, chaque joueur doit régulièrement consommer de la nourriture (food) : son inventaire démarre avec 10 unités de nourriture, et il meurt s'il tombe à court. Les élévations supérieures réclament les six pierres du jeu : linemate, deraumere, sibur, mendiane, phiras et thystame.

Les trois composants

Zappy est constitué de trois programmes distincts qui communiquent par un protocole texte sur TCP. Le serveur est autoritaire : il détient l'état réel du monde, applique les règles et arbitre toutes les actions. L'IA et le GUI ne sont que des clients TCP qui se connectent à lui.

Composant Binaire Langage Rôle
Serveur zappy_server C++17 Autorité du jeu : monde, règles, temps, sockets
IA zappy_ai Python 3.11+ Un client par joueur ; décide des actions à envoyer
GUI zappy_gui C++17 + Raylib Visualisation 3D temps réel de la partie

Le serveur est la seule source de vérité

Les clients n'imposent jamais l'état du monde. Une IA peut anticiper localement le résultat d'une action (pour décider plus vite), mais c'est toujours la réponse du serveur qui fait foi. Le GUI, lui, est purement passif : il n'envoie que la commande GRAPHIC au démarrage puis se contente d'afficher les événements reçus.

Architecture globale

graph TB
    subgraph Clients
        AI1["zappy_ai<br/>(équipe A, joueur 1)"]
        AI2["zappy_ai<br/>(équipe A, joueur 2)"]
        AI3["zappy_ai<br/>(équipe B, joueur 1)"]
        GUI["zappy_gui<br/>(spectateur)"]
    end

    SERVER["zappy_server<br/>(autorité du jeu)"]

    AI1 -- "protocole texte / TCP" --> SERVER
    AI2 -- "protocole texte / TCP" --> SERVER
    AI3 -- "protocole texte / TCP" --> SERVER
    GUI -- "GRAPHIC + événements / TCP" --> SERVER

    SERVER --- WORLD["Monde torique<br/>(tuiles, ressources, œufs)"]

Le serveur gère toutes les connexions via un unique appel poll() (entrées/sorties non bloquantes) et un ordonnanceur d'événements : chaque commande d'IA a un délai exprimé en unités de temps avant de produire son effet. La cadence du jeu est réglée par l'option -f (fréquence) : une unité de temps dure 1000 / f millisecondes — plus f est grand, plus le jeu est rapide.

Cycle de vie d'une partie

sequenceDiagram
    participant AI as zappy_ai
    participant S as zappy_server
    participant G as zappy_gui

    G->>S: GRAPHIC
    S->>G: msz, sgt, tna, mct, pnw/plv/pin, enw (état initial)
    AI->>S: (connexion TCP)
    S->>AI: WELCOME
    AI->>S: <nom-équipe>
    S->>AI: <slots restants>
    S->>AI: <X> <Y>
    loop Boucle de jeu
        AI->>S: commande (Forward, Look, Incantation, ...)
        S->>AI: réponse (après délai)
        S->>G: événements (ppo, pic, pie, bct, ...)
    end
    S->>G: seg <équipe> (fin de partie)

Comment lire cette documentation

Cette documentation est organisée par composant et par thème :

  • Démarrage rapide — installer puis lancer l'ensemble (serveur, GUI, IA) en quelques commandes.
  • Serveur (C++) — l'autorité du jeu : réseau, boucle de temps, monde, mécaniques, commandes et délais.
  • IA (Python) — le client décisionnel : réseau, protocole, état interne, machine à états (FSM) et coordination d'équipe.
  • GUI (Raylib) — le visualiseur 3D : installation de Raylib, build et rendu.
  • Protocole de communication — la référence des messages échangés (handshake, IA ↔ serveur, GUI ↔ serveur).
  • Glossaire — toutes les définitions des termes du jeu.

Nouveau sur le projet ?

Commencez par le Glossaire pour acquérir le vocabulaire, puis suivez le Démarrage rapide pour avoir une partie qui tourne en local.

Limitations connues

Certains comportements présentent des écarts ou des bugs documentés. Ils sont regroupés sur la page Limitations connues.