【问题标题】:java simulator simple horse race game using only arrays and loopsjava模拟器简单的赛马游戏只使用数组和循环
【发布时间】:2015-05-30 11:30:31
【问题描述】:

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

}
}

【问题讨论】:

  • 现在是学习如何使用调试器并逐步运行代码以了解问题所在的好时机...
  • "numbers[i] == 4 &amp;&amp; numbers[i] == 5 总是假的" (c)(对于单线程执行)
  • "数组'tracks'的内容被读取,但从未写入"
  • 但是我真的很喜欢你的“钱”标签!

标签: java arrays loops simulator currency


【解决方案1】:

您的模拟存在几个问题。

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

  2. 不过,您可能想知道为什么它总是获胜。毕竟,如果horses - 1 一匹完成但另一匹先完成,那么您最后的打印循环应该看到另一匹马。这可能是因为您实际上给了所有马匹前进的机会很小。

    马有 50% 的机会前进一步(numbers[i] 介于 1 和 3 之间)。然后他们有 33% 的人根本没有进步(numbers[i] 是 4 或 5,但你要求 numbers[i] == 4 &amp;&amp; numbers[i] == 5,它不能同时是两者,所以这个 if 永远不会输入)。他们有 16% 的机会前进 5 步。所以大多数时候,其他马的前进速度与horses - 1 马一样多或少。如果您将该条件更改为 || 而不是 &amp;&amp;,即使您不纠正您的 while 条件(但您当然应该纠正它),您也更有可能看到另一匹获胜的马。

  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;
        }
    }
    

当然,最重要的是循环条件和||

【讨论】:

  • 好的,先生!我会记住这一点!抱歉,这是我第一次编程。
【解决方案2】:

while 循环中的条件:

while (move[horses-1] < tracks.length)

意味着一旦最后一匹马(其索引为horses-1)完成,循环将结束。您应该更改条件以在任何马完成时结束循环。

每当您更新move[i] 时,您应该测试是否为move[i]&gt;=tracks.length,如果是,请将某个布尔变量设置为true - ended = true;

然后将循环的条件改为while (!ended)

【讨论】:

  • ...或者使用更简单的循环:while(true) { ... if(ended) { break; } ... }
  • 哦!我懂了!这就是为什么最后一匹马总是跑完的原因。
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 2017-02-10
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
相关资源
最近更新 更多