java模拟器只使用数组和循环的简单赛马游戏

java模拟器只使用数组和循环的简单赛马游戏,java,arrays,loops,simulator,currency,Java,Arrays,Loops,Simulator,Currency,我正在尝试只使用数组和循环来制作一个简单的java模拟器赛马游戏。我的节目快结束了。我唯一的问题是,当你输入将参加比赛的马的数量时,即使其他马完成了比赛,你输入的特定数量也将获胜。例如,当您键入5匹将参加比赛的马时,该“5”数字将获胜,即使其他数字先完成。我真的不能确定胜利者。我的程序似乎运行得很好。如有任何建议,将不胜感激。非常感谢。 这是我的密码: public static void main(String[] args) throws InterruptedException {

我正在尝试只使用数组和循环来制作一个简单的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);
        }
    }

}
}
publicstaticvoidmain(String[]args)抛出InterruptedException{
扫描仪输入=新扫描仪(System.in);
int[]轨道=新int[70];
int-bet;
System.out.println(“=========================”);
System.out.println(“| |赛马| |”);
System.out.println(“=========================”);
谁将在这场史诗般的比赛中获胜;
System.out.println(“输入您希望加入多少匹马:”
+“\n允许2-10匹马加入!”);
内特马;
做{
horses=input.nextInt();
}而(马<2 | |马>10);
int[]移动=新int[马];
双人[马]=新双人[马];
System.out.println(“输入下注人数?”);
int number=input.nextInt();

对于(int i=1;iwhile循环中的条件:

while (move[horses-1] < tracks.length)
while(移动[horses-1]
意味着循环将在最后一匹马(其索引为
horses-1
)完成后结束。您应该更改条件以在任何马完成时结束循环

无论何时更新
move[i]
,都应该测试
move[i]>=tracks.length
,如果是,则将一些布尔变量设置为true-
end=true;


然后将循环的条件更改为
,而(!end)

模拟中存在几个问题

  • 正如@Eran所说,最严重的问题是终止条件。当
    马-1
    位置的马结束时,循环停止,即使其他马实际上赢了

  • 你可能想知道为什么它总是赢。毕竟,如果
    马-1
    一匹完成了,而另一匹先完成了,那么你在最后的打印循环应该会看到另一匹马。这可能是因为你实际上给了所有的马很少的前进机会


    马有50%的几率前进一步(
    numbers[i]
    在1和3之间)。然后它们有33%的几率根本不前进(
    numbers[i]
    是4或5,但你要求的是
    numbers[i]==4和&numbers[i]==5,而且不能同时前进两步,因此如果从未输入此项)。他们有16%的几率前进5步。因此,大多数情况下,其他马的前进速度与
    马-1
    马相同或更小。如果你将该条件改为
    |
    ,而不是
    &&
    ,那么即使你不纠正你的while条件,你也有更高的几率看到另一匹获胜的马(当然,你应该纠正它)

  • 结束时的循环实际上是不必要的。当您保持
    结束
    布尔值时,您还可以保留一个
    int winner
    ,并将其设置为完成的马的
    i
    。然后您不必循环,只需给出特定
    winner
    的结果

  • 你的
    tracks
    变量被设置为一个数组,但你实际上并没有使用它。你只是在马身上使用
    moves
    数组。所以你真的应该保留一个简单的
    int
    来说明轨迹的长度,因为这是唯一有趣的事情你-让马有足够的mov要覆盖整个赛道长度吗

  • 您也不需要
    数字数组。您可以在马上循环,为当前马滚动一个数字,并根据该数字做出决策

    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;
        }
    }
    
    for(int i=0;i如果(die>=1&&die Now将是学习如何使用调试器并逐步运行代码以了解问题所在的好时机……
    numbers[i]==4&&numbers[i]==5始终为false”(c)(对于单线程执行)“读取数组“tracks”的内容,但从不写入”但是我真的很喜欢你的“钱”标签!…或者使用一个更简单的循环:
    while(true){
    ..
    if(end){break;}
    ..
    }
    哦!我明白了!这就是为什么最后一匹马总是跑完的原因。好的,先生!我会记住的!对不起,这是我第一次编程。