Java et algorithme pour position unique

Le problème exposé dans ce sujet a été résolu.

Bonjour j’ai conçu un algorithme pour mettre un objet à une position unique sur la map mais il ne fonctionne pas, pourriez-vous m’aider ?

// si alone == true, ça signifique que l'objet sera placé à un emplacement vide
boolean alone;

// On retient les positions (oldX, oldY) où se trouvent déjà un objet
ArrayList<Integer> oldX = new ArrayList<>();
ArrayList<Integer> oldY = new ArrayList<>();

// Pour chaque objet o du niveau actuel
for (GameObject o: level.getObjects()) {
    alone = false;
    int posX = Random(SIZE_X);
    int posY = Random(SIZE_Y);
    
    while (!alone) {
        alone = true;
        for (int j = 0; j < oldX.size(); j++) {
            
            // si il existe un object déjà à la position (posX, posY)
            if (oldX.get(j) == posX && oldY.get(j) == posY) {
                alone = false;
                
                // Refaire un nouvel essai
                posX = Random(SIZE_X);
                posY = Random(SIZE_X);
                break;
            }
        }
    }
    // Ici on est certain que alone == true, donc que l'emplacement est libre pour y poser l'objet o
    o.setPos(posX, posY);
}

Il compile mais je trouve encore parfois deux objets à la même position!!

Salut,

Une fois ton objet placé (ligne 38), tu n’ajoutes pas sa position dans tes listes oldX et oldY.

En passant, tu pourrais créer une classe Point avec deux membres x et y histoire de factoriser un peu tes positions et comme ça, tu n’as qu’une liste.

De plus, un nombre entier aléatoire en Java, cela se génère de la façon suivante:

import java.util.Random;

Random r = new Random();
int n = r.nextInt(50); // Entre 0 et 49
+2 -0

Bonjour si vous êtes curieux voici la dernière version "optimisée" de l’algorithme mais je ne garantis pas qu’il soit 100% parfait:

// On retient les emplacements où se trouve déjà un objet
ArrayList<Integer> oldX = new ArrayList<>();
ArrayList<Integer> oldY = new ArrayList<>();

for (GameObject o: level.getObjects()) {
    int j = 0;
    int posX = MyRandom(Level.SIZE_X - 1);
    int posY = MyRandom(Level.SIZE_Y - 1);
    
    while (j < oldX.size()) {
        if (oldX.get(j) == posX && oldY.get(j) == posY) {
            // On retente une nouvelle position aléatoire
            j = -1;
            posX = MyRandom(Level.SIZE_X - 1);
            posY = MyRandom(Level.SIZE_Y - 1);
        }
        j++;
    }
    
    o.setPos(posX, posY);
    oldX.add(posX);
    oldY.add(posY);
}

private static int MyRandom(int n) {
    return(int)(Math.random() * (n + 1));
}
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte