diff --git a/Drones.depend b/Drones.depend index 4fb17ccf36083f0dea4fe37efb5d3b7af87b0060..a9f7579cf8f20145f22bbb0aa8303231b9528fda 100644 --- a/Drones.depend +++ b/Drones.depend @@ -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> + diff --git a/Drones.layout b/Drones.layout index 43602087c88a913bacba58169a7f6585b8ca3431..a6552c64dc801b99fb81d10ecfbde2077adc93ca 100644 --- a/Drones.layout +++ b/Drones.layout @@ -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> diff --git a/bin/Debug/Drones.exe b/bin/Debug/Drones.exe index 67169af73da02e7b49ecf65b3497b39d3fd51ff5..7cab517ac6bf86e1896e5fcc182d644d278ef7ed 100644 Binary files a/bin/Debug/Drones.exe and b/bin/Debug/Drones.exe differ diff --git a/client_udp.exe b/client_udp.exe index df8788d63420124b761f2a13843d15a6dcbcefe9..9f41f363bcdacd7a7e546573236315476544e303 100644 Binary files a/client_udp.exe and b/client_udp.exe differ diff --git a/main.c b/main.c index 4819062dd81b19c3343fa92d4fb5ecb4425c2064..1cf543d209c7129888a144553c3c3a8f82f22b75 100644 --- a/main.c +++ b/main.c @@ -1,14 +1,12 @@ #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 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; + //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); } 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 apr�s la fin du d�placement + 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; } diff --git a/obj/Debug/main.o b/obj/Debug/main.o index 8224b78f9e0abfb5c8e088d67504a412b5c53fb9..c3be021512241c5b462268c91b3c26887f3bbaee 100644 Binary files a/obj/Debug/main.o and b/obj/Debug/main.o differ diff --git a/serveur_udp.c b/serveur_udp.c index 1555091c8db64741ccf4d52dcacbd3658511b102..eb5ba8ffd62a398416a12876a0f0f204e004f8e8 100644 --- a/serveur_udp.c +++ b/serveur_udp.c @@ -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", diff --git a/serveur_udp.exe b/serveur_udp.exe index 70e815f5a7e224c8fe453fb30479f134fed855b3..410ed5b339391024b3faffc65ce63eebf3def130 100644 Binary files a/serveur_udp.exe and b/serveur_udp.exe differ diff --git a/test.txt b/test.txt index 413a78dfa9d64240d0a6af392b7b05f72f2d1165..dd8ba099993420e99ce5db3bcd5b5a5b57546969 100644 --- a/test.txt +++ b/test.txt @@ -1,4 +1,4 @@ 20 20 -0 5 N LMLMLMLMM -5 0 S MMRMMRMRRM +0 5 N MLMLMLML +5 0 S RMRMMRMRRM