---
# System prepended metadata

title: Protocole de communication Snecc

---

# 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. 
