public class Athlète {
  public static final double TPS_MIN = 9., TPS_MAX = 14.;
  private static final double PAS_COURU = 0.0;
  private static int cptDossard = 1;
  private int dossard;
  private boolean témoin;
  private double dernierTemps;
  private Athlète suivant;

  public Athlète() {
    this.dossard = cptDossard++;
    this.témoin = false;
    this.dernierTemps = PAS_COURU;
    this.suivant = null;
  }

  public void setSuivant(Athlète suivant) {
    this.suivant = suivant;
  }
  
  public void prendLeTémoin() {
    assert (!aLeTémoin());
    témoin = true;
    court();
    if (suivant != null)
      passeLeTémoinA(suivant);
  }

  public void rendLeTémoin() {
    assert (aLeTémoin());
    témoin = false;
  }

  public boolean aLeTémoin() {
    return témoin;
  }

  public void passeLeTémoinA(Athlète a) {
    assert (aLeTémoin() && !a.aLeTémoin());
    rendLeTémoin();
    a.prendLeTémoin();
  }

  public void court() {
    assert (aLeTémoin());
    // un temps aléatoire compris entre TPS_MIN et TPS_MAX
    dernierTemps = TPS_MIN + ((TPS_MAX - TPS_MIN) * Math.random());
  }

  public double getDernierTemps() {
    assert (dernierTemps != PAS_COURU);
    return dernierTemps;
  }

  public String toString() {
    return Integer.toString(dossard);
  }
}
