Contrôle Final 1 – Année 2018/2019
- Durée du CF: 1h30
- Tous les documents sont autorisés
- Vous avez à votre disposition le code des fichiers serveur_code_etudiant.h et serveur_code_etudiant.c
Echauffement (4 points)
Pour cet exercice, on considère le Makefile suivant:
(1 point)
Le fichier tools.c vient d'être modifié. Quelle(s) ligne(s) de commande sont/seront forcément exécutées si on lance la commande make ?
(1 point)
On souhaite pouvoir débugger le programme avec gdb en ayant accès aux symboles de debug. Que faut-il modifier dans le Makefile ?
(2 point)
Le compilateur affiche le message d'erreur suivant:
Sachant que la fonction foo est déclarée dans le fichier ../include/foo.h et implémenté dans le fichier ../lib/libplop.so, que faut-il faire pour corriger l'erreur ?
(barème: 2 points)
Il faut ajouter -L../lib -lplop lors de l'édition de liens:
Jeu par équipe (11 points)
Le but de cet exercice est d'ajouter une dimension ludique à la chatroom étudiée lors du cours intégré 10 en la transformant en un jeu dans lequel deux équipes s'affrontent. Les règles du jeu sont simples:
- Les deux équipent s'appellent blue et red ;
- Un client peut rejoindre une équipe en lançant la commande /join nom_équipe (où nom_équipe est soit blue, soit red) ;
- Lorsqu'un joueur rejoint une équipe, on lui attribue 100 points de vie ;
- Un joueur peut faire perdre 15 points de vie à un autre joueur en lançant la commande /attack nom_joueur (où nom_joueur est le nom du joueur attaqué) ;
- Un joueur peut faire gagner 5 points de vie à un autre joueur en lançant la commande /heal nom_joueur (où nom_joueur est le nom du joueur soigné) ;
- Lorsqu'un joueur n'a plus de point de vie, il est éliminé de la partie ;
- Une équipe gagne le match quand elle a éliminé tous les joueurs de l'équipe adverse.
Voici un exemple de partie:
Pour vous aider à implémenter, nous ajoutons les lignes suivantes dans le fichier server_code_etudiants.c afin de définir une structure player (représentant un joueur) et une structure team (représentant une équipe) :
/join (4 points)
Implémentez la fonction void process_cmd_join(client_t* client, char *param);. Cette fonction, qui est appelée lorsqu'un client lance la commande /join nom_equipe, doit ajouter le client à l'équipe nom_equipe et envoyer un message à tous, par exemple:
On considère que dans handle_incoming_cmd(), le code suivant a été ajouté:
/attack (4 points)
Implémentez la fonction void process_cmd_attack(client_t* client, char *param). Cette fonction, qui est appelée lorsqu'un client lance la commande /attack nom_joueur, doit rechercher le joueur nom_joueur parmi les équipes et lui faire perdre 15 points de vie. La fonction envoie également un message à tous les clients les informant de l'attaque, par exemple:
Si le joueur attaqué n'a plus de point de vie, la fonction appelle la fonction suivante: void player_is_dead(client_t* client, struct player* p, int team_number)
On considère que dans handle_incoming_cmd(), le code suivant a été ajouté:
player_is_dead (3 points)
Lorsqu'un joueur n'a plus de point de vie, la fonction void player_is_dead(client_t* client, struct player* p, int team_number) est appelée. Cette fonction doit:
- envoyer un message à tous les clients (par exemple : * Loana_le_puma [team blue] is now dead);
- décrémenter le nombre de joueurs de l'équipe;
- si l'équipe n'a plus de joueur vivant, afficher un message indiquant quelle équipe a gagné;
- créer un processus pour qu'il exécute update_death_statistics nom_joueur qui est chargé de mettre à jour des statistiques sur le nombre de morts des joueurs.
Compréhension de code (6 points)
Un développeur a ajouté la fonction process_cmd_mystery au fichier server_code_etudiant.c:
Cette fonction est appelée par la fonction handle_incoming_cmd:
Malheureusement, la fonction n'est pas documentée, et son nom n'est pas très explicite...
(4 points)
Cette fonction recherche dans le fichier stats.dat le nom passé en paramètre. Si le nom est trouvé, le compteur associé à ce nom est incrémenté et mis à jour dans le fichier, et un message est envoyé à tous.
Voici un exemple d'utilisation:
(2 points)
Que se passe-t-il si la valeur recherchée n'est pas trouvée ? Proposez une solution pour que dans ce cas, la valeur soit ajoutée au fichier.
Donnez les quelques lignes de code permettant d'implémenter votre solution et expliquez où elles doivent être insérées.