vittascience:labyrinthe
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| vittascience:labyrinthe [2025/12/14 10:00] – [idées d'algorythme pour sortir d un labytrinthe] admin | vittascience:labyrinthe [2026/03/06 16:23] (Version actuelle) – [algorythme essai] admin | ||
|---|---|---|---|
| Ligne 6: | Ligne 6: | ||
| {{ : | {{ : | ||
| + | |||
| + | {{ : | ||
| **Exemples ** | **Exemples ** | ||
| Ligne 12: | Ligne 14: | ||
| {{ : | {{ : | ||
| + | |||
| + | |||
| + | ==== Simulation de sortie d un labyrinthe ==== | ||
| + | |||
| + | [[https:// | ||
| Ligne 45: | Ligne 52: | ||
| *14 Arrêt du robot lorsque la sortie du labyrinthe est détectée. | *14 Arrêt du robot lorsque la sortie du labyrinthe est détectée. | ||
| </ | </ | ||
| + | |||
| + | ==== algorythme essai ==== | ||
| + | |||
| + | * 1- régler vitesse des moteurs entre 20% et 50% | ||
| + | * 2- Création de sous programmes : avancer , reculer, tourner droite 90° , tourner gauche 90°, stop, test distance | ||
| + | * 3- avancer jusqu' | ||
| + | * 4- si distance < 3 cm => stop | ||
| + | * 5- Tourner à droite => test distance obstacle | ||
| + | * 6- si distance > 20 => avancer jusqu' | ||
| + | * 7- sinon si distance < 3 cm => tourner encore à droite ( en tout depuis l' | ||
| + | * 8- test rotation si rotation => 180° | ||
| + | * 8- tourner encore de 180° ( 2 fois tourner droite) | ||
| + | * 8- si distance > 20 => avancer | ||
| + | |||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | {{ : | ||
| + | |||
| + | <code c laby0033.ino> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | MeDCMotor motor_L(9); | ||
| + | MeDCMotor motor_R(10); | ||
| + | // Ultrasonic on PORT_3 | ||
| + | MeUltrasonicSensor ultrasonic_3(PORT_3); | ||
| + | |||
| + | int distancemax; | ||
| + | int pause; | ||
| + | int vitesse; | ||
| + | |||
| + | void mBot_setMotorLeft(int8_t dir, int16_t speed) { | ||
| + | speed = speed/ | ||
| + | motor_L.run((9) == M1 ? -(dir*speed) : (dir*speed)); | ||
| + | } | ||
| + | |||
| + | void mBot_setMotorRight(int8_t dir, int16_t speed) { | ||
| + | speed = speed/ | ||
| + | motor_R.run((10) == M1 ? -(dir*speed) : (dir*speed)); | ||
| + | } | ||
| + | |||
| + | void avancer() { | ||
| + | while (ultrasonic_3.distanceCm() >= distancemax) { | ||
| + | mBot_setMotorRight(1, | ||
| + | mBot_setMotorLeft(1, | ||
| + | } | ||
| + | mBot_setMotorRight(0, | ||
| + | mBot_setMotorLeft(0, | ||
| + | delay(1000*pause); | ||
| + | } | ||
| + | |||
| + | void droite() { | ||
| + | mBot_setMotorRight(-1, | ||
| + | mBot_setMotorLeft(1, | ||
| + | delay(1000*pause); | ||
| + | mBot_setMotorRight(0, | ||
| + | mBot_setMotorLeft(0, | ||
| + | } | ||
| + | |||
| + | void gauche() { | ||
| + | mBot_setMotorLeft(-1, | ||
| + | mBot_setMotorRight(1, | ||
| + | delay(1000*pause); | ||
| + | mBot_setMotorRight(0, | ||
| + | mBot_setMotorLeft(0, | ||
| + | } | ||
| + | |||
| + | |||
| + | void setup() { | ||
| + | distancemax = 3; | ||
| + | pause = 1; | ||
| + | vitesse = 22; | ||
| + | avancer(); | ||
| + | droite(); | ||
| + | avancer(); | ||
| + | gauche(); | ||
| + | avancer(); | ||
| + | gauche(); | ||
| + | avancer(); | ||
| + | droite(); | ||
| + | mBot_setMotorRight(1, | ||
| + | mBot_setMotorLeft(1, | ||
| + | delay(1000*1); | ||
| + | mBot_setMotorRight(0, | ||
| + | mBot_setMotorLeft(0, | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Code à Tester ==== | ||
| + | <code c Laby001.ino> | ||
| + | int capteurAvant = A0; | ||
| + | int capteurGauche = A1; | ||
| + | int capteurDroite = A2; | ||
| + | |||
| + | int compteurAngle = 0; | ||
| + | |||
| + | void avancer() { | ||
| + | Serial.println(" | ||
| + | } | ||
| + | |||
| + | void tournerDroite() { | ||
| + | Serial.println(" | ||
| + | compteurAngle -= 90; | ||
| + | } | ||
| + | |||
| + | void tournerGauche() { | ||
| + | Serial.println(" | ||
| + | compteurAngle += 90; | ||
| + | } | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(9600); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | |||
| + | int avant = analogRead(capteurAvant); | ||
| + | int gauche = analogRead(capteurGauche); | ||
| + | int droite = analogRead(capteurDroite); | ||
| + | |||
| + | bool murAvant = avant < 300; | ||
| + | bool murGauche = gauche < 300; | ||
| + | bool murDroite = droite < 300; | ||
| + | |||
| + | // Si pas de mur devant et compteur = 0 → avancer | ||
| + | if (!murAvant && compteurAngle == 0) { | ||
| + | avancer(); | ||
| + | } | ||
| + | |||
| + | // Si mur devant → suivre le mur | ||
| + | else { | ||
| + | |||
| + | if (!murDroite) { | ||
| + | tournerDroite(); | ||
| + | } | ||
| + | else if (!murAvant) { | ||
| + | avancer(); | ||
| + | } | ||
| + | else if (!murGauche) { | ||
| + | tournerGauche(); | ||
| + | } | ||
| + | else { | ||
| + | tournerDroite(); | ||
| + | tournerDroite(); | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | delay(200); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code c laby002.ino> | ||
| + | #define trigFront 2 | ||
| + | #define echoFront 3 | ||
| + | |||
| + | #define trigLeft 4 | ||
| + | #define echoLeft 5 | ||
| + | |||
| + | #define trigRight 6 | ||
| + | #define echoRight 7 | ||
| + | |||
| + | #define ENA 9 | ||
| + | #define IN1 8 | ||
| + | #define IN2 10 | ||
| + | |||
| + | #define ENB 11 | ||
| + | #define IN3 12 | ||
| + | #define IN4 13 | ||
| + | |||
| + | int compteurAngle = 0; | ||
| + | int distanceMur = 20; | ||
| + | |||
| + | long lireDistance(int trig, int echo) { | ||
| + | |||
| + | digitalWrite(trig, | ||
| + | delayMicroseconds(2); | ||
| + | |||
| + | digitalWrite(trig, | ||
| + | delayMicroseconds(10); | ||
| + | digitalWrite(trig, | ||
| + | |||
| + | long duree = pulseIn(echo, | ||
| + | long distance = duree * 0.034 / 2; | ||
| + | |||
| + | return distance; | ||
| + | } | ||
| + | |||
| + | void avancer() { | ||
| + | |||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | |||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | |||
| + | analogWrite(ENA, | ||
| + | analogWrite(ENB, | ||
| + | } | ||
| + | |||
| + | void stopRobot() { | ||
| + | |||
| + | analogWrite(ENA, | ||
| + | analogWrite(ENB, | ||
| + | } | ||
| + | |||
| + | void tournerDroite() { | ||
| + | |||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | |||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | |||
| + | analogWrite(ENA, | ||
| + | analogWrite(ENB, | ||
| + | |||
| + | delay(400); | ||
| + | |||
| + | compteurAngle -= 90; | ||
| + | } | ||
| + | |||
| + | void tournerGauche() { | ||
| + | |||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | |||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | |||
| + | analogWrite(ENA, | ||
| + | analogWrite(ENB, | ||
| + | |||
| + | delay(400); | ||
| + | |||
| + | compteurAngle += 90; | ||
| + | } | ||
| + | |||
| + | void setup() { | ||
| + | |||
| + | pinMode(trigFront, | ||
| + | pinMode(echoFront, | ||
| + | |||
| + | pinMode(trigLeft, | ||
| + | pinMode(echoLeft, | ||
| + | |||
| + | pinMode(trigRight, | ||
| + | pinMode(echoRight, | ||
| + | |||
| + | pinMode(ENA, | ||
| + | pinMode(ENB, | ||
| + | |||
| + | pinMode(IN1, | ||
| + | pinMode(IN2, | ||
| + | pinMode(IN3, | ||
| + | pinMode(IN4, | ||
| + | |||
| + | Serial.begin(9600); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | |||
| + | int front = lireDistance(trigFront, | ||
| + | int left = lireDistance(trigLeft, | ||
| + | int right = lireDistance(trigRight, | ||
| + | |||
| + | bool murAvant = front < distanceMur; | ||
| + | bool murGauche = left < distanceMur; | ||
| + | bool murDroite = right < distanceMur; | ||
| + | |||
| + | Serial.print(" | ||
| + | Serial.println(compteurAngle); | ||
| + | |||
| + | // mode direction principale | ||
| + | if (!murAvant && compteurAngle == 0) { | ||
| + | |||
| + | avancer(); | ||
| + | } | ||
| + | |||
| + | else { | ||
| + | |||
| + | // suivi du mur | ||
| + | |||
| + | if (!murDroite) { | ||
| + | |||
| + | tournerDroite(); | ||
| + | |||
| + | } | ||
| + | |||
| + | else if (!murAvant) { | ||
| + | |||
| + | avancer(); | ||
| + | |||
| + | } | ||
| + | |||
| + | else if (!murGauche) { | ||
| + | |||
| + | tournerGauche(); | ||
| + | |||
| + | } | ||
| + | |||
| + | else { | ||
| + | |||
| + | tournerDroite(); | ||
| + | tournerDroite(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | delay(50); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code c laby004.ino> | ||
| + | // ======================================================= | ||
| + | // ROBOT LABYRINTHE PRO - FLOODFILL MICROMOUSE | ||
| + | // Arduino + L298N + capteurs distance | ||
| + | // ======================================================= | ||
| + | |||
| + | #define SIZE 16 | ||
| + | |||
| + | // ----------------------------- | ||
| + | // MOTEURS | ||
| + | // ----------------------------- | ||
| + | |||
| + | const int ENA = 5; | ||
| + | const int IN1 = 6; | ||
| + | const int IN2 = 7; | ||
| + | |||
| + | const int ENB = 9; | ||
| + | const int IN3 = 10; | ||
| + | const int IN4 = 11; | ||
| + | |||
| + | // ----------------------------- | ||
| + | // CAPTEURS | ||
| + | // ----------------------------- | ||
| + | |||
| + | const int trigFront = 2; | ||
| + | const int echoFront = 3; | ||
| + | |||
| + | const int trigLeft = 4; | ||
| + | const int echoLeft = 8; | ||
| + | |||
| + | const int trigRight = 12; | ||
| + | const int echoRight = 13; | ||
| + | |||
| + | // ----------------------------- | ||
| + | // STRUCTURE LABYRINTHE | ||
| + | // ----------------------------- | ||
| + | |||
| + | struct Cell | ||
| + | { | ||
| + | bool wallN; | ||
| + | bool wallE; | ||
| + | bool wallS; | ||
| + | bool wallW; | ||
| + | |||
| + | int distance; | ||
| + | bool visited; | ||
| + | }; | ||
| + | |||
| + | Cell maze[SIZE][SIZE]; | ||
| + | |||
| + | // position robot | ||
| + | |||
| + | int posX = 0; | ||
| + | int posY = 0; | ||
| + | |||
| + | // orientation | ||
| + | // 0 = NORD | ||
| + | // 1 = EST | ||
| + | // 2 = SUD | ||
| + | // 3 = OUEST | ||
| + | |||
| + | int direction = 0; | ||
| + | |||
| + | // centre objectif | ||
| + | |||
| + | int goalX = 7; | ||
| + | int goalY = 7; | ||
| + | |||
| + | // ----------------------------- | ||
| + | // SETUP | ||
| + | // ----------------------------- | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | |||
| + | Serial.begin(9600); | ||
| + | |||
| + | pinMode(IN1, | ||
| + | pinMode(IN2, | ||
| + | pinMode(IN3, | ||
| + | pinMode(IN4, | ||
| + | |||
| + | pinMode(ENA, | ||
| + | pinMode(ENB, | ||
| + | |||
| + | pinMode(trigFront, | ||
| + | pinMode(echoFront, | ||
| + | |||
| + | pinMode(trigLeft, | ||
| + | pinMode(echoLeft, | ||
| + | |||
| + | pinMode(trigRight, | ||
| + | pinMode(echoRight, | ||
| + | |||
| + | analogWrite(ENA, | ||
| + | analogWrite(ENB, | ||
| + | |||
| + | initMaze(); | ||
| + | floodFill(); | ||
| + | } | ||
| + | |||
| + | // ----------------------------- | ||
| + | // LOOP PRINCIPAL | ||
| + | // ----------------------------- | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | |||
| + | scanWalls(); | ||
| + | |||
| + | maze[posX][posY].visited = true; | ||
| + | |||
| + | floodFill(); | ||
| + | |||
| + | int bestDir = bestDirection(); | ||
| + | |||
| + | moveRobot(bestDir); | ||
| + | } | ||
| + | |||
| + | // ======================================================= | ||
| + | // INITIALISATION LABYRINTHE | ||
| + | // ======================================================= | ||
| + | |||
| + | void initMaze() | ||
| + | { | ||
| + | |||
| + | for (int x = 0; x < SIZE; x++) | ||
| + | { | ||
| + | for (int y = 0; y < SIZE; y++) | ||
| + | { | ||
| + | |||
| + | maze[x][y].wallN = false; | ||
| + | maze[x][y].wallE = false; | ||
| + | maze[x][y].wallS = false; | ||
| + | maze[x][y].wallW = false; | ||
| + | |||
| + | maze[x][y].visited = false; | ||
| + | |||
| + | maze[x][y].distance = abs(goalX - x) + abs(goalY - y); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // ======================================================= | ||
| + | // FLOODFILL | ||
| + | // ======================================================= | ||
| + | |||
| + | void floodFill() | ||
| + | { | ||
| + | |||
| + | bool change = true; | ||
| + | |||
| + | while (change) | ||
| + | { | ||
| + | |||
| + | change = false; | ||
| + | |||
| + | for (int x = 0; x < SIZE; x++) | ||
| + | { | ||
| + | for (int y = 0; y < SIZE; y++) | ||
| + | { | ||
| + | |||
| + | int minNeighbour = 1000; | ||
| + | |||
| + | if (!maze[x][y].wallN && y < SIZE - 1) | ||
| + | minNeighbour = min(minNeighbour, | ||
| + | |||
| + | if (!maze[x][y].wallE && x < SIZE - 1) | ||
| + | minNeighbour = min(minNeighbour, | ||
| + | |||
| + | if (!maze[x][y].wallS && y > 0) | ||
| + | minNeighbour = min(minNeighbour, | ||
| + | |||
| + | if (!maze[x][y].wallW && x > 0) | ||
| + | minNeighbour = min(minNeighbour, | ||
| + | |||
| + | if (maze[x][y].distance != minNeighbour + 1) | ||
| + | { | ||
| + | maze[x][y].distance = minNeighbour + 1; | ||
| + | change = true; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // ======================================================= | ||
| + | // CHOIX DIRECTION OPTIMALE | ||
| + | // ======================================================= | ||
| + | |||
| + | int bestDirection() | ||
| + | { | ||
| + | |||
| + | int best = 1000; | ||
| + | int bestDir = direction; | ||
| + | |||
| + | int nx, ny; | ||
| + | |||
| + | for (int d = 0; d < 4; d++) | ||
| + | { | ||
| + | |||
| + | nx = posX; | ||
| + | ny = posY; | ||
| + | |||
| + | if (d == 0) | ||
| + | ny++; | ||
| + | if (d == 1) | ||
| + | nx++; | ||
| + | if (d == 2) | ||
| + | ny--; | ||
| + | if (d == 3) | ||
| + | nx--; | ||
| + | |||
| + | if (nx < 0 || ny < 0 || nx >= SIZE || ny >= SIZE) | ||
| + | continue; | ||
| + | |||
| + | if (isWall(d)) | ||
| + | continue; | ||
| + | |||
| + | if (maze[nx][ny].distance < best) | ||
| + | { | ||
| + | best = maze[nx][ny].distance; | ||
| + | bestDir = d; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | return bestDir; | ||
| + | } | ||
| + | |||
| + | // ======================================================= | ||
| + | // MOUVEMENT ROBOT | ||
| + | // ======================================================= | ||
| + | |||
| + | void moveRobot(int dir) | ||
| + | { | ||
| + | |||
| + | int turn = dir - direction; | ||
| + | |||
| + | if (turn == -3) | ||
| + | turn = 1; | ||
| + | if (turn == 3) | ||
| + | turn = -1; | ||
| + | |||
| + | if (turn == 1) | ||
| + | turnRight(); | ||
| + | |||
| + | if (turn == -1) | ||
| + | turnLeft(); | ||
| + | |||
| + | if (turn == 2 || turn == -2) | ||
| + | { | ||
| + | turnRight(); | ||
| + | turnRight(); | ||
| + | } | ||
| + | |||
| + | forward(); | ||
| + | |||
| + | direction = dir; | ||
| + | |||
| + | updatePosition(); | ||
| + | } | ||
| + | |||
| + | // ======================================================= | ||
| + | // POSITION | ||
| + | // ======================================================= | ||
| + | |||
| + | void updatePosition() | ||
| + | { | ||
| + | |||
| + | if (direction == 0) | ||
| + | posY++; | ||
| + | |||
| + | if (direction == 1) | ||
| + | posX++; | ||
| + | |||
| + | if (direction == 2) | ||
| + | posY--; | ||
| + | |||
| + | if (direction == 3) | ||
| + | posX--; | ||
| + | } | ||
| + | |||
| + | // ======================================================= | ||
| + | // DETECTION MURS | ||
| + | // ======================================================= | ||
| + | |||
| + | void scanWalls() | ||
| + | { | ||
| + | |||
| + | if (wallFront()) | ||
| + | setWall(direction); | ||
| + | |||
| + | if (wallLeft()) | ||
| + | setWall((direction + 3) % 4); | ||
| + | |||
| + | if (wallRight()) | ||
| + | setWall((direction + 1) % 4); | ||
| + | } | ||
| + | |||
| + | void setWall(int dir) | ||
| + | { | ||
| + | |||
| + | if (dir == 0) | ||
| + | maze[posX][posY].wallN = true; | ||
| + | |||
| + | if (dir == 1) | ||
| + | maze[posX][posY].wallE = true; | ||
| + | |||
| + | if (dir == 2) | ||
| + | maze[posX][posY].wallS = true; | ||
| + | |||
| + | if (dir == 3) | ||
| + | maze[posX][posY].wallW = true; | ||
| + | } | ||
| + | |||
| + | bool isWall(int dir) | ||
| + | { | ||
| + | |||
| + | if (dir == 0) | ||
| + | return maze[posX][posY].wallN; | ||
| + | |||
| + | if (dir == 1) | ||
| + | return maze[posX][posY].wallE; | ||
| + | |||
| + | if (dir == 2) | ||
| + | return maze[posX][posY].wallS; | ||
| + | |||
| + | if (dir == 3) | ||
| + | return maze[posX][posY].wallW; | ||
| + | |||
| + | return false; | ||
| + | } | ||
| + | |||
| + | // ======================================================= | ||
| + | // CAPTEURS DISTANCE | ||
| + | // ======================================================= | ||
| + | |||
| + | bool wallFront() | ||
| + | { | ||
| + | return distance(trigFront, | ||
| + | } | ||
| + | |||
| + | bool wallLeft() | ||
| + | { | ||
| + | return distance(trigLeft, | ||
| + | } | ||
| + | |||
| + | bool wallRight() | ||
| + | { | ||
| + | return distance(trigRight, | ||
| + | } | ||
| + | |||
| + | int distance(int trigPin, int echoPin) | ||
| + | { | ||
| + | |||
| + | digitalWrite(trigPin, | ||
| + | delayMicroseconds(2); | ||
| + | |||
| + | digitalWrite(trigPin, | ||
| + | delayMicroseconds(10); | ||
| + | |||
| + | digitalWrite(trigPin, | ||
| + | |||
| + | long duration = pulseIn(echoPin, | ||
| + | |||
| + | int d = duration * 0.034 / 2; | ||
| + | |||
| + | return d; | ||
| + | } | ||
| + | |||
| + | // ======================================================= | ||
| + | // MOTEURS | ||
| + | // ======================================================= | ||
| + | |||
| + | void forward() | ||
| + | { | ||
| + | |||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | |||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | |||
| + | delay(300); | ||
| + | |||
| + | stopMotors(); | ||
| + | } | ||
| + | |||
| + | void turnLeft() | ||
| + | { | ||
| + | |||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | |||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | |||
| + | delay(350); | ||
| + | |||
| + | stopMotors(); | ||
| + | } | ||
| + | |||
| + | void turnRight() | ||
| + | { | ||
| + | |||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | |||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | |||
| + | delay(350); | ||
| + | |||
| + | stopMotors(); | ||
| + | } | ||
| + | |||
| + | void stopMotors() | ||
| + | { | ||
| + | |||
| + | digitalWrite(IN1, | ||
| + | digitalWrite(IN2, | ||
| + | |||
| + | digitalWrite(IN3, | ||
| + | digitalWrite(IN4, | ||
| + | |||
| + | delay(100); | ||
| + | } | ||
| + | |||
| + | // ======================================================= | ||
| + | // DEBUG | ||
| + | // ======================================================= | ||
| + | |||
| + | void printMaze() | ||
| + | { | ||
| + | |||
| + | for (int y = SIZE - 1; y >= 0; y--) | ||
| + | { | ||
| + | |||
| + | for (int x = 0; x < SIZE; x++) | ||
| + | { | ||
| + | |||
| + | Serial.print(maze[x][y].distance); | ||
| + | Serial.print(" | ||
| + | } | ||
| + | |||
| + | Serial.println(); | ||
| + | } | ||
| + | |||
| + | Serial.println(); | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| [[https:// | [[https:// | ||
| Ligne 51: | Ligne 832: | ||
| <code txt algolaby00.txt> | <code txt algolaby00.txt> | ||
| - | il ne suffit pas de marcher en ligne droite. Il faut compter les changements de direction. | + | il ne suffit pas de marcher en ligne droite. Il faut compter les changements de |
| + | direction. | ||
| Supposons que, comme dans les exemples précédents, | Supposons que, comme dans les exemples précédents, | ||
| Ligne 61: | Ligne 843: | ||
| *1 Aller tout droit jusqu’au mur, passer à l’instruction 2 ; | *1 Aller tout droit jusqu’au mur, passer à l’instruction 2 ; | ||
| - | *2 Longer le mur par la droite (ou par la gauche, mais toujours dans le même sens) jusqu’à | + | *2 Longer le mur par la droite (ou par la gauche, mais toujours dans le même |
| - | ce que le décompte des changements de direction atteigne zéro, passer à l’instruction 1 ; | + | sens) jusqu’à ce que le décompte des changements de direction atteigne zéro, |
| + | passer à l’instruction 1 ; | ||
| Il faut répéter ces actions jusqu’à ce que l’on revienne à la lumière du jour. | Il faut répéter ces actions jusqu’à ce que l’on revienne à la lumière du jour. | ||
/home/chanteri/www/fablab37110/data/attic/vittascience/labyrinthe.1765702808.txt.gz · Dernière modification : de admin
