Java/Roulette

Aus ZUM-Unterrichten
Die druckbare Version wird nicht mehr unterstützt und kann Darstellungsfehler aufweisen. Bitte aktualisiere deine Browser-Lesezeichen und verwende stattdessen die Standard-Druckfunktion des Browsers.

Eine Umsetzung eines Roulettespiels mit BlueJ.

BlueJRoulette.gif

Quelltext

Klasse Kugel
public class Kugel
{
    // instance variables - replace the example below with your own
    private int zahl;
    private String farbe;

    // Konstruktor - Startposition 
    public Kugel()
    {
        zahl = 0;
        farbe = "gruen";
    }

    public void rolleKugel()
    {
        // Zahl zwischen 0 und 36
        zahl = (int) ((Math.random()*37));
        if (zahl == 1 || zahl == 3 || zahl == 5
          ||zahl == 7 || zahl == 9 || zahl == 12
          ||zahl == 14 ||zahl == 16 ||zahl == 18
          ||zahl == 19 ||zahl == 21 ||zahl == 23
          ||zahl == 25 ||zahl == 27 ||zahl == 30
          ||zahl == 32 ||zahl == 34 ||zahl == 36) {
            farbe = "rot";
        }
        else {
            if (zahl == 0) {
                farbe = "gruen";
            }
            else {
                farbe = "schwarz";
            }
        }
    }

    public String getFarbe(){
        return farbe;
    }
    
    public void testeKugel(int anzahl){
        int anzahlRot=0;
        int anzahlSchwarz=0;
        int anzahlGruen=0;
        for (int i=1;i<=anzahl;i++){
            rolleKugel();
            if (farbe.equals("rot")) {
                anzahlRot++;
            }
            if (farbe.equals("schwarz")) {
                anzahlSchwarz++;
            }
            if (farbe.equals("gruen")) {
                anzahlGruen++;
            }
        }
        System.out.println(anzahlRot+" von "+anzahl+" waren rot.");
        System.out.println((anzahlRot*1000/anzahl)/10.0 + " Prozent der Spiele.\n");
        System.out.println(anzahlSchwarz+" von "+anzahl+" waren schwarz.");
        System.out.println((anzahlSchwarz*1000/anzahl)/10.0 + " Prozent der Spiele.\n");
        System.out.println(anzahlGruen+" von "+anzahl+" waren gruen.");
        System.out.println((anzahlGruen*1000/anzahl)/10.0 + " Prozent der Spiele.\n");
    }
    
} // Ende der Klasse
Klasse Spieler
public class Spieler
{
    private double vermoegen;
    private double einsatz;
    private String farbe;

    public Spieler()
    {
        vermoegen = 1000;
        einsatz = 10;
        farbe = "schwarz";
    }
    
    public double getEinsatz() {
        return einsatz;
    }

    public String getFarbe() {
        return farbe;
    }
    
    public void verbucheSpielergebnis(double betrag) {
        vermoegen += betrag;   
    }
}
Klasse Croupier
public class Croupier
{
    private Kugel k;
    private Spieler spieler1;
    private Spieler spieler2;

    private double bankvermoegen;

    public Croupier(Spieler pSpieler1, Spieler pSpieler2)
    {
        k = new Kugel();
        bankvermoegen = 1000000;
        spieler1 = pSpieler1;
        spieler2 = pSpieler2;
    }

    public void spieleEineRunde()
    {
        k.rolleKugel();
        if (k.getFarbe().equals(spieler1.getFarbe())) {
            bankvermoegen-=spieler1.getEinsatz();
            spieler1.verbucheSpielergebnis(spieler1.getEinsatz());
        }
        else {
            bankvermoegen+=spieler1.getEinsatz();
            spieler1.verbucheSpielergebnis(-spieler1.getEinsatz());   
        }
        if (k.getFarbe().equals(spieler2.getFarbe())) {
            bankvermoegen-=spieler2.getEinsatz();
            spieler2.verbucheSpielergebnis(spieler2.getEinsatz());
        }
        else {
            bankvermoegen+=spieler2.getEinsatz();
            spieler2.verbucheSpielergebnis(-spieler2.getEinsatz());   
        }        
    }
}


Übung
  1. Zur Klasse Kugel
    Testen Sie die Klasse Kugel, indem Sie ein Objekt Kugel anlegen, den Inspector aufrufen und die Methoden testen.
    Erläutern Sie die Funktionsweise von rolleKugel() und danach von testeKugel().
  2. Testen Sie anhand von testeKugel, ob der Erwartungswert der Farben erfüllt wird. Testen Sie dazu einmal 100, 1000 und 1000000 Vorgänge.
    Nehmen Sie Stellung zu der Aussage: „auf Dauer gewinnt das Casino“.
  3. Zur Klasse Spieler
    Testen Sie die Klasse Spieler, indem Sie ein Objekt Kugel anlegen, den Inspector aufrufen und die Methoden testen.
  4. Ergänzen Sie die Klassen setEinsatz(...) und setFarbe(...), die den Einsatz bzw. die Farbe verändern.
    Der Einsatz darf nicht negativ sein. Falls eine negative Zahl eingegeben wird, wird der Einsatz auf 0 gesetzt.
  5. Ergänzen Sie verbucheErgebnis() so, dass der Einsatz auf 0 gesenkt wird, wenn das Vermögen des Spielers im negativen Bereich ist.
    Es soll eine Ausgabe auf der Konsole passieren: „Ein Spieler ist pleite“.
  6. Zur Klasse Croupier
    Erläutern Sie, inwiefern der Croupier die Spieler und die Kugel verwaltet.
    Erläutern Sie die Funktionsweise von spieleEineRunde().
  7. Falls die Bank negatives Vermögen hat, soll angezeigt werden: „Bank ist pleite“.
  8. Ergänzen Sie eine Methode, die mehrfach nacheinander Spiele ausführt.
    Prüfen Sie damit noch einmal die Aussage: „auf Dauer gewinnt das Casino“.
  9. Eine Gewinnstrategie:
    Verändern Sie das Setzverhalten des Spielers wie folgt: wenn der Spieler verloren hat, verdoppelt er den Einsatz. Gewinnt er, ist der Einsatz wieder 10.
    Prüfen Sie die Aussage: Auf lange Sicht ist der Spieler auch damit pleite.
  10. Ergänzen Sie das Programm um weitere 2 Spieler.
  11. Sollten Sie wirklich schon fertig sein: Wie könnte man auf ähnliche Weise ein „Fußballtoto“ programmieren. Dabei sollen nur die Spiele einer Mannschaft erfasst werden. Die Spieler setzen auf „Sieg“, „Verlust“ und „Unentschieden“.

Erläutern Sie den Unterschied zum Roulettespiel – Warum ist eine Methode wie „testeKugel()“ beim Fußballtoto nicht so aussagekräftig wie beim Roulette?