2016-11-12 2 views
0

Das ist mein Code Ich soll das Spiel Craps simulieren: Ich bekomme den richtigen Gewinn und Verluste herauskommen, aber ich kann die Wahrscheinlichkeit nicht richtig bekommen. irgendwelche Vorschläge?Eine Simulation das Spiel Craps Java

bitte helfen Sie die Anweisungen sind: In dem Spiel Craps, eine Pass Line Wette geht wie folgt. Zwei sechsseitige Würfel werden gerollt; Der erste Würfelwurf in einer Würfelrunde wird "Come Out Roll" genannt. Ein Come-Out-Wurf von 7 oder 11 gewinnt automatisch und ein Come-Out-Wurf von 2, 3 oder 12 verliert automatisch. Wenn 4, 5, 6, 8, 9 oder 10 auf dem Come Out Roll gerollt werden, wird diese Zahl zum Punkt. Der Spieler würfelt weiter, bis entweder 7 oder der Punkt gewürfelt wird. Wenn der Punkt zuerst gewürfelt wird, gewinnt der Spieler den Einsatz. Wenn zuerst eine 7 gewürfelt wird, verliert der Spieler. Schreiben Sie ein Programm, das ein Craps-Spiel simuliert, indem Sie diese Regeln ohne menschliche Eingabe verwenden. Anstatt nach einer Wette zu fragen, sollte das Programm berechnen, ob der Spieler gewinnen oder verlieren würde.

Das Programm sollte das Rollen der beiden Würfel simulieren und die Summe berechnen. Fügen Sie eine Schleife hinzu, so dass das Programm 10.000 Spiele spielt. Fügen Sie Zähler hinzu, die zählen, wie oft der Spieler gewinnt und wie oft der Spieler verliert. Am Ende der 10.000 Spiele, berechnen Sie die Wahrscheinlichkeit zu gewinnen [d. H. Gewinne/(Gewinne + Verluste)] und geben Sie diesen Wert aus. Wer wird auf lange Sicht die meisten Spiele gewinnen, Sie oder das Haus? Hinweis: Um eine Zufallszahl x zu generieren, wobei 0 x ≤ < 1, verwenden Sie x = Math.random(); . Zum Beispiel Multiplikation mit 6 und die Umwandlung zu einer ganzen Zahl ergibt eine ganze Zahl, die zwischen 0 und 5.

public class Dice 
{ 
    public static void main(String[]args) 
    { 
     //declaring variables 
     int comeOutRoll1, comeOutRoll2; 
     int roll1, roll2; 
     int numW, numL; 
     int sum, sum2 = 0; 
     int thePoint = 0; 
     double probability; 


     //initializing variables 
     comeOutRoll1 = (int)(Math.random()*5); 
     comeOutRoll2 = (int)(Math.random()*5); 
     sum = comeOutRoll1 + comeOutRoll2; 
     numW = 0; 
     numL = 0; 


     for(int timesPlayed = 0; timesPlayed <= 10000; timesPlayed++) 
     { 

      switch(sum) 
      { 
      //adds how many wins and losses 
      case 2: 
       numL = numL +1; 
       break; 
      case 3: 
       numL = numL + 1; 
       break; 
      case 12: 
       numL = numL + 1; 
      break; 
      case 7: 
       numW = numW +1; 
       break; 
      case 11: 
       numW = numW +1; 
       break; 
      case 4: 
       thePoint = sum; 
       break; 
      case 5: 
       thePoint = sum; 
       break; 
      case 6: 
       thePoint = sum; 
       break; 
      case 8: 
       thePoint = sum; 
       break; 
      case 9: 
       thePoint = sum; 
       break; 
      case 10: 
       thePoint = sum; 
      break; 
      //if not any of these cases roll again 
      default: 

       roll1 = (int)(Math.random()*5); 
       roll2 = (int)(Math.random()*5); 
       sum2 = roll1 + roll2; 
       break; 
      } 

      if(sum2 == thePoint) 
      { 
       numW = numW +1; 
      } 
      else if(sum2 == 7) 
      { 
       numL = numL +1; 
      } 
     } 


     probability = (numW/(numW+numL)); 

     System.out.println("Number of Wins: " + numW); 
     System.out.println("Number of Losses: " + numL); 
     System.out.println("The probability of winning is: " + probability + " percent"); 


    } 

} 
+1

Randbemerkung: Sie vermeiden können, indem er mehr 'case' Aussagen den gleichen Code für verschiedene Fälle Abtippen ohne' break', wie: 'Fall 4: Fall 5: Fall 6: Fall 8: Fall 9: Fall 10: thePoint = Summe; Pause; '. – BackSlash

+0

Sooooo? Welche Ausgabe erhalten Sie, welche Ausgabe erwarten Sie? Ie., was ist die eigentliche Frage? – Gumbo

+0

Sehr stimulierend diese Simulation ...;) – martijnn2008

Antwort

-1

Edited Arbeitslösung

public static void main(String[]args) 
{ 
    //declaring variables 
    int roll1, roll2; 
    int numW = 0; 
    int numL = 0; 
    int sum = 0; 
    int thePoint = 0; 
    double probability; 


    // Loop will run 1001 time due to <= 
    for(int timesPlayed = 0; timesPlayed <= 1000; timesPlayed++) 
    { 
     roll1 = (int)(Math.random()*5)+1; 
     roll2 = (int)(Math.random()*5)+1; 
     sum = roll1 + roll2; 

     switch(sum) 
     { 
      //adds how many wins and losses 
      case 2: 
      case 3: 
       numL = numL + 1; 
       break; 
      case 12: 
       numL = numL + 1; 
      break; 
      case 7: 
      case 11: 
       numW = numW +1; 
       break; 
      case 4: 
      case 5: 
      case 6: 
      case 8: 
      case 9: 
      case 10: 
       thePoint = sum; 
       break; 
      default: 
       // You should never logically reach here, so could remove. 
     } 

     if(thePoint!=0){ 
      do{ 
       roll1 = (int)(Math.random()*5)+1; 
       roll2 = (int)(Math.random()*5)+1; 
       sum = roll1 + roll2; 
      }while(sum!=thePoint & sum!=7); 

      if(sum == thePoint) 
      { 
       numW = numW +1; 
      }else{ 
       numL = numL +1; 
      } 
     } 
     thePoint = 0; 
    } 

    probability = (double)numW/(numW+numL); // (numW + numL) could just be total number of games if made into a variable and used as for loop condition aswell. 

    System.out.println("Number of Wins: " + numW); 
    System.out.println("Number of Losses: " + numL); 
    System.out.println("The probability of winning is: " + probability + " percent"); 

    } 

Sie zu haben ist:

  • Schließen Sie die Wiederholungen ein, wenn Sie Schleifen verwenden, andernfalls hätte es dieselben wiederholten Werte verwendet.
  • Wenn es der Fall von 4,5,6,8,9 oder 10 war, dann mussten Sie weiter rollen, bis neue Rolle 7 oder thePoint gleichkam.
    • Wenn die Wahrscheinlichkeit ausarbeitet, tat Sie Integer-Division, die in Rundung von 0.

Arbeiten nach Spezifikation führen könnte. Einige Aufräumen von Variablen.

+1

Und das OP lernt nichts. – stdunbar

1

2 Probleme ...

  1. Sie analysieren nur 1 (random) herausgekommenen Rolle. Sie müssen 10000-mal über das ganze Spiel schlingen, nicht nur die sekundären Rollen, die nur geloopt werden sollten, bis Sie ein Ergebnis erhalten.
  2. Sie tun Integer Division (die abgeschnitten, um eine ganze Zahl zu verlassen). Verwenden Sie stattdessen Fließkomma-Mathematik, indem Sie eine der Zahlen an float oder double übergeben. probability = (float)numW/(numW+numL); IE

In Pseudo-Code, mit Hilfsmethoden:

// returns the random integer between 1 and 6 inclusive 
method rollDie() 

// returns the sum of a random roll of 2 dice 
method rollDice() 
    return rollDie() + rollDie() 

// return true if the player won given the point 
method won(point) 
    roll = rollDice() 
    if roll == 7 return false 
    if roll == point return true 
    return won(point) 

// main 
define wins variable (you don't need a losses variable. losses = 10000 - wins 
loop 10000 times { 
    comeOut = rollDice() 
    if comeOut in (7, 11) or (comeOut not in (2, 3 or 12) and won(comeOut)) 
     wins++ 
} 
probability = (float)wins/10000 

umrechnen oben auf Java und Sie sollten gut gehen (und Sie werden hoffentlich etwas lernen - siehe DRY).

+0

wie würde ich die Schleife über das ganze Spiel nicht nur die zweite Rolle erweitern? – Olivia

+0

@Olivia siehe bearbeitet Antwort für wie (und viel Spaß) – Bohemian