Java Beispiel mit Vector und Inner Classes

Ein "Hello-World" für Fortgeschrittene

Schön zu wissen, dass es in Java Vektoren und innnere Klassen gibt. Aber was macht man damit und wo kann man sie sinnvoll einsetzen? Wie funktionieren Generics in der Praxis?

Hier ein Beispiel, es ist ein Mau-Mau-Simulator - eine Klasse, die einen Spielablauf simuliert. Die einzelnen Schritte sind:

Die Klasse MauMau.java als Textdatei
-> Am besten in Entwicklungsumgebung (z.B. Eclipse) starten und erst einmal die System-Ausgaben (System.out.pritnln()) ansehen. Diese dokumentieren den Spiel-Ablauf.



Quelltext:

import java.util.Iterator;
import java.util.Random;
import java.util.Vector;

/**
 * Mau-Mau-Simulator zur Anwendungs-Demonstration der Java-Elemente Vector und Inner classes.
 * Copyright (C) Christoph Müller 2009, zur Verfügung gestellt als Public Domain
 * @author Christoph Mueller
 */
public class MauMau {
 
  static String[] FARBEN = new String[]{"Kreuz", "Pik", "Herz", "Karo"};
  static String[] WERTE = new String[]{"ASS", "König", "Dame", "Bube", "10", "9", "8", "7"};

  public static void main(String[] args) {
    new MauMau();
  }
 
  class Karte {
    String farbe;
    String symbol;
    public Karte(String farbe, String symbol) {
      this.farbe = farbe;
      this.symbol = symbol;
    }
     public String toString() {
      return farbe + " " + symbol;
    }
  }
 
  Vector<Karte> kartenStapel;
  Random zufall = new Random(System.currentTimeMillis());
 
  public MauMau() {
    spieleEinSpiel();
  }
 
  void spieleEinSpiel() {
    erstelleKartenStapel();
    mischeKartenStapel();
    zeigeKartenStapel();
    erstelleSpieler();
    teileAus();
    for (int i = 0; i < spieler.size(); i++) {
      schaueInKartenVonSpieler(i);
    }
    legeKarteVomStapel();
    System.out.println("Es liegt " + liegendeKarte);
    reihumKartenLegen();
  }
 
  void erstelleKartenStapel() {
    kartenStapel = new Vector<Karte>();
    for (int i = 0; i < FARBEN.length; i++) {
      for (int j = 0; j < WERTE.length; j++) {
        kartenStapel.add(new Karte(FARBEN[i], WERTE[j]));
      }
    }
  }
 
  void zeigeKartenStapel() {
    System.out.println("Kartenstapel:");
    Iterator<Karte> iterator = kartenStapel.iterator();
    while (iterator.hasNext()) {
      Karte karte = iterator.next();
      System.out.println(karte);
    }
  }
 
  void mischeKartenStapel() {
    for (int i = 0; i < 1000; i++) { // Anzahl primitiver Mischschritte
      int tauschPartner1 = zufall.nextInt(32);
      int tauschPartner2 = zufall.nextInt(32);
      Karte karte1 = kartenStapel.get(tauschPartner1);
      Karte karte2 = kartenStapel.get(tauschPartner2);
      kartenStapel.setElementAt(karte2, tauschPartner1);
      kartenStapel.setElementAt(karte1, tauschPartner2);
    }
  }
 
  class Spieler {
    String name;
    Vector<Karte> akutelleKarten;
    public Spieler(String name) {
      this.name = name;
    }
  }
 
  Vector<Spieler> spieler;
 
  void erstelleSpieler() {
    spieler = new Vector<Spieler>();
    spieler.add(new Spieler("Fritz"));
    spieler.add(new Spieler("Elsa"));
    spieler.add(new Spieler("Bernd"));
  }
 
  void teileAus() {
    Iterator<Spieler> iterator = spieler.iterator();
    while (iterator.hasNext()) {
      Spieler spieler = iterator.next();
      spieler.akutelleKarten = new Vector<Karte>();
    }
    int jederSpielerHat = 0;
    while (jederSpielerHat < 5) {
      iterator = spieler.iterator();
      while (iterator.hasNext()) {
        Spieler spieler = iterator.next();
        spieler.akutelleKarten.add(kartenStapel.firstElement());
        kartenStapel.removeElementAt(0);
      }
      jederSpielerHat++;
    }
  }
 
  void schaueInKartenVonSpieler(int spielerNr) {
    Spieler dieserSpieler = spieler.elementAt(spielerNr);
    System.out.println("Spieler " + dieserSpieler.name + " hat folgende Karten:");
    Iterator<Karte> iterator = dieserSpieler.akutelleKarten.iterator();
    while (iterator.hasNext()) {
      Karte karte = iterator.next();
      System.out.println(karte);
    }
  }
 
  Karte liegendeKarte;
 
  void legeKarteVomStapel() {
    liegendeKarte = kartenStapel.firstElement();
    kartenStapel.removeElementAt(0);
  }
 
  boolean spielEntschieden = false;
  int spielerDranZaehler = zufall.nextInt(3);

  void reihumKartenLegen() {
    while (!spielEntschieden) {
      karteLegen();
    }
  }
 
  void einenSpielerWeiter() {
    spielerDranZaehler++;
    if (spielerDranZaehler >= spieler.size()) spielerDranZaehler = 0;
  }
 
  void karteLegen() {
    einenSpielerWeiter();
    Spieler spielerDran = spieler.elementAt(spielerDranZaehler);
    if (liegendeKarte.symbol.equals("7")) {
      System.out.println("Spieler " + spielerDran.name + " nimmt zwei Karten");
      zieheKarte(spielerDran);
      zieheKarte(spielerDran);
    }
    if (spielerDran.akutelleKarten.size() == 0) {
      System.out.println("Spieler " + spielerDran.name + " hat gewonnen!");
      spielEntschieden = true;
      return;
    }
    Iterator<Karte> iterator = spielerDran.akutelleKarten.iterator();
    boolean konnteLegen = false;
    while (iterator.hasNext()) {
      Karte karte = iterator.next();
      if (karte.farbe.equals(liegendeKarte.farbe) || karte.symbol.equals(liegendeKarte.symbol)) {
        liegendeKarte = karte;
        kartenStapel.add(karte);
        spielerDran.akutelleKarten.removeElement(karte);
        System.out.println("Spieler " + spielerDran.name + " legt " + karte + " und hat jetzt noch " + spielerDran.akutelleKarten.size() + " Karten");
        konnteLegen = true;
        break;
      }
    }
    if (konnteLegen) {
      if (liegendeKarte.symbol.equals("8")) {
        einenSpielerWeiter();
      }
    } else {
      zieheKarte(spielerDran);
      System.out.println("Spieler " + spielerDran.name + " konnte nicht legen.");
    }
  }
 
  void zieheKarte(Spieler spieler) {
    spieler.akutelleKarten.add(kartenStapel.firstElement());
    kartenStapel.removeElementAt(0);
  }

}

Weitere Angebote / Links

Alle unsere Java-Komponenten