@Override
  public void playRound() {
    int phyUpdateNbr = 0; // dernier nombre de màj physiques (stats)					
    int graphUpdateNbr = 0; // dernier nombre de màj graphiques (stats)
    long elapsedStatTime = 0; // temps écoulé depuis le dernier affichage des stats
    long elapsedPhysTime = 0; // temps écoulé depuis la dernière màj physique
    long elapsedGraphTime = 0; // temps écoulé depuis la dernière màj graphique
    long previousTime = System.currentTimeMillis(); // date de l'itération précédente
    long finalCount = 0; // décompte pour la toute fin de partie

    List<Integer> prevEliminated = new ArrayList<Integer>();
    newRoundReceived = false;

    while (running) {
      long currentTime = System.currentTimeMillis();
      long elapsedTime = currentTime - previousTime;
      previousTime = currentTime;

      elapsedPhysTime = elapsedPhysTime + elapsedTime;
      elapsedGraphTime = elapsedGraphTime + elapsedTime;
      elapsedStatTime = elapsedStatTime + elapsedTime;

      if (elapsedPhysTime / PHYS_DELAY >= 1) { // on envoie les commandes au serveur
        Direction[] directions = keyManager.retrieveDirections();
        sendDirection(
            directions); // TODO on pourrait tester si tout n'est pas NONE (auquel cas on
                         // n'enverrait rien)
        // on met à jour le moteur physique
        UpdateInterface updateData = clientCom.retrieveUpdate();
        if (updateData
            == null) { // TODO pas forcément une bonne idée de màj localement...ou alors faut
                       // désactiver tout ce qui est aléatoire
          //					physicsEngine.update(elapsedPhysTime, directions);
        } else {
          if (updateData instanceof Board) round.board = (Board) updateData;
          physicsEngine.forceUpdate(updateData);
          // if(updateData instanceof SmallUpdate)
          // {	SmallUpdate su = (SmallUpdate)updateData;
          //	PhysBoard b = (PhysBoard)physicsEngine.getBoard();
          ////	System.out.println(su.state+" vs. "+b.state);
          //	if(su.state==State.ENTRANCE)
          //		System.out.println();
          // }
          // System.out.println("["+elapsedTime+"]"+round.board.snakes[0].currentX+" ;
          // "+round.board.snakes[0].currentY);
          //				}
          // on met à jour les scores
          List<Integer> lastEliminated = physicsEngine.getEliminatedPlayers();
          if (!lastEliminated.isEmpty()) System.out.println();
          boolean finished = updatePoints(prevEliminated, lastEliminated);
          if (finished) finalCount = 1;
        }
        phyUpdateNbr++;
        elapsedPhysTime = 0;
      }

      if (elapsedGraphTime / GRAPH_DELAY >= 1) {
        graphicDisplay.update(round);
        graphUpdateNbr++;
        elapsedGraphTime = 0;
      }

      if (finalCount > 0) {
        finalCount = finalCount + elapsedTime;
        if (finalCount >= Constants.END_DURATION) running = false;
      }

      if (elapsedStatTime >= 1000) {
        if (showStats) System.out.println("UPS: " + phyUpdateNbr + " -- FPS: " + graphUpdateNbr);
        graphUpdateNbr = 0;
        phyUpdateNbr = 0;
        elapsedStatTime = 0;
      }
    }
  }