× Aidez la recherche contre le COVID-19 avec votre ordi ! Rejoignez l'équipe PC Astuces Folding@home
 > Tous les forums > Forum Autres langages
 Créer un labyrinthe en C
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
loulou84
  Posté le 13/11/2010 @ 19:23 
Aller en bas de la page 
Petit astucien

Bonsoir,

j'ai un projet a rendre sur un robot parcourant un labyrinthe pour ramasser des billes!

1Ere étape: générer automatiquement le labyrinthe,

Sachant qu'il ne s'agit pas d'un labyrinthe avec une entrée et une sortie mais seulement un chemin avec les murs codés avec des 1 et les portes avec des 0.

http://technijardin.fr/projetinfo.png

Le labyrinthe ne doit pas avoir de partie inaccessible soit le cas suivant:

http://technijardin.fr/projetinfo1.png

Ce que je n'arrive pas a gérer c'est le cas ou les 0 sont entourés par des 1.

Comment faire, avez vous une idée?

Merci



Modifié par loulou84 le 13/11/2010 19:25
Publicité
loulou84
 Posté le 13/11/2010 à 20:04 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

ou si quelqu'un peut m'expliquer un peu mieux ce résultat:

http://www.cppfrance.com/forum/sujet-ALGORITHME-GENERER-LABYRINTHE-ALEATOIRE_1284500.aspx

merci

breizhbugs
 Posté le 13/11/2010 à 20:53 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
http://technijardin.fr/projetinfo1.png

Ce que je n'arrive pas a gérer c'est le cas ou les 0 sont entourés par des 1.

Comment faire, avez vous une idée?

Merci

Poste déjà le code que tu as fait pour que l'on voit ou tu en es...

loulou84
 Posté le 13/11/2010 à 20:59 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

int main()
{
int *ptr;
int Tab[lignes][colonnes];
ptr=&Tab[0][0];
creation_carte(ptr,lignes,colonnes);
afficher_carte(ptr,lignes,colonnes);
printf("\n");
afficher_carte2(ptr,lignes,colonnes);
}
void creation_carte (int *ptr, int nblignes, int nbcolonnes)
{
int i,j;
for(i=0;i<nblignes;i++)
{
for(j=0;j<nbcolonnes;j++)
{ //Un tableau à deux dimensions s'incrémente ligne par ligne, et non colonne par colonne: Tab[0][1], puis Tab[0][2],..., Tab[1][0],...
*(ptr+i*nbcolonnes+j)=rand()%2;//En mémoire, la tzbleau à deux dimensions ets stocké comme une suite dé'éléments, d'abord ceux de la première ligne, puis ceux de la deuxième, etc.
//Comme un pointeur pointe vers la mémoire, où notre tableau est rangé en une seule "colonne" (et ne peut donc pas être incrémenté selon deux dimensions, au contraire de Tab[][]), il faut
}
}
}
void afficher_carte(int *ptr, int nbLignes, int nbColonnes)
{
int i;
for(i=0;i<nbLignes*nbColonnes;i++)
{
if(i%(nbColonnes) == 0)
printf("\n");
printf(" %d ",*(ptr+i));
}
}
void afficher_carte2(int *ptr, int nbLignes, int nbColonnes)
{
int i;
for(i=0;i<nbLignes*nbColonnes;i++)
{
if(i%(nbColonnes) == 0)
printf("\n");
if(*(ptr+i)==1)
{
printf(" + ");
}
else
printf(" | ");
}
}

int main()

{

int *ptr;

int Tab[lignes][colonnes];

ptr=&Tab[0][0];

creation_carte(ptr,lignes,colonnes);

afficher_carte(ptr,lignes,colonnes);

printf("\n");

afficher_carte2(ptr,lignes,colonnes);

}

void creation_carte (int *ptr, int nblignes, int nbcolonnes)

{

int i,j;

for(i=0;i<nblignes;i++)

{

for(j=0;j<nbcolonnes;j++)

{

*(ptr+i*nbcolonnes+j)=rand()%2;

}

}

}

void afficher_carte(int *ptr, int nbLignes, int nbColonnes) // cette fonction me sert juste a voir la position des 0 et des 1

{

int i;

for(i=0;i<nbLignes*nbColonnes;i++)

{

if(i%(nbColonnes) == 0)

printf("\n");

printf(" %d ",*(ptr+i));

}

}

void afficher_carte2(int *ptr, int nbLignes, int nbColonnes)// c'est sur cette fonction que je bloque je sais que c'est pas du tout ça mais je voulais voir un peu!

{

int i;

for(i=0;i<nbLignes*nbColonnes;i++)

{

if(i%(nbColonnes) == 0)

printf("\n");

if(*(ptr+i)==1)

{

printf(" + ");

}

else

printf(" | ");

}

}

breizhbugs
 Posté le 13/11/2010 à 21:15 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Le labyrinthe ne doit pas avoir de partie inaccessible soit le cas suivant:

http://technijardin.fr/projetinfo1.png

tu as une règle à respecter pour construire ton labyrynthe et tu utilises une fonction aléatoire pour determiner si a la position carte[ligne][colonne] tu mets un mur ou pas?

void creation_carte (int *ptr, int nblignes, int nbcolonnes)

{

int i,j;

for(i=0;i<nblignes;i++)

{

for(j=0;j<nbcolonnes;j++)

{

*(ptr+i*nbcolonnes+j)=rand()%2;

}

}

}

loulou84
 Posté le 13/11/2010 à 21:22 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

oui mais en faite c'est ce que je ne saisie pas c'est dans qu'elle cas que je met un mur ou pas?

C'est pas le C en soit qui me bloque (comme la plupart du temps) mais plutôt un manque de compréhension!

Je regarde un peu ce que tu m'as dis et j'essaie de publier quelque chose de mieux!



Modifié par loulou84 le 13/11/2010 22:32
loulou84
 Posté le 13/11/2010 à 22:05 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

void creation_carte (int *ptr, int nblignes, int nbcolonnes)
{
int i=0,j=0;
for(i=0;i<nblignes;i++) // ca doit etre un contour fermé donc je met des 1 sur la premiere ligne.
{
*(ptr+i*nbcolonnes)=1;
}
for(j=0;j<nblignes;j++) // ca doit etre un contour fermé donc je met des 1 sur la premiere colonne.
{
*(ptr+j)=1;
}
for(i=0;i<nblignes;i++) // ca doit etre un contour fermé donc je met des 1 sur la derniere ligne.
{
*(ptr+i*nbcolonnes+(nbcolonnes-1))=1;
}
for(j=0;j<nbcolonnes;j++) // ca doit etre un contour fermé donc je met des 1 sur la derniere colonne.
{
*(ptr+(nblignes-1)*nbcolonnes+j)=1;
}
for(i=1;i<nblignes-1;i++) //-1 pour ne pas rechanger la valeur de mon contour deja fixé à 1.
{
for(j=1;j<nbcolonnes-1;j++)
{
*(ptr+i*nbcolonnes+j)=rand()%2;
}
}
}

void creation_carte (int *ptr, int nblignes, int nbcolonnes)

{

int i=0,j=0;

for(i=0;i<nblignes;i++) // ca doit etre un contour fermé donc je met des 1 sur la premiere ligne.

{

*(ptr+i*nbcolonnes)=1;

}

for(j=0;j<nblignes;j++) // ca doit etre un contour fermé donc je met des 1 sur la premiere colonne.

{

*(ptr+j)=1;

}

for(i=0;i<nblignes;i++) // ca doit etre un contour fermé donc je met des 1 sur la derniere ligne.

{

*(ptr+i*nbcolonnes+(nbcolonnes-1))=1;

}

for(j=0;j<nbcolonnes;j++) // ca doit etre un contour fermé donc je met des 1 sur la derniere colonne.

{

*(ptr+(nblignes-1)*nbcolonnes+j)=1;

}

for(i=1;i<nblignes-1;i++) //-1 pour ne pas rechanger la valeur de mon contour deja fixé à 1.

{

for(j=1;j<nbcolonnes-1;j++)

{

*(ptr+i*nbcolonnes+j)=rand()%2;

}

}

}

Pour l'intérieur du labyrinthe je n'est pas d'idée si tu peux m'en donner une, sans me donner le code s'il te plait?

breizhbugs
 Posté le 13/11/2010 à 23:24 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

En faite le lien que tu donnes au debut, il met des murs partout et essai ensuite de faire un chemin (en créant des impasses.)

loulou84
 Posté le 13/11/2010 à 23:54 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

peux tu m'expliquer comment il fait car je ne comprend pas quand il dit 8- ou ect...

Pense tu que c'est une bonne technique?

Les labyrinthes ne seront pas si différents que ça alors?

Publicité
breizhbugs
 Posté le 14/11/2010 à 11:41 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
loulou84 a écrit :

peux tu m'expliquer comment il fait car je ne comprend pas quand il dit 8- ou ect...

Pense tu que c'est une bonne technique?

Les labyrinthes ne seront pas si différents que ça alors?

Je vais plutot te renvoyer vers le wiki qui explique gif animés a l'appui: http://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe

il y a aussi http://ilay.org/yann/articles/maze/ (qui est presque pareil)

Pour que les labyrinthe soient different, le choix du mur a démolir est aleatoire mais uniquement par rapport a la position courante:

1-je cree une case libre +

#+##########

############

############

############

2- je regarde autour de moi: il n'y a que des murs

3- je choisis une direction (voila une direction plutot pas un mur), le sud

4- je creuse dans cette direction et j'y vais, cette case devient ma nouvelle position courante

#+##########

#+##########

############

############

5- je regarde autour de moi: il y a trois murs

-> je reprend au point 3, je choisi une direction (est) et je creuse

#+##########

#++#########

############

############

et ainsi de suite...

par contre il te faudra faire attention a comment tu consideres un mur: si un mur est une case tu peut te retrouver dans ce cas ou tu creer une piece:

#++#########

#++#########

############

############

cela te fera faire plus de test pour determiner une direction correcte.



Modifié par breizhbugs le 14/11/2010 11:53
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Les bons plans du moment PC Astuces

Tous les Bons Plans
49,99 €Casque audio sans fil Bluetooth Jabra Move Style Edition à 49,99 €
Valable jusqu'au 04 Décembre

Amazon fait une promotion sur le très bon casque audio sans fil Bluetooth Jabra Move Style Edition qui passe à 49,99 € alors qu'on le trouve ailleurs à plus de 70 €. La livraison est gratuite. Une bonne affaire pour un casque confortable et qui offre une bonne qualité sonore. Jusqu'à 14h d'autonomie. Un connecteur jack 3,5 mm est fourni pour utiliser le casque en filaire (dans l'avion par exemple).


> Voir l'offre
69 €SSD externe portable Samsung T5 500 Go à 69 €
Valable jusqu'au 04 Décembre

Amazon fait une promotion sur le SSD externe portable Samsung T5 500 Go qui passe à 69 € livré gratuitement alors qu'on trouve le SSD à 110 € ailleurs. Le disque SSD Samsung T5 portable est plus de deux fois plus petit que la taille de votre smartphone et fournit jusqu'à 5 fois la vitesse d'un disque dur portable. Apprenez à travailler en quelques secondes, transférez de grandes bibliothèques de vidéos et de photos à des vitesses pouvant atteindre 550 Mo/s. Vous ne craindrez pas de l'emporter partout avec vous grâce à sa conception robuste et résistante avec un coeur de SSD résistant aux chocs. Grâce à son interface USB-C, vous pouvez le brancher sur votre ordinateur, mais également sur un smartphone ou une tablette. Un câble USB-C vers USB-A (prise USB classique) est fourni.


> Voir l'offre
17,90 €Prise connectéeWi-Fi avec mesure de consommation TP-Link HS110 à 17,90 €
Valable jusqu'au 04 Décembre

Amazon fait une promotion sur la prise connectée Wi-Fi avec mesure de consommation TP-Link HS110 qui passe à 17,90 € alors qu'on la trouve habituellement autour de 40 €. Cette prise peut être contrôlée à distance en utilisant l'app gratuite KASA sur votre smartphone (iOS ou Android). Vous pouvez créer des planifications horaires pour allumer ou éteindre automatiquement et quand vous le souhaitez, l'appareil qui y est branché. Enfin, vous pourrez analyser en temps réel la consommation électrique d'un équipement et accèder à l'historique de la consommation. Elle est compatible Google Home, Amazon Alexa et IFTTT.


> Voir l'offre

Sujets relatifs
créer pop-up, bandeau ou ? dynamique
Créer un fichier init.lua
commande créer la fonction effacer image en VB10
dev-cpp créer librairie statique
créer une commande dans le menu clic droit
prog C faire choisir le nom du fichier à créer
Créer programme ou application pour tablette PC
créer fichier .gdb avec delphi
Créer un lien dans un texte
Créer un logiciel
Plus de sujets relatifs à Créer un labyrinthe en C
 > Tous les forums > Forum Autres langages