我正在尝试使用数组和循环制作一个简单的Java模拟器赛马游戏。我的节目差不多完了。我唯一的问题是,当您输入参加比赛的马匹数量时,即使其他马匹已经完成,您输入的特定数字也将获胜。例如,当您输入将参加比赛的5匹马时,即使其他数字先完成,“5”号也会获胜。我无法确定胜利者。我的程序似乎运作良好。任何意见,将不胜感激。谢谢! 这是我的代码:
public static void main(String[] args) throws InterruptedException {
Scanner input = new Scanner(System.in);
int[] tracks = new int[70];
int bet;
System.out.println("==============");
System.out.println("||HORSE RACE||");
System.out.println("==============");
System.out.println("WHO'S GONNA WIN IN THIS EPIC RACE?");
System.out.println("ENTER HOW MANY HORSES WOULD YOU LIKE TO JOIN:"
+ "\n 2-10 HORSES are allowed to join!");
int horses;
do {
horses = input.nextInt();
} while (horses < 2 || horses > 10);
int[] move = new int[horses];
double[] betHorse = new double[horses];
System.out.println("Enter how many person will bet?");
int number = input.nextInt();
for (int i = 1; i <= number; i++) {
do {
for (int j = 1; j <= horses; j++) {
System.out.println("[" + j + "]" + " for HORSE " + j);
}
System.out.println("Person no." + i + ": Enter the number of horse:");
bet = input.nextInt();
} while (bet < 1 || bet > horses);
for (int p = 1; p <= horses; p++) {
if (bet == p) {
System.out.println("Enter the amount of your bet?");
betHorse[bet - 1] += input.nextDouble();
}
}
for (int j = 1; j <= horses; j++) {
System.out.println("Bet for HORSE " + j + ":P" + betHorse[j - 1]);
}
}
System.out.println("OKAY THAT'S SETTLED");
System.out.println("Race begins in:");
int num3 = 3;
for (int i = 1; i <= num3; num3--) {
System.out.println(num3);
Thread.sleep(1000);
}
do {
Thread.sleep(100);
int[] numbers = new int[horses];
for (int i = 0; i < horses; i++) {
numbers[i] = 1 + (int) (Math.random() * 6);
}
for (int i = 0; i < horses; i++) {
if (numbers[i] >= 1 && numbers[i] <= 3) {
move[i]++;
} else if (numbers[i] == 4 && numbers[i] == 5) {
move[i] = move[i] + 3;
} else if (numbers[i] == 6) {
move[i] = move[i] + 5;
}
}
System.out.println("\n\n\n");
for (int i = 1; i <= horses; i++){
System.out.println("Horse " + i +" position:" + move[i-1]);
}
for (int i = 1; i <= horses; i++) {
for (int j = 0; j < move[i - 1]; j++) {
System.out.print("--");
}
System.out.println(i + "H" + move[i - 1]);
}
} while (move[horses-1] < tracks.length );
for (int i = 1; i <= horses; i++) {
if (move[i - 1] > tracks.length) {
System.out.println("HORSE " + i + " finished the track! One who bets for HORSE " + i + " won P" + betHorse[i - 1] * 2);
}
}
}
}
答案 0 :(得分:4)
你的while循环中的条件:
while (move[horses-1] < tracks.length)
表示循环将在最后一匹马(其索引为horses-1
)结束后结束。当马完成时你应该改变条件以结束循环。
每当您更新move[i]
时,您应该测试move[i]>=tracks.length
是否为ended = true;
,如果是,请将某个布尔变量设置为true - while (!ended)
。
然后将循环的条件更改为{{1}}。
答案 1 :(得分:0)
您的模拟存在一些问题。
正如@Eran所说,你最严重的问题是终止条件。即使其他马匹实际获胜,当horses - 1
位置的马完成时,循环也会停止。
你可能想知道为什么它总是赢。毕竟,如果horses - 1
一个完成但另一个完成第一个,那么最后的打印循环应该看到另一匹马。这可能是因为你实际上让所有马匹都没有机会前进。
马匹有50%的几率前进一步(numbers[i]
在1到3之间)。然后他们有33%没有前进(numbers[i]
是4或5,但你要求numbers[i] == 4 && numbers[i] == 5
,并且它不能同时是两个,所以这个if if never all both) 。他们有16%的几率推进5步。因此,大多数时候,其他马匹的进展程度与horses - 1
马匹相同或更低。如果你将这个条件更改为||
而不是&&
,即使你没有纠正你的条件,你也会有更高的机会看到另一匹获胜的马(但是你应该纠正它,当然)。
最后那个循环真的没必要。当你保留ended
布尔值时,你也可以保留int winner
并将其设置为已完成的马的i
。然后你不必循环,只需给出特定winner
的结果。
您的tracks
变量设置为数组,但实际上并未使用它。您只对马匹使用moves
数组。所以你应该保持一个简单的int
来说明赛道的长度是什么,因为这是你唯一感兴趣的东西 - 马匹是否有足够的动作来覆盖赛道的整个长度?
您也不需要numbers
数组。您可以循环骑马,为当前的马匹输入一个数字,然后根据该数字做出决定。
for (int i = 0; i < horses; i++) {
int die = 1 + (int)(Math.random()*6);
if (die >= 1 && die <= 3) {
move[i]++;
} else if (die == 4 || die == 5) { // Note the || condition
move[i] = move[i] + 3;
} else { // Note that 6 is the only possibility remaining
move[i] = move[i] + 5;
}
}
最重要的是循环条件和||
,当然。