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:
- Kartenstapel erstellen
- Kartenstapel mischen
- Spieler erzeugen
- Karten austeilen
- Reihum Farbe oder Wert bedienen
- Gewinner ermitteln
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);
}
}
Alle unsere
Java-Komponenten