Poker

Pokerspiel.java

package pokerspiel;

public class Pokerspiel {

  private Kartendeck  deck;
  // leeres Array, wird später dynamisch erweitert bis MAX_SPIELER_ANZAHL
  private Spieler[]   spieler         = new Spieler[0];
  private Karte[]     communityCards  = new Karte[0];

  private static final int  MIN_SPIELER_ANZAHL      = 2;
  private static final int  MAX_SPIELER_ANZAHL      = 8;
  private static final int  HAND_CARDS_ANZAHL       = 2;
  private static final int  COMMUNITY_CARDS_ANZAHL  = 5;

  /**
   * erstellt ein Pokerspiel mit dem Kartendeck deck
   *
   * @param deck
   */
  public Pokerspiel(Kartendeck deck) {
    this.deck = deck;
  }

  /**
   * setzt einen Spieler an den Tisch
   * <p>
   * <b>tischBeitreten:</b> Fügt einen Spieler dem Pokertisch hinzu, dabei
   * sollte das Maximum von 8 Spielern nicht überschritten werden!
   *
   * @param spieler
   */
  public void tischBeitreten(Spieler spieler) {
    // Methode vorzeitig beenden, wenn ein Spieler bereits am Tisch ist
    if (existSpieler(spieler))
      return;

    // prüft ob die maximale Anzahl an Spieler bereits erreicht ist,
    // wenn ja, Hinweis ausgeben, das der Spieler nicht platznehmen
    // kann und Methode vorzeitig beenden
    if (this.spieler.length >= MAX_SPIELER_ANZAHL) {
      System.out.println(spieler.getName() + " finden keinen freien Platz am Tisch.");
      return;
    }

    System.out.println(spieler.getName() + " nimmt am Tisch platz.");

    Spieler[] tmpSpieler = new Spieler[this.spieler.length + 1];
    int i = 0;
    for (Spieler spieler1 : this.spieler)
      tmpSpieler[i++] = spieler1;
    tmpSpieler[i] = spieler;
    this.spieler = tmpSpieler;
  }

  /**
   * entfernt einen Spieler vom Tisch
   * <p>
   * <b>tischVerlassen:</b> Ein bestimmter Spieler verlässt den Pokertisch,
   * damit wird ein Platz frei.
   *
   * @param spieler
   */
  public void tischVerlassen(Spieler spieler) {
    // tue nichts, wenn Spieler nicht am Tisch ist
    if (!existSpieler(spieler))
      return;

    System.out.println(spieler.getName() + " verlässt den Tisch.");

    Spieler[] tmpSpieler = new Spieler[this.spieler.length - 1];
    int i = 0;
    for (Spieler spieler1 : this.spieler) {
      if (!spieler1.equals(spieler))
        tmpSpieler[i++] = spieler1;
    }
    this.spieler = tmpSpieler;
  }

  /**
   * prüft, ob ein Spieler bereits am Tisch ist
   *
   * @param spieler
   * @return (true: Spieler schon vorhanden)
   */
  private boolean existSpieler(Spieler spieler) {
    for (Spieler spieler1 : this.spieler) {
      if (spieler1.equals(spieler))
        return true;
    }
    return false;
  }

  /**
   * gibt jeden Spiele 2 Karten (Hand) aus dem Deck und teilt die 5 Community
   * Cards aus
   * <p>
   * <b>austeilen:</b> Aus dem Kartendeck erhält jeder Spieler zwei Karten.
   * Weiterhin werden die fünf Community Cards gesetzt.
   */
  public void austeilen() {
    for (Spieler spieler : this.spieler) {
      Hand hand = new Hand(this.deck.getKarten(HAND_CARDS_ANZAHL));
      spieler.setHand(hand);
    }
    this.communityCards = this.deck.getKarten(COMMUNITY_CARDS_ANZAHL);
  }

  /**
   * gibt eine Spielübersicht zurück
   * <p>
   * <b>toString:</b> Erzeugt eine Übersicht des aktuellen Spiels in Form
   * einer Zeichenkette. Diese soll die Community Cards sowie die Namen der
   * Spieler mit ihren aktuellen Händen enthalten.
   *
   * @return
   */
  @Override
  public String toString() {
    String communityCardsStr = "";
    for (Karte karte : this.communityCards) {
      if (!"".equals(communityCardsStr))
        communityCardsStr += ", ";
      communityCardsStr += karte;
    }
    String spielerCardsStr = "", winner = "";
    int max = 0;
    for (Spieler spieler : this.spieler) {
      Eval eval = new Eval(communityCards, spieler.getHand().getKarten());
      spielerCardsStr += spieler.getName() + ": " + spieler.getHand() + "\n" + eval + "\n";
      if (eval.getScore() > max) {
        max = eval.getScore();
        winner = spieler.getName();
      } else if (eval.getScore() == max) {
        winner += ", " + spieler.getName();
      }
    }

    return "Community Cards: " + communityCardsStr + "\n" + spielerCardsStr + "Gewinner ist: " + winner;
  }

  /**
   * spielt eine Partie Poker, mischen, austeilen, Ausgabe, zusammenwerfen
   * <p>
   * <b>spielen:</b> Simuliert ein Pokerspiel, bestehend aus (1) Mischen des
   * Kartendecks, (2) Austeilen der Karten, (3) Ausgeben der Spielübersicht
   * (mit System.out.println()) und (4) Zusammenwerfen der Karten
   */
  public void spielen() {
    // prüft, ob mindestens zwei Spieler am Tisch sitzen
    // wenn nicht, Hinweis ausgeben und Methode vorzeitig beenden
    if (this.spieler.length < MIN_SPIELER_ANZAHL) {
      System.out.println("Die Mindesanzahl an Spielern von " + MIN_SPIELER_ANZAHL
          + " für eine Pokerpartie ist nicht erreicht.");
      if (this.spieler.length == 1)
        System.out.println(spieler[0].getName() + " wartet auf einen weiteren Mitspieler.");

      System.out.println();
      return;
    }
    System.out.println(" +++ mische Karten +++");
    this.deck.mischen();
    System.out.println(" +++ verteile Karten +++");
    this.austeilen();
    System.out.println(this);
    System.out.println(" +++ ziehe Karten ein +++\n");
    this.deck.zusammenwerfen(this.communityCards);
    for (Spieler spieler : this.spieler) {
      this.deck.zusammenwerfen(spieler.getHand().getKarten());
    }
  }
}