Bonjour,
Je bosse actuellement en javascript pour récupérer une zone de déplacement possible d'un joueur sur une carte. Ce joueur peut parcourir une certaine distance via des points sur la carte dont chaque tuile possède un malus pour la traverser.
J'ai réalisé un petit algorithme mais la complexité exponentielle et dépasser une certaine distance, mon navigateur favori me crie au scandale. Je voudrais donc l'améliorer avec votre aide ^^
Merci.
Je bosse actuellement en javascript pour récupérer une zone de déplacement possible d'un joueur sur une carte. Ce joueur peut parcourir une certaine distance via des points sur la carte dont chaque tuile possède un malus pour la traverser.
J'ai réalisé un petit algorithme mais la complexité exponentielle et dépasser une certaine distance, mon navigateur favori me crie au scandale. Je voudrais donc l'améliorer avec votre aide ^^
Code :
var map = [
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1],
[1,1,3,1,1,1,3,1,3,1,1,1,3,1,1,1,1,1,2,1,1,1,2,1],
[3,1,1,1,3,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1],
[1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1],
[1,1,3,1,1,1,3,1,3,1,1,1,3,1,1,1,1,1,2,1,1,1,2,1],
[3,1,1,1,3,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1],
[1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1],
[1,1,3,1,1,1,3,1,3,1,1,1,3,1,1,1,1,1,2,1,1,1,2,1],
[3,1,1,1,3,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1],
[1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1]
];
var zone = [];
function getMoveZone(x, y, point, from) {
// On enlève le poids de la case courante
point = point - map[y][x];
if (point >= 0) {
// Permet de vérifier si ce couple de coordonnées n'est pas déjà dans la liste
var posNotInZone = true;
for (var i = 0, l = zone.length; i < l; i++) {
if (zone[i][0] === x && zone[i][1] === y) {
posNotInZone = false;
}
}
// On ajoute le couple de coordonnées
if (posNotInZone) {
zone.push([x,y]);
}
// On va à droite si la carte le permet
// et si on ne vient pas deja de la droite
if (x+1 < map[0].length && x+1 != from[0]) {
getMoveZone(x+1,y,point,[x+1,y]);
}
// On va à gauche si la carte le permet
// et si on ne vient pas deja de la gauche
if (x-1 >= 0 && x-1 != from[0]) {
getMoveZone(x-1,y,point,[x-1,y]);
}
// On desccend si la carte le permet
// et si on ne vient pas deja d'en bas
if (y+1 < map.length && y+1 != from[1]) {
getMoveZone(x,y+1,point,[x,y+1]);
}
// On monte si la carte le veut ^^
// et si on ne vient pas deja d'en haut
if (y-1 >= 0 && y-1 != from[1]) {
getMoveZone(x,y-1,point,[x,y-1]);
}
}
}
Merci.