java simulator jeu de course de chevaux simple en utilisant uniquement des tableaux et des boucles


J'essaie de faire un simple jeu de course de chevaux java simulator en utilisant uniquement des tableaux et des boucles. Mon programme était presque terminé. Mon seul problème est que lorsque vous entrez le nombre de chevaux qui se joindront au concours, ce nombre particulier que vous entrez gagnera même si d'autres chevaux sont finis. Exemple, lorsque vous tapez 5 chevaux qui se joindront au concours, ce numéro "5" gagnera même si l'autre numéro a terminé premier. je ne peux pas vraiment déterminer le gagnant. Mon programme semble bien fonctionner. Tout des conseils seraient appréciés. Merci!!!! Voici mon code:

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

}
}
Author: Jeb Arcede, 2015-03-26

2 answers

La condition dans votre boucle while:

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

Signifie que la boucle se terminera une fois le dernier cheval (dont l'index est horses-1) terminé. Vous devez changer la condition pour terminer la boucle lorsque tout cheval se termine.

Chaque fois que vous mettez à jour move[i], vous devez tester si move[i]>=tracks.length, et si c'est le cas, définissez une variable booléenne sur true - ended = true;.

Puis changez la condition de la boucle en while (!ended) .

 4
Author: Eran, 2015-03-26 12:41:58

Il y a plusieurs problèmes avec votre simulation.

  1. Comme @Eran l'a dit, votre problème le plus grave est la condition de résiliation. La boucle s'arrête lorsque le cheval en position horses - 1 termine, même si d'autres chevaux gagnaient réellement.

  2. Vous vous demandez peut-être pourquoi il a toujours été gagnant, cependant. Après tout, votre boucle d'impression à la fin aurait dû voir un autre cheval si le horses - 1 avait fini mais que l'autre avait fini en premier. C'est probablement parce que vous en fait tous les chevaux très peu de chance d'avancer.

    Les chevaux ont 50% de chances d'avancer d'un pas (numbers[i] est entre 1 et 3). Ensuite, ils ont 33% de ne pas avancer du tout ( numbers[i] est 4 ou 5, mais vous avez demandé numbers[i] == 4 && numbers[i] == 5, et il ne peut pas être les deux en même temps, donc ce si n'est jamais entré). Ils ont 16% de chances d'avancer 5 étapes. Donc, la plupart du temps, les autres chevaux avancent autant ou moins que le horses - 1 cheval. Si vous changez cette condition en || au lieu de &&, il y a plus de chances que vous voyiez un autre cheval gagnant même si vous ne corrigez pas votre condition while (mais vous devriez le corriger, bien sûr).

  3. Cette boucle à la fin n'est pas vraiment nécessaire. Lorsque vous gardez votre ended boolean, vous pouvez également garder un int winner et i du cheval fini. Ensuite, vous n'avez pas à boucler, donnez simplement les résultats pour ce winner particulier.

  4. Votre tracks variable est un tableau, mais vous ne sont pas réellement l'utiliser. Vous utilisez uniquement le tableau moves pour les chevaux. Donc, vous devriez vraiment garder un simple int qui dit quelle est la longueur de la piste, parce que c'est la seule chose qui vous intéresse - les chevaux ont-ils fait assez de mouvements pour couvrir toute la longueur de la piste?

  5. Vous n'avez pas non plus besoin du tableau numbers. Vous pouvez faire une boucle sur les chevaux, et rouler un seul numéro pour le cheval actuel, et prendre votre décision en fonction de cela nombre.

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

Les choses les plus importantes sont la condition de boucle et le ||, bien sûr.

 0
Author: RealSkeptic, 2015-03-26 13:06:12