1
votes

JAVA, jeu de société. Nombres de dés aléatoires non aléatoires

Je suis nouveau en Java et en écriture de code. Je souhaite programmer un jeu de société simple. Mais si je lance les dés, j'obtiens le même nombre à chaque lancer. Qu'est-ce que j'ai fait de mal?

J'ai une classe pour créer un aléatoire entre 1 et 6:

public class BoardGame{

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String r;
        Dice dice = new Dice();
        int roll = dice.throwDice();
        int position = 0;
        int finish = 40;

        while (finish >= position) {
            do {
                System.out.print("Roll the dice (r): ");
                r = input.nextLine();
            } while (!r.toLowerCase().equals("r"));

            if (r.toLowerCase().equals("r")) {
                System.out.println("You have rolled " + roll + ".");
                position += roll;
                System.out.println("You are now on square " + position + ".");
            }

        }
        System.out.println("You won!");
        input.close();
    }

}

Et la classe principale:

public class Dice {
    public int throwDice() {
        Random random = new Random();
        int dice = random.nextInt(6) + 1;
        return dice;
    }
}

Merci!


3 commentaires

Parce que vous ne donnez pas de nouvelle valeur à la variable roll à l'intérieur de la boucle.


vous ne roulez qu'une seule fois. ou voulez-vous dire entre différents moments exécutant ce code?


Merci, George Z. Je vois maintenant ce que j'ai fait de mal.


4 Réponses :


2
votes

Le code qui obtient un résultat aléatoire:

roll = dice.throwDice();
System.out.println("You have rolled " + roll + ".");

s'exécute exactement une fois. Vous appelez la méthode throw une fois . Vous stockez le résultat, pas un "pointeur" vers une fonction qui serait appelée à plusieurs reprises chaque fois que roll est utilisé quelque part.

Vous devriez donc mettre cette ligne:

XXX

juste en face de l'endroit où vous attendez un autre lancer de dés!


0 commentaires

0
votes

Changez votre classe Dice en ceci.

public class Dice {
    private Random random;
    public Dice(){
        random = new Random();
    }

    public int throwDice(){
        int dice = random.nextInt(6) + 1;
        return dice;
    }
}

Et mettez à jour roll = dice.throwDice (); à l'intérieur de la boucle. Cela fonctionnera car votre Dice a maintenant une instance aléatoire qui génère de nouveaux entiers aléatoires à chaque fois que throwDice () est appelé.


0 commentaires

0
votes

Après avoir ajouté int roll = dice.throwDice (); à votre boucle, vous constaterez peut-être que vous obtenez la même séquence de rôles à chaque fois. Si vous ne le souhaitez pas, vous devrez définir la graine aléatoire.

Voir cette question: Nombres aléatoires Java utilisant une graine


0 commentaires

1
votes
public class Dice {
    private Random random;
    public Dice(){
        random = new Random();
    }

    public int throwDice(){
        int dice = random.nextInt(6) + 1;
        return dice;
    }
}
This will work because your Dice now has one random instance which is generating new random integers everytime throwDice() is called

0 commentaires