Bonjour, j'ai un soucis j'ai créer une carte aux trésors où mon personnage ne peux pas franchir les montagnes et doit obtenir le trésor et afficher une alert vous avez gagné..

Le problème est que mon chevalier va sur la case montagne et ne peut plus en sortir, si je ne vais pas sur les cases montagne tout se passe bien sauf au moment où je récupère mon trésors il m'affiche l'alert avant d'être sur la case du trésor.

let nbLigne = 4;
let nbColonne = 3;

let positionHero = [0, 0];
const monJeu = document.querySelector("#jeu");

let ligne1 = [creaCel(0), creaCel(0), creaCel(1),];
let ligne2 = [creaCel(1), creaCel(0), creaCel(0),];
let ligne3 = [creaCel(0), creaCel(0), creaCel(0),];
let ligne4 = [creaCel(0), creaCel(1), creaCel(0),];

let tabJeu = [ligne1, ligne2, ligne3, ligne4];

afficherJeu(tabJeu);

function creaCel(image) {
    let cellule = {
        image: image,
        left: getLeft(image),
        top: getTop(image),
        right: getRight(image),
        down: getDown(image)

    }
    return cellule;
}

function getLeft(image) {
    if (image === 0) return true;
    return false
}
function getRight(image) {
    if (image === 0) return true;
    return false;

}
function getTop(image) {
    if (image === 0) return true;
    return false;

}
function getDown(image) {
    if (image === 0) return true;
    return false;

}

function afficherJeu(tabJeu) {
    monJeu.innerHTML = "";
    let content = "<table>";
    for (let i = 0; i < tabJeu.length; i++) {
        content += "<tr>";
        for (let j = 0; j < tabJeu[i].length; j++) {
            content += "<td>";
            content += "<img src='images/" + tabJeu[i][j].image + ".png'/>";
            if (i === nbLigne - 1 && j === nbColonne - 1) {
                let tresorLigne = 25 + 100 * i;
                let tresorColonne = 25 + 100 * j;
                content += "<img src='images/2.png' style='width:50px;height:50px;position:absolute;left:" + tresorColonne + "px;top:" + tresorLigne + "px'/>";

            }
            if (i === positionHero[0] && j === positionHero[1]) {
                let heroLigne = 25 + 100 * positionHero[0];
                let heroColonne = 25 + 100 * positionHero[1];
                content += "<img src='images/3.png' style='width:50px;height:50px;position:absolute;left:" + heroColonne + "px;top:" + heroLigne + "px'/>";

            }
            content += "</td>";
        }
        content += "</tr>";

    }
    content += "</table>";
    monJeu.innerHTML += content;

};

function getCellule(i, j) {
    return tabJeu[i][j];
}

addEventListener("keyup", function (event) {

    let lignePlayer = positionHero[0];
    let colonnePlayer = positionHero[1];
    if (event.keyCode === 37 && colonnePlayer > 0) { // gauche
        if (getCellule(positionHero[0], positionHero[1]).left) {
            colonnePlayer--;

        }
    }
    if (event.keyCode === 38 && lignePlayer > 0) { // haut
        if (getCellule(positionHero[0], positionHero[1]).top) {
            lignePlayer--;

        }
    }
    if (event.keyCode === 39 && colonnePlayer < nbColonne - 1) { // droite
        if (getCellule(positionHero[0], positionHero[1]).right) {
            colonnePlayer++;

        }
    }
    if (event.keyCode === 40 && lignePlayer < nbLigne - 1) { // bas
        if (getCellule(positionHero[0], positionHero[1]).down) {
            lignePlayer++;

        }
    }
    positionHero = [lignePlayer, colonnePlayer];
    afficherJeu(tabJeu);
    verificationFinJeu();
});

function verificationFinJeu() {

    if (positionHero[0] === nbLigne - 1 && positionHero[1] === nbColonne - 1)
        alert("Vous avez gagné !");
}

2 réponses


super interssant je connais pas la reponse mais je met un commentaire pour pousser les gens a repondre...la reponse m interesse aussi
et aussi une fois finit jaimerais beaucoup une video qui montre comment tu a fais

Alors premier élément de réponse, pour commencer tes méthodes qui servent à déplacer ton personnages
En PHP ça fonctionnerait, mais en JS il y'a un comportement spécial, en gros si tu fait un if return, et en dessous tu places un autre return, le JS peut exécuter le deuxième return pendant qu'il fait la vérification du if, c'est un peu la technique de JS pour aller plus vite, il execute toutes les action d'un méthode en même temps

Et même si il n'y avait pas de problème, c'est innutile de faire un if si tu dois retourner true ou false :p

pour regler ça, remplaces des if par ça (ça vaut pour toutes les directions:

function getLeft(image) {
    return image === 0
}

Je continue de regarder le code :p

Même problème avec ton event listenner, JS va executer la fin de ta méthode le temps de regarder tous les if ^^'
Mmmmh je regardes pour proposer mieux, faut refacto toute la méthode x)