slide puzzle javascript problème fin du mélange aléatoire

Comment faire pour régler mon problème de mélange aléatoire de sprites pour un slide puzzle en javascript ?

J’essaie de créer un slide puzzle en partant de zéro, pour le départ, j’ai une base de javascript qui fonctionne très bien pour placer mes 16 sprites ou je veux, dans l’ordre que je veux, au format demandé et après un délai d’attente de 5 secondes le mélange aléatoire se lance pendant 3 secondes.

Quel est le résultat attendu ?

Que la fin du mélange soit correct

Quel est le résultat actuel ?

A la fin du mélange, certains sprites disparaissent et d’autres se multiplient

Captures d’écran

Je ne peux poster qu’une seule photo alors désolé copier coller du code …
runtimeScene.setBackgroundColor(0,0,0);
// Créer et initialiser p1 à p16 une seule fois
let pieces = ;
for (let i = 1; i <= 16; i++) {
let piece = runtimeScene.createObject(“p” + i);
piece.setZOrder(1); // Définir l’ordre z à 1
piece.getVariables().get(“visible”).setNumber(0); // Cacher l’objet
pieces.push(piece);
runtimeScene.addObject(piece); // Ajouter l’objet à la scène
}
// Utiliser le tableau de pièces pour initialiser le tableau de puzzle
let tableau = [[pieces[0], pieces[4], pieces[8], pieces[12]], [pieces[1], pieces[5], pieces[9], pieces[13]], [pieces[2], pieces[6], pieces[10], pieces[14]], [pieces[3], pieces[7], pieces[11], pieces[15]]];
for (let i = tableau.length - 1; i >= 0; i–) {
for (let j = tableau[i].length - 1; j >= 0; j–) {
let sprite = tableau[j][i];
sprite.setX(i * 100 + 160); // Ajustez la valeur en fonction de la nouvelle taille de vos sprites
sprite.setY(j * 100 + 380); // Ajustez la valeur en fonction de la nouvelle taille de vos sprites
sprite.setWidth(100); // Définissez la largeur du sprite à 100px
sprite.setHeight(100); // Définissez la hauteur du sprite à 100px
sprite.getVariables().get(“visible”).setNumber(1); // Montrer l’objet
}
}
function melangerPuzzle(tableau) {
let total = tableau.length * tableau[0].length;
let zOrder = 0; // Initialiser l’ordre Z
for (let n = 0; n < total; n++) {
setTimeout(function() {
if (!melangeEnCours) {
return;
}

        let i = Math.floor(Math.random() * tableau.length);
        let j = Math.floor(Math.random() * tableau[i].length);
        let i2 = Math.floor(Math.random() * tableau.length);
        let j2 = Math.floor(Math.random() * tableau[i2].length);

        let temp = tableau[i][j];
        tableau[i][j] = tableau[i2][j2];
        tableau[i2][j2] = temp;

        tableau[i][j].setX(i * 101 + 160);
        tableau[i][j].setY(j * 101 + 380);
        tableau[i][j].setZOrder(zOrder++);  // Ajuster l'ordre Z
        
        tableau[i2][j2].setX(i2 * 101 + 160);
        tableau[i2][j2].setY(j2 * 101 + 380);
        tableau[i2][j2].setZOrder(zOrder++);  // Ajuster l'ordre Z
    }, n * 90);  // Chaque mouvement est décalé de 85 millisecondes
}

}

let melangeEnCours = true;
// Attendez 5 secondes, puis mélangez le puzzle
setTimeout(function() {
melangerPuzzle(tableau);
}, 5000);

// Arrêtez de mélanger le puzzle après 3 secondes
setTimeout(function() {
melangeEnCours = false;
}, 8000);

NEW version et après plusieurs aperçu, elle a l’air fonctionnel !
ne crions pas victoire trop vite, je boucle le projet avant :o)

function melangerPuzzle(tableau) {
let total = tableau.length * tableau[0].length;
let zOrder = 1; // Réinitialiser l’ordre Z à 1 après chaque mélange
let melanges = total * 2; // Nombre de fois que le mélange sera effectué

for (let n = 0; n < melanges; n++) {
    setTimeout(function() {
        if (!melangeEnCours) {
            return;
        }

        let i, j, i2, j2;
        do {
            i = Math.floor(Math.random() * tableau.length);
            j = Math.floor(Math.random() * tableau[i].length);
            i2 = Math.floor(Math.random() * tableau.length);
            j2 = Math.floor(Math.random() * tableau[i2].length);
        } while (i === i2 && j === j2); // S'assurer que nous n'échangeons pas un sprite avec lui-même

        let temp = tableau[i][j];
        tableau[i][j] = tableau[i2][j2];
        tableau[i2][j2] = temp;

        tableau[i][j].setX(i * 100 + 160);
        tableau[i][j].setY(j * 100 + 380);
        tableau[i][j].setZOrder(zOrder + n); // Ajuster l'ordre Z
        
        tableau[i2][j2].setX(i2 * 100 + 160);
        tableau[i2][j2].setY(j2 * 100 + 380);
        tableau[i2][j2].setZOrder(zOrder + n + 1); // Ajuster l'ordre Z
    }, n * 50);
}

}

let melangeEnCours = true;
// Attendez 5 secondes, puis mélangez le puzzle
setTimeout(function() {
melangerPuzzle(tableau);
}, 5000);

// Arrêtez de mélanger le puzzle après 3 secondes
setTimeout(function() {
melangeEnCours = false;
}, 8000);

et bien non toujours pas, je vais abondonner l’idée je crois :,)

I don’t normally reply to non-English language posts because I only speak English but I know that JavaScript has a smaller number of users.

I wonder if it’s the length. Arrays and objects start at [0]. The length might need to be length-1. The last index is always 1 less than the length.

    let i = Math.floor(Math.random() * (tableau.length -1));
    let j = Math.floor(Math.random() * (tableau[i].length -1));
    let i2 = Math.floor(Math.random() * (tableau.length -1));
    let j2 = Math.floor(Math.random() * (tableau[i2].length -1));

J’ai demandé à l’IA, voici ça réponse:

Je vois que vous essayez de mélanger aléatoirement les sprites d’un puzzle en JavaScript. Cependant, il semble que vous rencontriez des problèmes avec des doublons ou des disparitions à la fin du mélange.

Le problème pourrait être dû à la façon dont vous mélangez les éléments dans la fonction melangerPuzzle. Vous échangez aléatoirement les éléments du tableau, mais il est possible que le même élément soit échangé plusieurs fois, ce qui pourrait entraîner des doublons ou des disparitions.

Une solution possible serait d’utiliser l’algorithme de Fisher-Yates (ou Knuth) pour mélanger le tableau. Cet algorithme parcourt le tableau de la fin au début et échange chaque élément avec un élément à une position aléatoire avant lui (y compris lui-même). Voici comment vous pourriez l’implémenter :

function melangerPuzzle(tableau) {
    let total = tableau.length * tableau[0].length;
    let zOrder = 0; // Initialiser l’ordre Z
    for (let n = total - 1; n > 0; n--) {
        let i = Math.floor(Math.random() * (n + 1));
        let j = Math.floor(Math.random() * tableau[i].length);
        let i2 = n % tableau.length;
        let j2 = Math.floor(n / tableau.length);

        let temp = tableau[i][j];
        tableau[i][j] = tableau[i2][j2];
        tableau[i2][j2] = temp;

        tableau[i][j].setX(i * 101 + 160);
        tableau[i][j].setY(j * 101 + 380);
        tableau[i][j].setZOrder(zOrder++);  // Ajuster l'ordre Z
        
        tableau[i2][j2].setX(i2 * 101 + 160);
        tableau[i2][j2].setY(j2 * 101 + 380);
        tableau[i2][j2].setZOrder(zOrder++);  // Ajuster l'ordre Z
    }
}

merci pour le code, malheureusement, c’est encore pire tous mes sprites se remplacent par la copie d’un seul :/;
La je viens de remettre mon code départ et mes 2 premiers aperçus fonctionnent correctement puis ça rebug
tu as utilisé quel chatbot par curiosité ? je suis sur bing .

Nouvelle version, j’ai ajouté une boucle do...while pour s’assurer que les sprites ne sont pas échangés avec eux-mêmes, ce qui pourrait causer des doublons. J’ai également augmenté le nombre de mélanges pour améliorer la randomisation et ajusté l’ordre Z pour chaque sprite après chaque échange. Et ça a l’air de fonctionné !

1 Like

Hello Keith_1357, thank you for looking and trying to help me, unfortunately by modifying these lines, I got nothing, except the same problem see with several sprites while initially, it happens to me with only one, but it’s very nice of you for the participation I will try to find!
I just put back my code and my first 2 previews work then it starts again a 2nd sprite becomes my black box.

New version, I added a do…while loop to make sure the sprites are not swapped with themselves, which could cause duplicates. I also increased the number of mixtures to improve randomization and adjusted the Z order for each sprite after each exchange. And it seems to work :o

Well in the end, no … after a dozen previews the sprite p4 which is transparent split and always superimposes other sprites, I give up for today anyway, this project tires me… but a big thank you for the help once again!

1 Like

Je suis sur Bing aussi. ça dépends beaucoup de la manière dont on lui explique mais je suis déçu par chatGPT même le code qu’il doit connaitre par cœur, il y arrive pas bien. Pourtant il avait compris ce que je lui demandait. Cool si t’as résolu le problème :wink:

Oui pareil chatgpt, je l’ai oublié depuis longtemps, et je suis deg le problème est revenu après 10aperçu en continuant le projet, pause pour aujourd’hui…

Well in the end, no … after a dozen previews the sprite p4 which is transparent split and always superimposes other sprites, I give up for today anyway, this project tires me… but a big thank you for the help once again!

Je connait pas trop le Javascript mais je serais toi, je le ferais avec les évènements.
Sinon pour 7€ il y a le Sliding Puzzle.

Je le ferais comme ça:
Stockage des coordonnées des objets (Tuiles du puzzle) dans une variable.
Création des objets aux coordonnées.
Définir un sprite pour chaque objets. (Puzzle ok)
Déplacer les objets aléatoirement suivant les coordonnées possible.
Si les objets sont tous à l’emplacement de départ: gagné