骰子程序给出错误的数字

时间:2017-03-08 03:08:10

标签: java

在课堂上,我们研究了一些使用随机数生成的源代码,以帮助玩骰子游戏,称为掷骰子。我们在课堂上介绍的基本游戏规则可归纳如下。骰子的第一卷以赢或输或者继续掷骰子的要求结束。如果第一次掷骰是7或11则是胜利。如果第一卷是2,3或12,则是亏损。对于任何其他总数(被调用的点),你必须重新抛出骰子,直到你重复该点或抛出一个7.如果重新抛出产生7,那就是一个损失。如果重新抛出产生这一点就是胜利。如果两者都不发生,则必须继续重新抛出。源代码在示例部分的课程网站上可见。该程序名为CrapsGame.java。对于这个问题,你将使用基本的游戏代码来运行1000万个游戏的模拟,并从模拟中收集一些统计数据,然后显示结果。

确定然后打印出来的统计信息是:

  • 平均每场比赛次数
  • 单个游戏中使用的最大掷骰数
  • 需要超过30卷的游戏数量
  • 获胜次数
  • 损失数
  • 获胜的概率(显示为小数点后4位)

(这是问题)

public class CrapsGame{


public static void main(String[] args) {

int time; //number of times the game user want to play
int rolls=0; //number of rolls
int mypoint=0; 
int d1; //number user rolled for first dice
int d2; //number user rolled for second dice
int total=0; //total number of rolls 
int Numwins=0; //number of wins
int Numlosses = 0; //number of losses
double averolls=0;  //average number of rolls per game
double probwin=0; //probability of win
boolean win, rollagain=false;                  

win = false;
System.out.println("Enter the number of times the game you want to play: ");
time=TextIO.getlnInt();   

rolls=0;


for (int i=0; i<time; i++){
      d1=(int)(6*Math.random())+1; //user roll dice(generate a random number)
      d2=(int)(6*Math.random())+1;  
      System.out.printf("%d and %d\n",d1,d2);
      rolls++;
      total = total + rolls;
   switch (d1+d2) {
      case 7: 
      case 11:
        win=true; //when first roll is 7 or 11, player win
         Numwins++;
        break;
      case 2: 
      case 3: 
      case 12:
        win=false; //when first roll is 2,3 or 12, player lose
         Numlosses++;
        break;
      default:   
        mypoint = d1 + d2;
        rollagain=true; //when first roll is 1,4,5,6,8,9,10 or 11, player rethrow dice      
   }
        while(rollagain==true){
          d1=(int)(6*Math.random())+1;
          d2=(int)(6*Math.random())+1;
           System.out.printf("%d and %d\n",d1,d2);

      if (d1+d2 == mypoint ){
        win=true;
        rollagain=false;           
      }
      else if ( d1+d2 == 7){
        win=false;
        rollagain=false;  
      }
    }


 if (win){
  System.out.printf("***WINNER***\n");
 }
  else{
  System.out.printf("YOU LOSE\n");


  }



  }


probwin = Numwins / time;
averolls = total / time ;

System.out.printf("Avg # rolls: %.2f\n",averolls);
System.out.printf("Max # rolls: %d\n",rolls);
System.out.printf("# of wins: %d\n",Numwins);
System.out.printf("# of losses: %d\n",Numlosses);
System.out.printf("The probability of a win: %.2f.\n",probwin);



}
}

以下是问题先生们! 我的程序可以运行,但计算部分,每个单独的计算部分ex。每场比赛的平均筹码数,胜负数等等都不能很好地运作。它总是给我错误的数字。请帮帮我。

1 个答案:

答案 0 :(得分:0)

  • 您应该rolls = 0;而不是rolls = 1;,因为您刚刚完成了第一次滚动。
  • 您的do循环始终至少执行一次,即,即使在循环之前的第一次滚动中确定了输赢。改为使用while循环。
  • 你在内循环中正在进行total = total + rolls;,也就是说,太频繁了,所以你最终得到的总数太高了。而是在while循环(代码中的do循环)之后执行此操作。
  • 我的意思是我在评论中说的话:mypoint保留了你第一次滚动的要点。你想要在此之前的滚动点。作为while循环中的最后一个语句,插入mypoint = d1 + d2;以从您刚刚创建的卷中获取点数。
  • 您只在Numwins循环后递增Numlossesfor,因此只计算最后一场比赛。请改为在for循环内移动。
  • 最后,正如我在其他评论中所述,在划分之前将您的数字转换为double 以获得浮点除法,例如probwin = (double) Numwins / (double) time;(从技术上讲,它足以把(double)放在其中一个数字之前,但我认为如果把它放在两个地方会更清楚。)

一般提示:

  • 在您需要之前不要声明变量。它使代码更易读,错误更少。例如,如果您在win循环中声明了for,那么您可能无法在for循环之外进行测试。
  • 保持缩进正确。然后,更容易确定某个语句是在某个循环内部还是外部,并且在语句位于错误位置时发现错误。您的IDE可以通过按键为您缩进。

最后,你没有问过这个问题,但是请允许我提一下:你的程序包含许多正确的东西,错误确实是细节。很容易遵循你的意图,这在编程中很重要,当然并非总是如此。保持这种状态,你会做得很好。