NullsummenGewinnspiel

chk1102

Aktives Mitglied
Hallo Zusammen,

ich habe eine Programm was ich lösen möchte und komme leider nicht weiter.


1. Klasse:
Java:
package Proggen1_2;

public class Spieler {
	
	private int geld;
	private int zahlGewinnzuege;
	
	public Spieler (int g) {
		this.geld = g;
		this.zahlGewinnzuege = 0;
	}
	
	public void geldBewegen (int b) {
		this.geld = b++;
	}
	
	public void zeigeGeld (){
		System.out.println("Geldausgabe " + geld);
	}
	
	public boolean kannSpielen(){
		if (geld >0)
		return true;
		else
		return false;
	}
	
	public void gewinnzug(){
		zahlGewinnzuege++;
	}
	
	public int getGewinnzuege(){
		return zahlGewinnzuege;
	}
	

}

2. Klasse:
Java:
package Proggen1_2;

public class Spiel {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		System.out.println("Bitte gib A0 an für beide Spieler:");
		int a0 = EAM.rInt();
		System.out.println("Bitte gib die Wahscheinlichkeit ein, dass A gewinnt ( 0<p<1)");
		int p = EAM.rInt();
		int zz = (int) Math.random()+1;
		System.out.println(zz);
		Spieler A = new Spieler(a0);
		Spieler B = new Spieler(a0);
		
		System.out.println("Beide Spieler haben " + a0 + " zur Verfügung");
		//A.zeigeGeld();
		int betrag;
	
		while(A.kannSpielen() == true || B.kannSpielen()== true ) {
			zz = (int) Math.random()+1;
			if (zz <= p) {
				A.geldBewegen(zz);
				A.gewinnzug();
				A.getGewinnzuege();
				A.zeigeGeld();
			}
			else {
				B.geldBewegen(zz);
				B.gewinnzug();
				B.getGewinnzuege();
				B.zeigeGeld();
			}
			zz = (int) Math.random()+1;

			
		}

	}

}

Zb die Methode geldBewegen() ist glaub ich nicht in Ordnung..
Könnte mir jemand erst einmal für diese Methode nen Tipp geben?
 

Anhänge

  • gewinnspiel.pdf
    245,1 KB · Aufrufe: 12

Mujahiddin

Top Contributor
Java:
 public void geldBewegen (int b) {
        this.geld = b++;
    }

Mal beim Überfliegen (vielleicht solltest du noch dazu sagen, was das Spiel machen soll etc.)

"this.geld = b++;" ist das gleiche wie "this.geld = b; b = b + 1;" Das ist unnötiger Code, da b nach der Methode nicht mehr verwendet wird.
Was du willst ist "geld = b;" oder "geld += b;" jenachdem, ob b drauf addiert werden soll oder draufgeschrieben.
 

chk1102

Aktives Mitglied
Im Anhang hab ich die Aufgabenstellung beigefügt.
Gern hier in Kurzform.
Man gibt einen Geldbetrag für beide Spieler ein und über einen Automatismus soll eine Zufallszahl solange gezogen werden und je nach Gewinner vom Anfangsbetrag subtrahiert oder addiert werden bis einer von beiden kein Geld mehr hat. (entweder +1 oder -1)

In der Aufgabenstellung steht nur iwie nicht die Methode die die Werte abzieht, sondern nur addiert..
 

chk1102

Aktives Mitglied
Hm,.. hab ich schon eben geändert

Java:
public void geldBewegen (int b) {
		geld += b;
	}

Oder muss ich die Geldwerte der beiden Spieler immer in eine Variable speichern um sie dann zu prüfen?
 

chk1102

Aktives Mitglied
Ok, ich den Code etwas geändert:

Java:
package Proggen1_2;

public class Spiel {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		System.out.println("Bitte gib A0 an für beide Spieler:");
		int a0 = EAM.rInt();
		System.out.println("Bitte gib die Wahscheinlichkeit ein, dass A gewinnt ( 0<p<1)");
		int p = EAM.rInt();
		int zz = (int) Math.random()+1*1;
		System.out.println(zz);
		Spieler A = new Spieler(a0);
		Spieler B = new Spieler(a0);
		
		System.out.println("Beide Spieler haben " + a0 + " zur Verfügung");
		//A.zeigeGeld();
		int betrag;
	
		while(A.kannSpielen() == true && B.kannSpielen()== true ) {
			zz = (int) Math.random();
			System.out.println(zz);
			if (zz <= p) {
				System.out.println("Punkt für A, ABzug für B");
				A.geldBewegen(1);
				B.geldBewegen(-1);
				A.gewinnzug();
			}
			else {
				System.out.println("Punkt für B, ABzug für A");
				B.geldBewegen(1);
				A.geldBewegen(-1);
				B.gewinnzug();
			}
			zz = (int) Math.random();

		}
		if(A.kannSpielen()) {
			System.out.println("A hat gewonnen ");
		}else System.out.println("B hat gewonnen");

		System.out.println("A Gewinnzüge: " + A.getGewinnzuege());	
		System.out.println("B Gewinnzüge: " + B.getGewinnzuege());
	}

}

Die Spieler Klasse ist gleich geblieben.
Wenn ich das SPiel starte kommt folgende ausgabe:

Bitte gib A0 an für beide Spieler:
10
Bitte gib die Wahscheinlichkeit ein, dass A gewinnt ( 0<p<1)
0
1
Beide Spieler haben 10 zur Verfügung
0
Punkt für A, ABzug für B
0
Punkt für A, ABzug für B
0
Punkt für A, ABzug für B
0
Punkt für A, ABzug für B
0
Punkt für A, ABzug für B
0
Punkt für A, ABzug für B
0
Punkt für A, ABzug für B
0
Punkt für A, ABzug für B
0
Punkt für A, ABzug für B
0
Punkt für A, ABzug für B
A hat gewonnen
A Gewinnzüge: 10
B Gewinnzüge: 0


Ich möchte aber, dass die ZZ immer wieder neugezogen wird sodass A oder B eine Chance auf Punkte hat. Kann mir dabei noch jemand helfen?:rtfm:???:L
 

Mujahiddin

Top Contributor
Java:
System.out.println("Bitte gib die Wahscheinlichkeit ein, dass A gewinnt ( 0<p<1)");
int p = EAM.rInt();

Es müsste sich um
Code:
double
handeln.

Übrigens, bei booleschen Abfragen ist es redundant, auf "== true" zu prüfen.
Also statt
Code:
while(A.kannSpielen() == true && B.kannSpielen()== true )
eher
Code:
while(A.kannSpielen() && B.kannSpielen())
und statt
Java:
public boolean kannSpielen(){
        if (geld >0)
        return true;
        else
        return false;
    }
eher
Java:
public boolean kannSpielen(){
        return geld > 0;
    }

Der einzige Fall, wo ich es als sinnvoll erachte, ist
Code:
if( xx instanceof XX == false )
statt
Code:
if( !( xx instanceof XX ) )
 
P

pappawinni

Gast
Bester chk1102,

Math.random() liefert eine Zahl >= 0.0 und < 1.0
Wenn du daraus dann (int) machst, dann hast du in aller Regel als Ergebnis 0.

In dem Fall
Code:
(int) Math.random()+1*1;
erschliesst sich mir zwar nicht, warum da +1*1 steht, weil +1 das gleiche tun würde, aber da kommt dann wenigstens machmal 0 und manchmal 1 heraus.

Damit du aber überhaupt sinnvoll mit dem Anfangs einzugebenden Wahrscheinlichkeitswert vergleichen kannst, muss dieser, wie auch die ermittelten Zufallszahlen vom Typ double sein.
 
H

hüteüberhüte

Gast
Was mich ein bisschen stutzig macht ist, dass eine Zufallszahl zwischen 0 und 1 verlangt ist. Soweit ich weiß, lässt sich das gar nicht realisieren.

Ein coin flip wäre z.B.
Code:
Math.random() < 0.5
.

Es ist bewusst der (Echt)-Kleiner-Operator
Code:
<
, weil random() eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv) zurück gibt
 

chk1102

Aktives Mitglied
Naja Hausaufgaben nicht direkt ;) eher Prüfungsvorbereitung :)

Das mit 0 und 1 ist die Aufgabenstellung. Weder diese Aufgabe noch andere sind sinnvoll. Ihre Sinnhaftigkeit besteht nur darin sich mit Java auseinanderzusetzen. :toll:

Ich habe jez die Problemlösung gefunden, so bekomme ich unterschiedliche Ergebnisse und Danke für den Hinweis mit Double.

Java:
package Proggen1_2;

public class Spiel {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		System.out.println("Bitte gib A0 an für beide Spieler:");
		int a0 = EAM.rInt();
		System.out.println("Bitte gib die Wahscheinlichkeit ein, dass A gewinnt ( 0<p<1)");
		double p = EAM.rDouble();
		double zz =  Math.random();
		System.out.println(zz);
		Spieler A = new Spieler(a0);
		Spieler B = new Spieler(a0);
		
		System.out.println("Beide Spieler haben " + a0 + " zur Verfügung");
		//A.zeigeGeld();
		int betrag;
	
		while(A.kannSpielen()  && B.kannSpielen()) {
			zz = Math.random();
			System.out.println(zz);
			if (zz <= p) {
				System.out.println("Punkt für A, ABzug für B");
				A.geldBewegen(1);
				B.geldBewegen(-1);
				A.gewinnzug();
			}
			if (zz >p) {
				System.out.println("Punkt für B, ABzug für A");
				B.geldBewegen(1);
				A.geldBewegen(-1);
				B.gewinnzug();
			}
		}
		if(A.kannSpielen()) {
			System.out.println("A hat gewonnen ");
		}else System.out.println("B hat gewonnen");

		System.out.println("A Gewinnzüge: " + A.getGewinnzuege());	
		System.out.println("B Gewinnzüge: " + B.getGewinnzuege());
	}

}

Ich habe das zweite If für den Spieler B angepasst :)
 
H

hüteüberhüte

Gast
So hätte ich das gemacht (Klassen außen vor gelassen,
Code:
if (ra.nextDouble() < wahrs)
interessant):

Java:
import java.util.Random;
import java.util.Scanner;

public class NullsummenGewinnspiel {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Kapital: ");
        int kapital1 = sc.nextInt();
        int kapital2 = kapital1;
        System.out.print("Wahrscheinlichkeit A: ");
        double wahrs = sc.nextDouble();
        int runden = 0;
        int gewonnen1 = 0;
        int gewonnen2 = 0;
        Random ra = new Random();
        while (kapital1 > 0 && kapital2 > 0) {
            if (ra.nextDouble() < wahrs) {
                kapital1++;
                kapital2--;
                gewonnen1++;
            } else {
                kapital1--;
                kapital2++;
                gewonnen2++;
            }
            runden++;
        }
        System.out.println("kapital1  = " + kapital1);
        System.out.println("kapital2  = " + kapital2);
        System.out.println("runden    = " + runden);
        System.out.println("gewonnen1 = " + gewonnen1);
        System.out.println("gewonnen2 = " + gewonnen2);

        main(null);
    }
}
 

Oben