Würfelspiel

Neondream

Aktives Mitglied
so habe hier das würfel spiel craps geschrieben,
mein problem ist manchmal terminiert das programm manchmal läuft es endlos lange, und manchmal terminiert es als gewonnen + verloren

k soll dafür nur die zählervariable darstellen um mir zu eigen wie oft die whileschleife durchläuft

wäre nett wenn mir jmnd sagen kann wieso es nicht funktioniert

Java:
		int a = (int)Math.round(1 + (Math.random()* (6-1)));
		int b = (int)Math.round(1 + (Math.random()* (6-1)));
		//variablen für weiter würfe bestimmen
		int d = (int)Math.round(1 + (Math.random()* (6-1)));
		int e = (int)Math.round(1 + (Math.random()* (6-1)));
		//variable für zweiten + weitere würfe
		int z = d + e;		
		//zählervariable für anzahl der würfe
		int k = 1;
		
		// x bestimmen
		double c = a +b;
		
		//gewonnen / verloren definieren
		if (c == 7 || c == 11 )
			System.out.println("gewonnen");
		
		if (c == 2 || c == 3 || c == 12)
			System.out.println("verloren");
		
		else 
		{	
			while (z != 7 || z!= c)
			{
				d = (int)Math.round(1 + (Math.random()* (6-1)));
				e = (int)Math.round(1 + (Math.random()* (6-1)));
				k++;
			}
			if(z ==7)
			{
				System.out.println("verloren");
				System.out.println(k);
			}
				
			if(z == c)
			{
				System.out.println("gewonnen");	
				System.out.println(k);
			}
		}
	}
 

Murray

Top Contributor
Das sind doch "Entweder-Oder"-Entscheidungen; man hat entweder gewonnen oder verloren. Insofern würde ich im Code auch else-Zweige erwarten.

Java:
        //gewonnen / verloren definieren
        if (c == 7 || c == 11 ) {
            System.out.println("gewonnen");
        } else if (c == 2 || c == 3 || c == 12)
            System.out.println("verloren");
        } else {
Ähnlich ist es auch weiter unten im Code; besser wäre hier
Java:
            if(z ==7) {
                System.out.println("verloren");
                System.out.println(k);
            } else if(z == c) {
                System.out.println("gewonnen"); 
                System.out.println(k);
            }


Und wie soll diese Schleife
Java:
            while (z != 7 || z!= c)
            {
                d = (int)Math.round(1 + (Math.random()* (6-1)));
                e = (int)Math.round(1 + (Math.random()* (6-1)));
                k++;
            }
jemals terminieren? Die Abbruchbedingung hängt nur von z und c ab;diese Variablen werden aber im Schleifenkörper nicht verändert.
 

Neondream

Aktives Mitglied
so hier einmal meine aufgabe:


habe das programm noch mal überarbeitet (ist noch nicht vollständig da ..discrete noch nicht verwendet wird und es noch nicht modular ist)

aber es terminiert meistens immer noch nicht, einmal hat es bisher terminiert allerdings mit einer 100% gewinnrate bei 100 durchläufen, was ja nicht wirklich sein kann.
bin gerade ein wenig ratlos wodran es liegt wäre nett wenn mit jmnd 1 - 2 tips geben könnte,

Danke

Java:
		//variable für durchläufe /samplerate
		int samplesize = Integer.parseInt(args[0]);
		
		int gewinnrate = 0;
		int verlustrate = 0;
		
		//erste würfe bestimmen
		int a = (int)Math.round(1 + (Math.random()* (6-1)));
		int b = (int)Math.round(1 + (Math.random()* (6-1)));
		//variablen für weiter würfe bestimmen
		int d = (int)Math.round(1 + (Math.random()* (6-1)));
		int e = (int)Math.round(1 + (Math.random()* (6-1)));
		//variable für zweiten + weitere würfe
		int z = d + e;		
	
		// x bestimmen
		double c = a +b;
		
		//für allgemeine gewinnrate nach samplerate anzahl der würfe = schleifendurchläufe
		for(int i = 0; i < samplesize ; i++)
		{
			//gewonnen / verloren definieren
			if (c == 7 || c == 11 )
			{
				gewinnrate++;
			}
			else if (c == 2 || c == 3 || c == 12)
			{
				verlustrate++;
			}
			//wenn nichts von beiden eintrifft
			else 
			{	
				//solange werfen bis wurf c oder sieben ergibt
				while (z != 7 || z!= c)
				{
					d = (int)Math.round(1 + (Math.random()* (6-1)));
					e = (int)Math.round(1 + (Math.random()* (6-1)));
					z = d + e;	
				}
				if(z ==7)
				{
					verlustrate++;
				}
				
				else if(z == c)
				{
					gewinnrate++;
				}
			
			}
		}
		
		// verlust / gewinnrate prozentual bestimmen
		double gewinn = (gewinnrate/samplesize)*100;
		double verlust = (verlustrate/samplesize)*100;
		
		System.out.println("Gewinnrate bei " + samplesize + " Durchläufen beträgt: " + gewinn + "%");
		System.out.println("Verlustrate bei " + samplesize + " Durchläufen beträgt: " + verlust + "%");
	}

}

edit: z soll ja weitere würfe darstellen und c soll ja bereits vom ersten wurf gegeben sein nach den regeln habs trotzdem nochmal überarbeitet danke
 
Zuletzt bearbeitet:

Neondream

Aktives Mitglied
1 fehler habe ich bereits gefunden am ende der for schleife muss der erste wurf nochmal bestimmt werden für eine weitere for schleife somit terminierts nicht mehr zu 100% dafür terminierts jetzt gar nicht mehr :shock:


hätte noch eine weitere möglichkeit anzubieten bei der es zwar terminiert aber in fast allen fällen nur mit 0.0% gewinn und 0.0% verlust
ersetze hier die wehile schleife mit einer for schleife alles andere bleibt wie gehabt


Java:
				for (int k = 0; k==7 || k==c; k=d+e)
				{
					d = StdRandom.discrete(w);
					e = StdRandom.discrete(w);
					k = d + e;
					z =k;

				}

edit1:aber ihr seht ja ich sitze hie rununterbrochen dran habe sogar schon die lösung mit random discrete und modular habe ich es auch scon vorbereitet nur finde ich einafch nicht den fehler in der for schleife für den sampledurchlauf und ohne dies funktioiert ja gar nicht ???:L

wäre echtd ankbar für eine funktionierende lösung ;)
aber möchte auch keinen drängen ;)


edit2: so sieht mein aktuelles prog aus es terminiert wie gesagt nur mit 0.0 gewinn und 0.0 verlust mit der for schleife:
Java:
public class Craps 
{
	public static int wurf (double[]w)
	{
		int a = StdRandom.discrete(w);
		return a;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
	
		//variable für durchläufe /samplerate
		int samplesize = Integer.parseInt(args[0]);
		
		int gewinnrate = 0;
		int verlustrate = 0;
		
		//chance für Wurf bestimmen
		double [] w = {0,.17,.17,.17,.17,.17,.15};
		
		//erste würfe bestimmen
		int a = wurf(w);
		int b = wurf(w);
		/**
		//variablen für weiter würfe bestimmen
		int d = wurf(w);
		int e = wurf(w);
		*/
		//variable für zweiten + weitere würfe
		int z = 0;	
		
	
		// x bestimmen
		double c = a +b;
		
		
		
		//für allgemeine gewinnrate nach samplerate anzahl der würfe = schleifendurchläufe
		for(int i = 0; i < samplesize ; i++)
		{
			//gewonnen / verloren definieren
			if (c == 7 || c == 11 )
			{
				gewinnrate++;
			}
			else if (c == 2 || c == 3 || c == 12)
			{
				verlustrate++;
			}
			//wenn nichts von beiden eintrifft
			else if (c == 1 || c == 4 || c == 5 || c == 6 ||c == 8 || c == 9 ||c == 10 || c == 0 )
			{	
				//solange werfen bis wurf c oder sieben ergibt
				/**
				while (z != 7 || z!= c)
				{
					d = wurf(w);
					e = wurf(w);
					z = d + e;	
				}
				*/
				for (int k = 0; k==7 || k==c; k=a+b)
				{
					a = wurf(w);
					b = wurf(w);
					k = a + b;
					z =k;
				}
				
				if(z ==7)
				{
					verlustrate++;
				}
				
				else if(z == c)
				{
					gewinnrate++;
				}
				
			
			}
			//neuen ersten wurf bestimmen
			a = wurf(w);
			b = wurf(w);
			c = a +b;
		}
		
		// verlust / gewinnrate prozentual bestimmen
		double gewinn = (gewinnrate/samplesize)*100;
		double verlust = (verlustrate/samplesize)*100;
		
		System.out.println("Gewinnrate bei " + samplesize + " Durchläufen beträgt: " + gewinn + "%");
		System.out.println("Verlustrate bei " + samplesize + " Durchläufen beträgt: " + verlust + "%");
	}

}
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben