1eres corrections algo

This commit is contained in:
Nogard
2025-03-23 00:47:08 +01:00
parent 0048c85d86
commit cdb724aa89
2 changed files with 215 additions and 200 deletions
-200
View File
@@ -1,200 +0,0 @@
const Orientation = Object.freeze({
HAUT: Symbol("haut"),
BAS: Symbol("bas"),
GAUCHE: Symbol("gauche"),
DROITE: Symbol("droite")
});
class Noeud {
coordX;
coordY;
chemins;
constructor(coordX, coordY){
this.coordX = coordX;
this.coordY = coordY;
chemins = new Array();
}
addCheminPossible(chemin){
this.chemins.push(chemin);
}
getCheminsPossibles(){
return this.chemins;
}
toString(){
log.console("node : (" + currentNode.getX + "; " + currentNode.getY + ")");
}
toStringWithVoisins(){
log.console("node : (" + currentNode.getX + "; " + currentNode.getY + ")");
log.console("voisins connus : " + this.chemins.forEach((chemin) => chemin.toString()));
}
}
class ModeAutomatique {
cheminsPossibles = new Array(); // liste des listes de noeuds
noeudsVisites = new Array();
// valeurs pour la première position
posX=0;
posY=0;
rotation=HAUT;
run(){
while(isObjectifTrouve()){
currentNode = getCaseAnalysee();
this.analyseEnvironnement(currentNode); // met à jour ses connaissances (à dessiner au fur et à mesure ?)
this.deplacer(currentNode); // récupère un chemin non encore parcourus en fonction de ses connaissances
}
}
isObjectifTrouve(){
return false;
}
//////////////////////////////////////// ANALYSE ENVIRONNEMENT
analyseEnvironnement(currentNode){
currentNode.toString();
// SI case déjà visitée, alors on connait ses obstacles
if (currentNode == null) {
// pour les 4 directions possibles
for (let i = 0; i < 4; i++) {
if (!isObstacleDevant(currentNode, rotation)){
addCheminPossible(currentNode);
}
tourne(); // changement de l'angle de 90 degrés
}
this.noeudsVisites.push(currentNode);
}
}
isObstacleDevant(){
// TODO
return true;
}
tourne(){
if(this.rotation = Orientation.HAUT){
// TODO tourne
this.rotation = Orientation.GAUCHE;
} else if(this.rotation = Orientation.BAS){
// TODO tourne
this.rotation = Orientation.GAUCHE;
}else if(this.rotation = Orientation.BAS){
// TODO tourne
this.rotation = Orientation.DROITE;
}else if(this.rotation = Orientation.DROITE){
// TODO tourne
this.rotation = Orientation.HAUT;
}
}
addCheminPossible(){
chemin = new Array();
if(this.rotation = Orientation.HAUT){
chemin.push(new Noeud(posX+1, posY));
} else if(this.rotation = Orientation.BAS){
chemin.push(new Noeud(posX-1, posY));
}else if(this.rotation = Orientation.GAUCHE){
chemin.push(new Noeud(posX, posY-1));
}else if(this.rotation = Orientation.DROITE){
chemin.push(new Noeud(posX, posY+1));
}
this.cheminsPossibles.push(chemin);
}
//////////////////////////////////////// MOVE
deplacer(currentNode){
// on choisi le prochain noeud
nextNode = getNextNode();
log.console("next node : ");
nextNode.toString();
// on met à jour la liste des chemins en ajoutant le noeud courant dans les chemins non choisis
updatePaths(nextNode);
// on met à jour les coordonnées
this.updateCoordonnees(currentNode, nextNode);
// move
this.move();
}
// parcours en profondeur : il s'agit de LIFOs
getNextNode(){
if (this.cheminsPossibles[this.cheminsPossibles.length - 1] > 0) {
// on récupère la dernière liste
cheminChoisi = this.cheminsPossibles[this.cheminsPossibles.length - 1];
// on récupère le dernier élément de cette liste
nodeChoisi = cheminChoisi[cheminChoisi.length - 1];
log.console("noeud choisi :");
nodeChoisi.toString();
// on créé un nouveau noeud
return new Noeud(nodeChoisi.posX, nodeChoisi.posY);
}
return null;
}
updatePaths(nextNode){
nextNode = this.getCaseAnalysee();
// on ajoute le noeud visité à toutes les listes sauf la dernière
for (let i=0; i < this.cheminsPossibles -1; i++){
cheminPossible = this.cheminsPossibles[i];
if (nextNode == null){
// on ajoute le noeud en cours à la liste des noeuds visités
cheminPossible.push(nextNode);
} else {
// on vire le noeud visité de toutes les listes s'il a déjà été visité avant (on fait demi tour)
cheminPossible.pop();
}
}
// on supprime les listes vides
cheminsPossibles = cheminsPossibles.filter(function (el) {
return el.length > 0;
});
log.console("nombre de chemins restants : " + this.cheminsPossibles.length)
log.console("chemins possibles : " + this.cheminsPossibles)
}
updateCoordonnees(currentNode, nextNode) {
log.console("coordonnees : (" + this.posX + "; " + this.posY + ")");
if (currentNode.getX > nextNode.getX){
this.rotation = Orientation.GAUCHE
this.posY--;
} else if (currentNode.getX < nextNode.getX){
this.rotation = Orientation.DROITE
this.pos++;
} else if (currentNode.getY > nextNode.getY){
this.rotation = Orientation.BAS
this.posX--;
} else {
this.rotation = Orientation.HAUT
this.posX++;
}
log.console("new coordonnees : (" + this.posX + "; " + this.posY + ")");
}
move(currentNode, nextNode){
// déplacer robot (les coordonnées sont déjà à jour)
}
/////////////////////////////////////// GETTERS
getCaseAnalysee(){
noeudsVisites.forEach((noeud) => {
if (noeud.posX == this.posX && noeud.posY == this.posY){
return noeud;
}
});
return null;
}
}
+215
View File
@@ -281,6 +281,219 @@ class Turtle {
}
const Orientation = Object.freeze({
HAUT: 0,
DROITE: 1,
BAS: 2,
GAUCHE: 3,
});
class Noeud {
coordX;
coordY;
chemins;
constructor(coordX, coordY){
this.coordX = coordX;
this.coordY = coordY;
chemins = new Array();
}
addCheminPossible(chemin){
this.chemins.push(chemin);
}
getCheminsPossibles(){
return this.chemins;
}
toString(){
console.log("node : (" + currentNode.getX + "; " + currentNode.getY + ")");
}
toStringWithVoisins(){
console.log("node : (" + currentNode.getX + "; " + currentNode.getY + ")");
console.log("voisins connus : " + this.chemins.forEach((chemin) => chemin.toString()));
}
}
class ModeAutomatique {
cheminsPossibles = new Array(); // liste des listes de noeuds
noeudsVisites = new Array();
// valeurs pour la première position
posX=0;
posY=0;
rotation = Orientation.HAUT;
lastRotation = this.rotation;
run(){
let iter = 0;
while(!this.isObjectifTrouve()){
console.log("Iteration " + iter++);
console.log(this.cheminsPossibles);
const currentNode = this.getCaseAnalysee();
this.analyseEnvironnement(currentNode); // met à jour ses connaissances (à dessiner au fur et à mesure ?)
this.deplacer(currentNode); // récupère un chemin non encore parcourus en fonction de ses connaissances
sleep(5000);
}
}
isObjectifTrouve(){
return false;
}
//////////////////////////////////////// ANALYSE ENVIRONNEMENT
isObstacleDevant (currentNode, rotation) {
return false;
}
analyseEnvironnement(currentNode){
// SI case déjà visitée, alors on connait ses obstacles
if (currentNode == null) {
// pour les 4 directions possibles
for (let i = 0; i < 4; i++) {
if (!this.isObstacleDevant(currentNode, this.rotation)){
this.addCheminPossible(currentNode);
}
this.tourne(); // changement de l'angle de 90 degrés
}
this.noeudsVisites.push(currentNode);
}
}
tourne(){
turtle.tourner(-90);
this.rotation++;
this.rotation %= 4;
}
addCheminPossible(){
this.chemin = new Array();
if(this.rotation = Orientation.HAUT){
this.chemin.push(new Noeud(posX+1, posY));
} else if(this.rotation = Orientation.BAS){
this.chemin.push(new Noeud(posX-1, posY));
}else if(this.rotation = Orientation.GAUCHE){
this.chemin.push(new Noeud(posX, posY-1));
}else if(this.rotation = Orientation.DROITE){
this.chemin.push(new Noeud(posX, posY+1));
}
this.cheminsPossibles.push(this.chemin);
}
//////////////////////////////////////// MOVE
deplacer(currentNode){
// on choisi le prochain noeud
const nextNode = this.getNextNode();
if (nextNode != null) {
console.log("next node : ");
nextNode.toString();
}
// on met à jour la liste des chemins en ajoutant le noeud courant dans les chemins non choisis
this.updatePaths(nextNode);
// on met à jour les coordonnées
this.updateCoordonnees(currentNode, nextNode);
// move
this.move();
}
// parcours en profondeur : il s'agit de LIFOs
getNextNode(){
if (this.cheminsPossibles[this.cheminsPossibles.length - 1] > 0) {
// on récupère la dernière liste
const cheminChoisi = this.cheminsPossibles[this.cheminsPossibles.length - 1];
// on récupère le dernier élément de cette liste
const nodeChoisi = cheminChoisi[cheminChoisi.length - 1];
console.log("noeud choisi :");
nodeChoisi.toString();
// on créé un nouveau noeud
return new Noeud(nodeChoisi.posX, nodeChoisi.posY);
}
return null;
}
updatePaths(nextNode){
nextNode = this.getCaseAnalysee();
// on ajoute le noeud visité à toutes les listes sauf la dernière
for (let i=0; i < this.cheminsPossibles -1; i++){
const cheminPossible = this.cheminsPossibles[i];
if (nextNode == null){
// on ajoute le noeud en cours à la liste des noeuds visités
cheminPossible.push(nextNode);
} else {
// on vire le noeud visité de toutes les listes s'il a déjà été visité avant (on fait demi tour)
cheminPossible.pop();
}
}
// on supprime les listes vides
this.cheminsPossibles = this.cheminsPossibles.filter(function (el) {
return el.length > 0;
});
console.log("nombre de chemins restants : " + this.cheminsPossibles.length)
console.log("chemins possibles : " + this.cheminsPossibles)
}
updateCoordonnees(currentNode, nextNode) {
console.log("coordonnees : (" + this.posX + "; " + this.posY + ")");
this.lastRotation = this.rotation;
if (currentNode.getX > nextNode.getX){
this.rotation = Orientation.GAUCHE
this.posY--;
} else if (currentNode.getX < nextNode.getX){
this.rotation = Orientation.DROITE
this.pos++;
} else if (currentNode.getY > nextNode.getY){
this.rotation = Orientation.BAS
this.posX--;
} else {
this.rotation = Orientation.HAUT
this.posX++;
}
console.log("new coordonnees : (" + this.posX + "; " + this.posY + ")");
}
move(){
// déplacer robot (les coordonnées sont déjà à jour)
let aRotater = this.rotation - this.lastRotation;
if (aRotater > 2) {
aRotater -= 2;
}
if (aRotater < 2) {
aRotater += 2;
}
aRotater *= 90;
turtle.tourner(aRotater);
turtle.avancer(100);
}
/////////////////////////////////////// GETTERS
getCaseAnalysee(){
let index = 0;
this.noeudsVisites.forEach((noeud) => {
if (noeud == null) {
console.error(this.noeudsVisites);
console.error("INDEX NULL : " + index);
}
index++;
if (noeud.posX == this.posX && noeud.posY == this.posY){
return noeud;
}
});
return null;
}
}
async function run() {
connectSockets();
@@ -336,3 +549,5 @@ async function test() {
});
}