Skip to content
Snippets Groups Projects
Commit 963f1cdc authored by Belkaroui MohamedMoetez's avatar Belkaroui MohamedMoetez
Browse files

v2

parent 41c743bb
Branches main
No related tags found
No related merge requests found
......@@ -16,3 +16,21 @@
1704386369 source:c:\projet\drones\main.c
"jeu.h"
1704582964 source:c:\projet\drone\main.c
"jeu.h"
<math.h>
1704381401 c:\projet\drone\jeu.h
<stdio.h>
<stdlib.h>
<string.h>
<time.h>
<unistd.h>
<pthread.h>
<windows.h>
<conio.h>
1704299777 source:c:\projet\drone\utilitaire.c
"jeu.h"
<unistd.h>
......@@ -2,24 +2,24 @@
<CodeBlocks_layout_file>
<FileVersion major="1" minor="0" />
<ActiveTarget name="Debug" />
<File name="jeu.h" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="main.c" open="1" top="1" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="276" topLine="5" />
<Cursor1 position="2230" topLine="38" />
</Cursor>
</File>
<File name="main.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="msg" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3652" topLine="77" />
<Cursor1 position="42" topLine="0" />
</Cursor>
</File>
<File name="utilitaire.c" open="1" top="1" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="jeu.h" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5645" topLine="114" />
<Cursor1 position="276" topLine="0" />
</Cursor>
</File>
<File name="msg" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="utilitaire.c" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="42" topLine="0" />
<Cursor1 position="0" topLine="0" />
</Cursor>
</File>
</CodeBlocks_layout_file>
No preview for this file type
No preview for this file type
#include "jeu.h"
#include<math.h>
#define NUM_DRONES 1
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int drones_done = 0;
void clearScreen() {
system("cls");
}
......@@ -18,98 +16,99 @@ void* drone_thread(void* arg) {
Drone* drone = thread_args->liste_drones;
char** tableau = thread_args->tableau;
Dimension hl = thread_args->hl;
//Drone liste_drones;
// Boucle sur chaque commande du drone
pthread_mutex_lock(&mutex); // Verrouillage du mutex pour accder la variable partage
drones_done++; // Incrmentation du nombre de drones ayant termin
printf("Deplacement d'un drone en cours...\n");
pthread_cond_signal(&cond); // Signal envoy au thread d'affichage
pthread_mutex_unlock(&mutex); // Dverrouillage du mutex
int maxCommandes = 0;
for (int i = 0; i < drone->nombre_drones; ++i) {
printf("Déplacement du Drone %d en cours...\n", i + 1);
for (int j = 0; j < strlen(drone->commandes[i]); j++) {
pthread_mutex_lock(&mutex);
direction(drone, i, drone->commandes[i][j], tableau, hl);
ajout_Drones(*drone, tableau);
clearScreen(); // Efface l'écran avant chaque mise à jour de la carte
affichage_carte(hl, tableau);
pthread_mutex_unlock(&mutex);
usleep(900000); // Pause de 500 ms entre chaque déplacement
maxCommandes = fmax(maxCommandes, strlen(drone->commandes[i]));
}
// Boucle sur chaque commande de chaque drone, alternant entre les drones chaque itration
for (int j = 0; j < maxCommandes; j++) {
pthread_mutex_lock(&mutex);
for (int i = 0; i < drone->nombre_drones; ++i) {
if (j < strlen(drone->commandes[i])) {
direction(drone, i, drone->commandes[i][j], tableau, hl);
ajout_Drones(*drone, tableau);
clearScreen(); // Efface l'cran avant chaque mise jour de la carte
affichage_carte(hl, tableau);
}
}
pthread_mutex_unlock(&mutex);
usleep(900000); // Pause de 500 ms entre chaque dplacement
}
// Fin du mouvement, synchronisation avec le thread d'affichage
// Fin du mouvement, synchronisation avec le thread principal
pthread_mutex_lock(&mutex);
drones_done++;
printf("Le Drone a terminé son déplacement.\n");
printf("Le Drone a termine son dplacement.\n");
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
return (NULL);
return NULL;
}
void* display_thread(void* arg) {
ThreadArgs* thread_args = (ThreadArgs*)arg;
//ThreadArgs* thread_args = (ThreadArgs*)arg;
// Simulation de l'affichage continu de la carte
while (1) {
pthread_mutex_lock(&mutex);
while (drones_done < NUM_DRONES) {
while (drones_done < NUM_DRONES * 2) {
pthread_cond_wait(&cond, &mutex);
}
// Mettre à jour l'affichage de la carte
clearScreen(); // Efface l'écran avant chaque mise à jour de la carte
printf("Mise à jour de l'affichage de la carte...\n");
drones_done = 0; // Réinitialiser le compteur
affichage_carte(thread_args->hl, thread_args->tableau);
//printf("Mise a jour de l'affichage de la carte...\n");
//affichage_carte(thread_args->hl, thread_args->tableau);
pthread_mutex_unlock(&mutex);
break; // Ajout de cette ligne pour sortir de la boucle aprs l'affichage
}
pthread_exit(NULL);
}
int main() {
srand(time(NULL));
Dimension hl;
Drone liste_drones;
Lecture_fich("msg", &hl, &liste_drones);
// Lecture du fichier
Dimension hl;
Drone liste_drones;
Lecture_fich("msg", &hl, &liste_drones);
char** tableau = tableau_carte(hl);
ajout_Drones(liste_drones, tableau);
pthread_t drones;
pthread_t display;
// Création et affichage de la carte avec drones et obstacles
char** tableau = tableau_carte(hl);
ajout_Drones(liste_drones, tableau);
pthread_t drones[NUM_DRONES];
pthread_t display;
ThreadArgs thread_args = {hl, tableau, &liste_drones};
// Structure pour les arguments des threads
ThreadArgs thread_args = {hl, tableau, &liste_drones};
pthread_create(&drones, NULL, drone_thread, &thread_args);
pthread_create(&display, NULL, display_thread, &thread_args);
// Créer les threads des drones
for (int i = 0; i < NUM_DRONES; ++i) {
pthread_create(&drones[i], NULL, drone_thread, &thread_args);
}
pthread_join(drones, NULL);
pthread_join(display, NULL);
// Créer le thread d'affichage
pthread_create(&display, NULL, display_thread, &thread_args);
// Afficher les positions finales aprs la fin du dplacement
affichage(hl, liste_drones);
// Attendre la fin des threads des drones
for (int i = 0; i < NUM_DRONES; ++i) {
pthread_join(drones[i], NULL);
}
// Le programme ne devrait jamais atteindre ce point car le thread d'affichage boucle indéfiniment
pthread_cancel(display);
pthread_join(display, NULL);
// Affichage final des informations des drones
affichage(hl, liste_drones);
// Libération de la mémoire
for (int i = 0; i < hl.hauteur; i++) {
free(tableau[i]);
}
free(tableau);
for (int i = 0; i < hl.hauteur; i++) {
free(tableau[i]);
}
free(tableau);
// Libération de la mémoire allouée dans la structure Drone
for (int i = 0; i < liste_drones.nombre_drones; i++) {
free(liste_drones.commandes[i]);
}
free(liste_drones.positions);
free(liste_drones.commandes);
for (int i = 0; i < liste_drones.nombre_drones; i++) {
free(liste_drones.commandes[i]);
}
free(liste_drones.positions);
free(liste_drones.commandes);
return 0;
}
......
No preview for this file type
......@@ -20,48 +20,64 @@ void* drone_thread(void* arg) {
Drone* drone = thread_args->liste_drones;
char** tableau = thread_args->tableau;
Dimension hl = thread_args->hl;
Drone liste_drones;
// Boucle sur chaque commande du drone
pthread_mutex_lock(&mutex); // Verrouillage du mutex pour accéder à la variable partagée
drones_done++; // Incrémentation du nombre de drones ayant terminé
printf("Deplacement d'un drone en cours...\n");
pthread_cond_signal(&cond); // Signal envoyé au thread d'affichage
pthread_mutex_unlock(&mutex); // Déverrouillage du mutex
int maxCommandes = 0;
for (int i = 0; i < drone->nombre_drones; ++i) {
printf("Déplacement du Drone %d en cours...\n", i + 1);
for (int j = 0; j < strlen(drone->commandes[i]); j++) {
pthread_mutex_lock(&mutex);
direction(drone, i, drone->commandes[i][j], tableau, hl);
ajout_Drones(*drone, tableau);
clearScreen(); // Efface l'écran avant chaque mise à jour de la carte
affichage_carte(hl, tableau);
pthread_mutex_unlock(&mutex);
usleep(900000); // Pause de 500 ms entre chaque déplacement
maxCommandes = fmax(maxCommandes, strlen(drone->commandes[i]));
}
// Boucle sur chaque commande de chaque drone, alternant entre les drones à chaque itération
for (int j = 0; j < maxCommandes; j++) {
pthread_mutex_lock(&mutex);
for (int i = 0; i < drone->nombre_drones; ++i) {
if (j < strlen(drone->commandes[i])) {
direction(drone, i, drone->commandes[i][j], tableau, hl);
ajout_Drones(*drone, tableau);
clearScreen(); // Efface l'écran avant chaque mise à jour de la carte
affichage_carte(hl, tableau);
}
}
pthread_mutex_unlock(&mutex);
usleep(900000); // Pause de 500 ms entre chaque déplacement
}
// Fin du mouvement, synchronisation avec le thread d'affichage
// Fin du mouvement, synchronisation avec le thread principal
pthread_mutex_lock(&mutex);
drones_done++;
printf("Le Drone a terminé son déplacement.\n");
printf("Le Drone a termine son déplacement.\n");
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
return (NULL);
return NULL;
}
void* display_thread(void* arg) {
ThreadArgs* thread_args = (ThreadArgs*)arg;
// Simulation de l'affichage continu de la carte
while (1) {
pthread_mutex_lock(&mutex);
while (drones_done < NUM_DRONES) {
while (drones_done < NUM_DRONES * 2) {
pthread_cond_wait(&cond, &mutex);
}
// Mettre à jour l'affichage de la carte
clearScreen(); // Efface l'écran avant chaque mise à jour de la carte
printf("Mise à jour de l'affichage de la carte...\n");
drones_done = 0; // Réinitialiser le compteur
affichage_carte(thread_args->hl, thread_args->tableau);
//printf("Mise a jour de l'affichage de la carte...\n");
//affichage_carte(thread_args->hl, thread_args->tableau);
pthread_mutex_unlock(&mutex);
break; // Ajout de cette ligne pour sortir de la boucle après l'affichage
}
pthread_exit(NULL);
}
// Fonction pour diviser une chaîne en éléments et les stocker dans un tableau
......@@ -199,31 +215,22 @@ int main() {
// Création et affichage de la carte avec drones et obstacles
char** tableau = tableau_carte(hl);
ajout_Drones(liste_drones, tableau);
pthread_t drones[NUM_DRONES];
pthread_t drones;
pthread_t display;
// Structure pour les arguments des threads
ThreadArgs thread_args = {hl, tableau, &liste_drones};
// Créer les threads des drones
for (int i = 0; i < NUM_DRONES; ++i) {
pthread_create(&drones[i], NULL, drone_thread, &thread_args);
}
pthread_create(&drones, NULL, drone_thread, &thread_args);
// Créer le thread d'affichage
pthread_create(&display, NULL, display_thread, &thread_args);
// Attendre la fin des threads des drones
for (int i = 0; i < NUM_DRONES; ++i) {
pthread_join(drones[i], NULL);
}
// Le programme ne devrait jamais atteindre ce point car le thread d'affichage boucle indéfiniment
pthread_cancel(display);
pthread_join(display, NULL);
pthread_join(drones, NULL);
pthread_join(display, NULL);
// Affichage final des informations des drones
//affichage(hl, liste_drones);
char droneInfo[1024] = ""; // Vous pouvez ajuster la taille selon vos besoins
char droneInfo[1024] = "";
for (int i = 0; i < liste_drones.nombre_drones; ++i) {
sprintf(droneInfo + strlen(droneInfo), "Drone %d :\n", i + 1);
sprintf(droneInfo + strlen(droneInfo), "Position drone finale : (%d, %d, %c)\n",
......
No preview for this file type
20 20
0 5 N LMLMLMLMM
5 0 S MMRMMRMRRM
0 5 N MLMLMLML
5 0 S RMRMMRMRRM
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment