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);
}
}
}
}
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)
.
Il y a plusieurs problèmes avec votre simulation.
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.-
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 lehorses - 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). Cette boucle à la fin n'est pas vraiment nécessaire. Lorsque vous gardez votre
ended
boolean, vous pouvez également garder unint winner
eti
du cheval fini. Ensuite, vous n'avez pas à boucler, donnez simplement les résultats pour cewinner
particulier.Votre
tracks
variable est un tableau, mais vous ne sont pas réellement l'utiliser. Vous utilisez uniquement le tableaumoves
pour les chevaux. Donc, vous devriez vraiment garder un simpleint
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?-
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.