/**
  * setzt, dass der Client bereit zum Spielen ist. Wenn alle Clients bereit zum Spielen sind,
  * wird allen ein Startsignal geschickt
  *
  * @param zeile Daten des Clients
  */
 private void behandleBereitsein(String zeile) {
   bereit = true;
   int id = Integer.parseInt(zeile.substring(zeile.indexOf(";") + 1));
   MultiplayerSpiel spiel = getSpielById(id);
   spiel.addSpieler(spieler);
   boolean alleBereit = true;
   for (MultiplayerSpieler spieler : spiel.getAlleSpieler())
     for (ArduinoRacerConnectionThread thread : threads)
       if (spieler.getId() == thread.spieler.getId()) alleBereit &= thread.bereit;
   System.out.println("ALLEBEREIT?" + alleBereit);
   if (alleBereit) {
     spiele.remove(spiel);
     try {
       sendeVerfuegbareSpieleAnAlle();
     } catch (Exception e1) {
       e1.printStackTrace();
     }
     for (MultiplayerSpieler spieler : spiel.getAlleSpieler())
       for (ArduinoRacerConnectionThread thread : threads)
         if (spieler.getId() == thread.spieler.getId()) {
           try {
             thread.out.writeObject(SPIEL_START);
             System.out.println(SPIEL_START);
             thread.out.flush();
           } catch (Exception e) {
             e.printStackTrace();
           }
         }
   }
 }
 /**
  * passt die Daten (Auto, Name) des Spielers an und schickt diesem seine zugewiesene ID
  *
  * @param zeile Daten, auf die der Spieler angepasst werden soll
  * @throws IOException wenn das Senden der ID fehlschlägt
  */
 private void behandleSpielerdetails(String zeile) throws IOException {
   spieler = new MultiplayerSpieler();
   spieler.setAuto(
       new MultiplayerAuto(
           Integer.parseInt(zeile.substring(AUTO.length(), zeile.indexOf(";")))));
   zeile = zeile.substring(zeile.indexOf(";") + 1);
   spieler.setName(zeile);
   synchronized (this) {
     spieler.setId(currentID++);
   }
   out.writeObject(spieler.getId());
 }
    /** fragt die Eingaben des Clients ab und reagiert dementsprechend */
    @Override
    public void run() {

      try {
        String zeile = null;
        while ((zeile = in.readLine()) != null && !zeile.equals(CLOSE)) {
          System.out.println(zeile);
          synchronized (spiele) {
            if (zeile.indexOf(UMFRAGE_VERFUEGBARE_SPIELE) == 0) {
              sendeVerfuegbareSpiele();
            } else if (zeile.indexOf(AUTO) == 0) {
              behandleSpielerdetails(zeile);
            } else if (zeile.indexOf(SPIEL_BEITRITT) == 0) {
              behandleBeitritt(zeile);
            } else if (zeile.indexOf(SPIEL_RUECKTRITT) == 0) {
              behandleRuecktritt(zeile);
            } else if (zeile.indexOf(SPIEL) == 0) {
              behandleNeuesSpiel(zeile);
            } else if (zeile.indexOf(SPIELER_BEREIT) == 0) {
              behandleBereitsein(zeile);
            } else if (zeile.indexOf(SPIEL_LOESCHUNG) == 0) {
              behandleSpielLoeschen(zeile);
            }
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        try {
          out.close();
          in.close();
          client.close();
          threads.remove(this);
          System.out.println("close" + spiele.size());
          for (int i = 0; i < spiele.size(); i++) {
            if (spiele.get(i).getSpielersteller().getId() == spieler.getId()) {
              spiele.remove(i);
              i = spiele.size() + 1;
            } else
              System.err.println(
                  spiele.get(i).getSpielersteller().getId() + " != " + spieler.getId());
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
 /**
  * löscht das Spiel, das den übergebenen Daten entspricht, jedoch nur, wenn der Client, der das
  * Spiel löschen will das Spiel erstellt hat. Nachdem das Spiel gelöscht wird, werden alle
  * Spiele an alle Clients geschickt
  *
  * @param zeile Daten, des zu löschenden Spiels
  */
 private void behandleSpielLoeschen(String zeile) {
   zeile = zeile.substring(zeile.indexOf(";") + 1);
   MultiplayerSpiel spiel = getSpielById(Integer.parseInt(zeile));
   if (spiel.getSpielersteller().getId() == spieler.getId()) {
     spiele.remove(spiel);
     sendeVerfuegbareSpieleAnAlle();
   }
 }
 /**
  * behandelt einen Beitritt des Clients zu ein Spiel. Dabei werden die übergebenen Daten zu
  * einem vorhanden Spiel zugewiesen und bei einem erfolglosen Beitritt eine dementsprechende
  * Meldung geschickt. Ansonsten wir eine Beitrittsbestätigung geschickt.
  *
  * @param zeile Daten des Clients
  * @throws IOException Wenn beim Senden ein Fehler auftritt
  */
 private void behandleBeitritt(String zeile) throws IOException {
   System.out.println("behandleBeitritt");
   int id = Integer.parseInt(zeile.substring(zeile.indexOf(";") + 1));
   MultiplayerSpiel spiel = getSpielById(id);
   String grund = null;
   if (spiel == null) grund = "Teilnahme am Spiel fehlgeschlagen";
   else if (spiel.hasSpieler(spieler.getId()))
     grund = "Spieler mit Ihrer ID ist bereits im Spiel vorhanden";
   else if (spiel.hasAutofarbe(spieler.getAuto().getFarbe()))
     grund = "Spieler mit Ihrem Auto ist bereits im Spiel vorhanden";
   else if (spiel.hasSpielername(spieler.getName()))
     grund = "Spieler mit Ihrem Name ist bereits im Spiel vorhanden";
   else {
     spiel.addSpieler(spieler);
     out.writeObject(BEITRITTS_BESTAETIGUNG + ";" + id);
     out.flush();
     sendeVerfuegbareSpieleAnAlle();
     if (spiel.getGesamtSpieler() == spiel.getBegetetreteneSpieler()) {
       for (MultiplayerSpieler spieler : spiel.getSpieler())
         for (ArduinoRacerConnectionThread thread : threads)
           if (spieler.getId() == thread.spieler.getId()) {
             thread.out.writeObject(SPIEL_OK);
             System.out.println("SPIEL_PK");
             thread.out.flush();
           }
       System.out.println(spiel.getSpielersteller().getId() + threads.toString());
       for (ArduinoRacerConnectionThread thread : threads)
         if (spiel.getSpielersteller().getId() == thread.spieler.getId()) {
           thread.out.writeObject(SPIEL_OK);
           System.out.println("SPIEL_OK TO SERVER");
         }
     }
   }
   if (grund != null) {
     out.writeObject(BEITRITTS_ABSAGE + ";" + id + ";" + grund);
     out.flush();
   }
 }
 /**
  * löscht den Spieler vom übergeben Spiel und sendet alle Spiele an alle.
  *
  * @param zeile Daten, des Spiels, bei dem der Spieler gelöscht werden soll
  */
 private void behandleRuecktritt(String zeile) {
   MultiplayerSpiel spiel =
       getSpielById(Integer.parseInt(zeile.substring(zeile.indexOf(";") + 1)));
   spiel.removeSpieler(spieler.getId());
   sendeVerfuegbareSpieleAnAlle();
 }
 public String toString() {
   return spieler.getId() + "";
 }