Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给出错误数字的骰子程序_Java - Fatal编程技术网

Java 给出错误数字的骰子程序

Java 给出错误数字的骰子程序,java,Java,在课堂上,我们学习了一些使用随机数生成来帮助玩骰子游戏的源代码。我们在课堂上讲过的基本游戏规则可以总结如下。第一轮骰子以赢或输或要求继续掷骰子结束。如果第一卷是7或11,那就是胜利。如果第一卷是2、3或12,则为损失。对于任何其他总点数,您必须重新掷骰子,直到您重复该点数或掷7为止。如果一次重播产生7分,则为损失。如果一次重击得到一分,那就是胜利。如果两种情况都没有发生,则必须继续重新催促。源代码在课程网站的示例部分可见。该程序名为crasgame.java。对于这个问题,您将使用基本游戏代码来

在课堂上,我们学习了一些使用随机数生成来帮助玩骰子游戏的源代码。我们在课堂上讲过的基本游戏规则可以总结如下。第一轮骰子以赢或输或要求继续掷骰子结束。如果第一卷是7或11,那就是胜利。如果第一卷是2、3或12,则为损失。对于任何其他总点数,您必须重新掷骰子,直到您重复该点数或掷7为止。如果一次重播产生7分,则为损失。如果一次重击得到一分,那就是胜利。如果两种情况都没有发生,则必须继续重新催促。源代码在课程网站的示例部分可见。该程序名为crasgame.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);



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

而不是滚动=0;你应该做rolls=1;因为你刚刚在这一点上进行了第一次掷骰。 您的do循环始终至少执行一次,也就是说,即使在循环前的第一次掷骰中确定了赢或输。改用while循环。 你正在做总计=总计+转鼓;在你的内部循环中,也就是说,太频繁了,所以你最终得到了一个太高的总数。而是在代码中的while循环之后执行。 我的意思是我在评论中所说的:mypoint持有你第一卷的分数。你想在这一次之前得到掷骰的点数。作为while循环中的最后一条语句,insert mypoint=d1+d2;从你刚才的掷骰中获取点数。 您仅在for循环之后才增加Numwins或Numlosses,因此仅计算最后一场比赛。将其移动到for循环中。 最后,正如我在另一条评论中所说的,在除法之前将数字转换为double以获得浮点除法,例如probwin=double Numwins/double time;从技术上讲,在其中一个数字之前加上double就足够了,但我认为如果你把它放在两个地方,会更清楚发生了什么。 一般提示:

在需要变量之前不要声明它。它使代码更可读,错误更少。例如,如果您在For循环内声明了win,而您需要它,那么您不可能只在For循环外测试它。 保持缩进正确。这样就更容易确定某个语句是在某个循环内还是在某个循环外,并在语句位于错误位置时发现错误。IDE可以通过按键为您进行缩进。
最后,您没有问这个问题,但请允许我提一下:您的程序包含许多正确的东西,错误实际上是细节。很容易遵循您的意图,这在编程中很重要,当然并非总是如此。保持这种方式,您会做得很好。

欢迎使用堆栈溢出。在请求调试帮助时,请始终,始终精确地说明结果与所需结果的差异。错误的数字太模糊了。打印您赢或输以及更新numWins和numLosses的代码需要在for循环中-否则无论您玩多少游戏,它只记录1个赢或输。您正在进行整数除法。我也想要结果的分数部分,在除法之前转换成双倍,例如双倍总数/双倍时间。我还有一个问题,先生们。在第二次掷骰时,如果用户掷的数字和之前相同,他们应该赢得这场比赛。虽然我的代码说mypoint=d1+d2,但我的程序忽略了这一点。它只确定用户在掷骰时的损失。目前,我相信myPoint持有您第一次掷骰的点数。你想在这一次之前得到掷骰的点数。在适当的点插入赋值语句。当再次滚动时{…}可以使用或不使用==true;按照惯例,这是被忽略的。您仍然有rollReach=false;在环路内的两个地方,对吗?这迟早会停止循环,否则就出了问题。先生,还有一个问题!!你帮了我很大的忙,还有一个问题,siri更新了我的代码,问题是它没有计算赢和输的数量,这意味着Numwins++和Numlosses++不起作用。而且这并不包括你更新的程序中获胜的概率
只有在第一轮决定胜负时,你才增加Numwins和numloss。你也应该在if-win-else语句中这样做,这样你就可以抓住需要更多掷骰子才能决定胜负的情况。天哪,谢谢你。另一个问题xd。我打了两场比赛,一胜一负,赢的概率应该是50%,对吗?但是它给了我0%怎么了?????????