Bonjour je viens à vous après un ramage complet sur un problème.
Je suis entrain de faire le sujet "création du jeu tour par tour en JS", les cases, le plateau et les personnages fonctionnent bien, les déplacement aussi.
Le problème est que les "croix de direction" ne se suppriment pas vraiment, on peut toujours réutiliser une ancienne croix alors que normalement celle-ci est supprimée ce qui engendre pas mal de bug, des personnes qui se superposent ... Cela fait pas mal d'heures que je cherche mais je n'arrive pas a régler se problème.
Je vous laisse mon site et mon github en espérant que vous puissiez m'aider.
Il y a une chose que je n'ai pas compris dans ton code. Au début tu utilise très bien la POO mais à un moment je vois deux fonctions qui se répètent (généralement les répétitions c'est mauvais signe) : creationZoneDeplacementP1 etcreationZoneDeplacementP2.
L'idée dans un jeu au tour par tour, ce n'est pas d'avoir une variable tour qui passe de 1 à 2 puis de 2 à 1 mais une variable tour qui augmente de 1 puis on utilise le modulo sur le nombre de joueur. Pour savoir à qui le tour, on utilise un test d'égalité entre l'id du perso et l'id du tour.
class Plateau {
on_peut_cliquer(cellule, perso) {
let pas_la_meme_case = !(cellule.x == perso.x && cellule.y == perso.y);
let meme_ligne_ou_colone = (cellule.x == perso.x || cellule.y == perso.y);
let distance_x = Math.abs(perso.x - cellule.x);
let distance_y = Math.abs(perso.y - cellule.y);
let proche = (distance_x <= 2 && distance_y <= 2);
return pas_la_meme_case && meme_ligne_ou_colone && proche;
}
get_tour() {
// ici tour = 0 pour le premier joueur et 1 pour le 2eme joueur, jamais 2
this.tour %= this.persos.length;
return this.tour;
}
clic(x, y) {
let cellule = this.cellules.find(c => c.x == x && c.y == y);
let perso_courrant = this.persos[this.get_tour()];
if (on_peut_cliquer(cellule, perso_courrant)) {
// faire quelque chose puis tour suivant
this.tour++;
}
}
init() {
// pour toutes les cases du plateau, on utilise la fonction clic
this.cellules.forEach(cellule => {
// ajout de l'event clic, peu importe la façon de faire
$('cellule_'+`${cellule.id}`).clic(() => {
clic(cellule.x, cellule.y);
});
});
}
}
Au moment de *// faire quelque chose puis tour suivant*, tu dois non seulement modifier l'affichage mais aussi l'état interne du jeu. Bien souvent, l'affichage est directement lié à l'état interne donc modifier l'état interne modifie directement l'affichage.
Dans ce code, j'utilise un test pour savoir si le clic d'une case engendre une action autorisé ou non. De cette façon, même si tu clique sur une ancienne case, rien ne se passe, c'est toujours le même tour de jeu et c'est toujours au personnage courant de jouer.
- Edité par Benevolar 5 décembre 2018 à 17:18:59
Jeu de plateau JS: pb de deplacement perso
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.