# Protocole de communication Snecc ## Introduction L'application Snake est en client-serveur. Le serveur gère les mécanismes de jeu et envoie les informations relatives à l'état du jeu aux clients. En outre les clients envoie les entrées faites par le joueur. ## Format classique des messages | Type de message | Longueur du message | Données | | -------- | -------- | -------- | | 1 octet | 2 octets | n octets | Les données sont codées sur différents octets en _little endian_. ## Les types de messages ### Player_id | Type de message | Longueur du message | Données | | -------- | -------- | -------- | | 0 | 1 | id (1 octet) | Ce message fournit au client son ID. ### Game_params | Type de message | Longueur du message | Données | | -------- | -------- | -------- | | 1 | $$8 \times n_{\text{joueurs}} + 6 $$ | n octets | Ce sont les paramètres initiaux du jeu. #### Détails sur les données | Index (octets) | Taille (octets) | Contenu | | -------- | -------- | -------- | | 0 | 2 | Taille de la map en blocs | | 2 | 2 | Taille d'un bloc en pixels | | 4 | 1 | Vitesse initiale (pas utilisé lol) | | 5 | 1 | Nombre de joueurs | | 6 | $$8 \times n_{\text{joueurs}}$$ | Concaténation des paramètres de chaque joueur | #### Paramètres joueurs | Index (octets) | Taille (octets) | Contenu | | -------- | -------- | -------- | | 0 | 1 | Identifiant du joueur | | 1 | 3 | Couleur RGB du serpent | | 4 | 2 | Position initiale x0 | | 6 | 2 | Position initiale y0 | ### Frame | Type de message | Longueur du message | Données | | -------- | -------- | -------- | | 3 | $$2 + 5 \times n_{\text{nourriture}} + \sum_{i=1}^{n_{\text{joueurs}}} (4 + 4 \times n^i_{noeuds})$$ | Nourritures puis Serpents | Ce message contient un état complet du jeu. Cela permet aux clients d'êtres synchronisés. #### Détails sur les données | Index (octets) | Taille (octets) | Contenu | | -------- | -------- | -------- | | 0 | $1$ | Nombre de nourritures | | 1 | $5*n_{nourriture}$ | Types et position de chaque nourritures | | $$1 + 5*n_{nourriture}$$ | $1$ | Nombre de serpents | | $$2 + 5*n_{nourriture}$$ | $$\sum_{i=1}^{n_{\text{joueurs}}} (4 + 4 \times n^i_{noeuds})$$ | Etats et positions de chaque serpents | #### Types et positions des nourritures | Index (octets) | Taille (octets) | Contenu | | -------- | -------- | -------- | | 0 | 1 | Type de nourriture | | 1 | 2 | Position x | | 3 | 2 | Position y | #### Etat et position d'un serpent | Index (octets) | Taille (octets) | Contenu | | -------- | -------- | -------- | | 0 | 1 | ID du serpent | | 1 | 1 | 1 si le serpent est mort, 0 sinon | | 2 | 1 | Quantité de nourriture dans l'estomac du serpent (allongement à venir) | | 3 | 1 | Longueur en noeuds du serpent | | 4 | $$4 * n_{noeuds}$$ | Positions des noeuds des serpents | #### Noeud d'un serpent | Index (octets) | Taille (octets) | Contenu | | -------- | -------- | -------- | | 0 | 2 | Position x | | 2 | 2 | Position y | ### Move | Type de message | Longeur du message | Données | | -------- | -------- | -------- | | 4 | 1 | move_byte | ```rust let move_byte: u8 = match player_move { Move::Up => 1, Move::Down => 2, Move::Left => 3, Move::Right => 4, }; ``` C'est le seul message envoyé du client au serveur. Il code l'entrée clavier du joueur.