/**
  * 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();
           }
         }
   }
 }
 /**
  * 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();
   }
 }
 /**
  * fügt ein neues Spiel zu allen verfügbaren Spielen nach den übergebenen Daten hinzu und weißt
  * diesem eine ID zu. Anschließend werden alle Spiele an alle Clients geschickt
  *
  * @param zeile Daten, nach denen das Spiel erstellt werden soll
  */
 private void behandleNeuesSpiel(String zeile) {
   zeile = zeile.substring(zeile.indexOf(";") + 1);
   MultiplayerSpiel spiel = new MultiplayerSpiel();
   spiel.setAnzahlRunden(Integer.parseInt(zeile.substring(0, zeile.indexOf(";"))));
   zeile = zeile.substring(zeile.indexOf(";") + 1);
   spiel.setGesamtSpieler(Integer.parseInt(zeile.substring(0, zeile.indexOf(";"))));
   zeile = zeile.substring(zeile.indexOf(";") + 1);
   spiel.setSpielname(zeile);
   spiel.setSpielersteller(spieler);
   spiel.generateHost();
   System.out.println(spiel.getHost());
   synchronized (this) {
     spiel.setId(currentID++);
   }
   spiele.add(spiel);
   System.out.println(spiel);
   sendeVerfuegbareSpieleAnAlle();
 }
  /**
   * liefert das MultiplayerSpiel mit der übergebenen ID zurück
   *
   * @param id des gesuchten Multiplayerspiels
   * @return Multiplayerspiel, der übergebenen id, null wenn die id nicht gefunden wird
   */
  public MultiplayerSpiel getSpielById(int id) {
    MultiplayerSpiel ret = null;

    for (MultiplayerSpiel spiel : spiele) if (spiel.getId() == id) ret = spiel;
    return ret;
  }
 /**
  * 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();
 }