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

时间:2015-03-26 12:37:27

标签: java arrays loops simulator currency

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

}
}

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)

您的模拟存在一些问题。

  1. 正如@Eran所说,你最严重的问题是终止条件。即使其他马匹实际获胜,当horses - 1位置的马完成时,循环也会停止。

  2. 你可能想知道为什么它总是赢。毕竟,如果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马匹相同或更低。如果你将这个条件更改为||而不是&&,即使你没有纠正你的条件,你也会有更高的机会看到另一匹获胜的马(但是你应该纠正它,当然)。

  3. 最后那个循环真的没必要。当你保留ended布尔值时,你也可以保留int winner并将其设置为已完成的马的i。然后你不必循环,只需给出特定winner的结果。

  4. 您的tracks变量设置为数组,但实际上并未使用它。您只对马匹使用moves数组。所以你应该保持一个简单的int来说明赛道的长度是什么,因为这是你唯一感兴趣的东西 - 马匹是否有足够的动作来覆盖赛道的整个长度?

  5. 您也不需要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;
        }
    }
    
  6. 最重要的是循环条件和||,当然。