Déplacement bot surface

Déplacement bot surface - C - Programmation

Marsh Posté le 22-05-2013 à 10:47:34    

Salut tout le monde

 

J'ai pour projet de réaliser en c, le déplacement d'un bot sur une surface inconnue.

 

La surface est un lieu contenant plusieurs pièces comme un plan de maison. Le bot connait sa position, mais le plan ne lui est pas connu à l'avance. Le but est de trouver la sortie unique et il ne la détecte que quand il la touche.

 

Le bot doit avoir un comportement simple : capteur à l'avant uniquement donc détection d'obstacle que lors de la rencontre avec celui ci lors d'un déplacement.

 

J'ai essayé de m'aider de personnes ayant eu un peu le même problème avec des labyrinthes sur les forums mais j'ai du mal à amorcer.

 

J'ai réussi à récupérer  la map qui se situe dans un fichier .h. Je l'ai initialisé en transformant le fichier initial contenant ligne à ligne le plan (entre guillemets) en tableau à deux dimensions.

 

Ensuite j'ai aussi fait la fonction pour que l'affichage se fait correctement dans le terminal du plan.

 

Dorénavant, j'essaye de faire bouger le robot, mais j'ai du mal à amorcer, si quelqu'un pouvait aider à me lancer.

 

Je procède également par compilation séparée dont voila les différents fichiers :

 

Fichier main.c

Code :
  1. #include "appart.h"
  2. #include "carte.h"
  3. #define TAILLE_CARTE 50
  4.  
  5. int main()
  6. {
  7. char map [TAILLE_CARTE][TAILLE_CARTE];
  8. init_carte (appart, map);
  9. affiche_carte(map);
  10. }
 

Fichier bot.c

Code :
  1. #include "robot.h"
  2.  
  3. void move_robot (Robot *robot, char map [][TAILLE_CARTE])
  4.     {
  5.     map[robot->y][robot->x]=' ';
  6.     
  7.     if (map[robot->y][robot->x+1]!='x')
  8.         {
  9.         robot->x++;
  10.         }
  11.     
  12.     else if (map[robot->y+1][robot->x]!='x')
  13.         {
  14.         robot->y++;
  15.         }
  16.  
  17.     else if (map[robot->y-1][robot->x]!='x')
  18.         {
  19.         robot->y--;
  20.         }
  21.     
  22.     else (map[robot->y][robot->x-1]!='x')
  23.         {
  24.         robot->x--;
  25.         }
  26.  
  27.     map[robot->y][robot->x]='R';
  28.     }
 

Fichier bot.h

Code :
  1. #ifndef ROBOT_H
  2. #define ROBOT_H
  3.  
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7.  
  8. # define MOVELEFT    0
  9. # define MOVERIGHT    1
  10. # define MOVEFORWARD 2
  11. # define MOVEBACK    3
  12. # define NBCOMMAND    4
  13.  
  14. #define TAILLE_CARTE 50
  15.  
  16. typedef struct
  17.     {
  18.     int x,y;
  19.     char direction; /*Nord,Est,Sud,West*/
  20.     } Robot;
  21.  
  22. void move_robot (Robot *robot, char map [][TAILLE_CARTE]);
  23.  
  24. /*case MOVELEFT:
  25.        funcMoveLeft();
  26.        break;
  27. case MOVERIGHT:
  28.        funcMoveRight();
  29.        break;
  30. case MOVEFORWARD:
  31.        funcMoveForward();
  32.        break;
  33. case MOVEBACK:
  34.        funcMoveBack();
  35.        break;*/
  36.  
  37. #endif
 

Fichier map.h

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. #define TAILLE_CARTE 50
  6.     
  7. void affiche_carte (char map [TAILLE_CARTE][TAILLE_CARTE]);
  8. void init_carte (char appart[], char map[][TAILLE_CARTE]);
 

Fichier map.c

Code :
  1. #include "carte.h"
  2.  
  3. void affiche_carte (char map [][TAILLE_CARTE])
  4.     {
  5.     int i=0, j=0;
  6.     
  7.     for(i=0;i<TAILLE_CARTE;i++)
  8.         {
  9.         for(j=0;j<TAILLE_CARTE;j++)
  10.             {
  11.                 printf("%c", map [i][j]);
  12.             }
  13.         printf("\n" );
  14.         }
  15.     }
  16.     
  17. void init_carte (char appart[], char map[][TAILLE_CARTE])
  18.     {
  19.     int i=0, j=0;
  20.         /*for (i=0; i<TAILLE_CARTE; i++)
  21.             {
  22.             for (j=0; j<TAILLE_CARTE; j++)
  23.                 {
  24.                 map[i][j]=appart[i][j];
  25.                 }
  26.             }*/
  27.     memcpy (map, appart,TAILLE_CARTE*TAILLE_CARTE);
  28.     }


Message édité par netsen le 22-05-2013 à 11:20:56
Reply

Marsh Posté le 22-05-2013 à 10:47:34   

Reply

Marsh Posté le 22-05-2013 à 12:26:42    

Salut,
 
Pour un algorithme puissant, je te conseille de vérifier toutes les cases autour de toi avant de te déplacer, puis de compter pour chaque case (sans obstacle, je parle) la distance de l'arrivée.
Si il y a des obstacles, c'est tout différent, et c'est carrément plus chiant, car pour une optimisation++, il faut le faire en récursif.
Là, tu peux te débrouiller en itératif.
 
Par exemple, tu fais des pointeurs sur fonction:
look_west; look_north; look_east; look_south qui prennent toutes en paramètre :
- ta carte
- la position x du robot
- la position y du robot
- évidemment, la position d'arrivée
- un int* qui représentera la case où la distance est la plus courte, sur laquelle il faudra que tu te déplaces (tu leur enverras l'adresse).
(l'int devra être initialisé à 999 par exemple)
 
Pour chaque fonction look_*, tu vas compter le nombre de cases de l'arrivée, puis tu le met dans cet int, que si cette valeur est inférieure à l'ancienne.
Il te faudrait une structure, dans laquelle tu mettrais cet int, avec en plus, un autre int, qui indiquerait, pour l'int donné, dans quelle direction aller (0, 1, 2, 3, respectivement west, north, east, south).
 
Je pense que tu as totu l'algo ici, mais rappelle toi que c'est valable que pour els maps sans obstacles!

Reply

Marsh Posté le 22-05-2013 à 12:34:59    

Merci

 

"puissant" je ne suis que débutant en première année donc si je peux éviter de faire compliqué.

 

"maps sans obstacles", c'est une map avec des pièces donc des murs internes, et il peut y avoir des ilots également.

 

Et je n'ai vu que le c pour l'instant, donc pas de C++

 

Je vais essayer de suivre tes consignes mais ce n'est pas gagné.


Message édité par netsen le 22-05-2013 à 12:39:38
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed