在课堂上,我们研究了一些使用随机数生成的源代码,以帮助玩骰子游戏,称为掷骰子。我们在课堂上介绍的基本游戏规则可归纳如下。骰子的第一卷以赢或输或者继续掷骰子的要求结束。如果第一次掷骰是7或11则是胜利。如果第一卷是2,3或12,则是亏损。对于任何其他总数(被调用的点),你必须重新抛出骰子,直到你重复该点或抛出一个7.如果重新抛出产生7,那就是一个损失。如果重新抛出产生这一点就是胜利。如果两者都不发生,则必须继续重新抛出。源代码在示例部分的课程网站上可见。该程序名为CrapsGame.java。对于这个问题,你将使用基本的游戏代码来运行1000万个游戏的模拟,并从模拟中收集一些统计数据,然后显示结果。
确定然后打印出来的统计信息是:
(这是问题)
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。每场比赛的平均筹码数,胜负数等等都不能很好地运作。它总是给我错误的数字。请帮帮我。
答案 0 :(得分:0)
rolls = 0;
而不是rolls = 1;
,因为您刚刚完成了第一次滚动。do
循环始终至少执行一次,即,即使在循环之前的第一次滚动中确定了输赢。改为使用while
循环。total = total + rolls;
,也就是说,太频繁了,所以你最终得到的总数太高了。而是在while
循环(代码中的do
循环)之后执行此操作。mypoint
保留了你第一次滚动的要点。你想要在此之前的滚动点。作为while
循环中的最后一个语句,插入mypoint = d1 + d2;
以从您刚刚创建的卷中获取点数。Numwins
循环后递增Numlosses
或for
,因此只计算最后一场比赛。请改为在for
循环内移动。double
以获得浮点除法,例如probwin = (double) Numwins / (double) time;
(从技术上讲,它足以把(double)
放在其中一个数字之前,但我认为如果把它放在两个地方会更清楚。)一般提示:
win
循环中声明了for
,那么您可能无法在for
循环之外进行测试。最后,你没有问过这个问题,但是请允许我提一下:你的程序包含许多正确的东西,错误确实是细节。很容易遵循你的意图,这在编程中很重要,当然并非总是如此。保持这种状态,你会做得很好。