Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1365 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Déplacement bot surface

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Déplacement bot surface

n°2191278
netsen
Posté le 22-05-2013 à 10:47:34  profilanswer
 

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
mood
Publicité
Posté le 22-05-2013 à 10:47:34  profilanswer
 

n°2191306
Profil sup​primé
Posté le 22-05-2013 à 12:26:42  answer
 

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!

n°2191308
netsen
Posté le 22-05-2013 à 12:34:59  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Déplacement bot surface

 

Sujets relatifs
Déplacement de fichiers suivant une datedéplacement fichier sur lecteur réseau
Déplacement de plusieurs cellules avec Private sub Worksheets_Change[Powershell] Déplacement de groupe entre une OU et une OU
[VB2010] deplacement dans un textbox sélection toujours visibleTableau - revenir au début si déplacement trop grand
colorer surface bezier opengl C++[bat]Commande externe de copie,sauvegarde,déplacement,gestion d'images
[interface] Déplacement du double de pixelscript déplacement répertoire
Plus de sujets relatifs à : Déplacement bot surface


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR