public void StartGame()
        {
            logic = new GameLogic();

            gameData = new GameData(16);
            gameData.Snakes.Add(new Snake(new Point((int)(gameData.GridSize * 0.25), (int)(gameData.GridSize * 0.75)),
                                          Snake.Directions.Right, Color.ForestGreen, 1));
            gameData.Snakes.Add(new Snake(new Point((int)(gameData.GridSize * 0.75), (int)(gameData.GridSize * 0.25)),
                                          Snake.Directions.Left, Color.DeepSkyBlue, 2));
            logic.AddApples(gameData, amountOfApples);

            foreach (ClientHandler client in clients)
            {
                client.Write(TcpProtocol.IdSend(gameData, client.Id));
            }

            ReadAll(false);

            // Start timer that calls a game tick update
            timer          = new Timer();
            timer.Elapsed += OnTimedEvent;
            timer.Interval = 1000.0 / fps;

            RunGameOneTick();
            // Wait 3 seconds
            Thread.Sleep(3000);

            timer.Start();
        }
        public void RunGameOneTick()
        {
            isRunning = true;

            // Ask all clients for their snakes' direction
            Broadcast(TcpProtocol.TickSend());

            // Read all client directions
            ReadAll(true);

            // Check if a client has been disconnected
            CheckIfDisconnected();

            // Logique
            // For each snake check if next move it eats an apple and then update the snake
            foreach (Snake snake in GetAliveSnakes())
            {
                bool hasEaten = false;
                for (int i = gameData.Apples.Count - 1; i >= 0; i--)
                {
                    if (logic.EatsAnApple(snake, gameData.Apples[i]))
                    {
                        gameData.Apples.Remove(gameData.Apples[i]);
                        hasEaten = true;
                        break;
                    }
                }
                snake.UpdateBody(hasEaten);
            }

            // For each snake check if it's dead
            foreach (Snake snake in GetAliveSnakes())
            {
                if (logic.CheckForDeath(GetAliveSnakes(), snake, gameData.GridSize))
                {
                    snake.IsDead = true;
                }
            }

            // Add the apples back that have been eaten
            logic.AddApples(gameData, amountOfApples);

            // Send updated gameData to the clients
            Broadcast(TcpProtocol.DataSend(gameData));

            // Check for end game
            if (GameHasEnded())
            {
                EndGame();
                return;
            }

            isRunning = false;
        }