Java/Roulette: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
main>Karl Kirst
K (+kat Informatik; Bild zentriert)
main>Ugh
(Neu, nette Anwendung und wichtige Erfahrung: Das Casino gewinnt immer)
Zeile 1: Zeile 1:
{{Babel-1|Java}}
Eine Umsetzung eines Roulettespiels mit [[BlueJ]].
Eine Umsetzung eines Roulettespiels mit [[BlueJ]].


Zeile 142: Zeile 143:
</java>
</java>


{{Ü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?
}}


[[Kategorie:Informatik]]
[[Kategorie:Informatik]]
[[Kategorie:Java]]

Version vom 5. Februar 2007, 21:56 Uhr

Vorlage:Babel-1 Eine Umsetzung eines Roulettespiels mit BlueJ.

BlueJRoulette.gif

Quelltext

Klasse Kugel

<java> 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 </java>

Klasse Spieler

<java> 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;   
   }

} </java>

Klasse Croupier

<java> 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());   
       }        
   }

} </java>


Ü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?