Programmation impérative, projet 2020

Dates et principe

Cette page peut être mise à jour, avec informations complémentaires, précisions, questions bonus, etc. Pensez à y revenir souvent.

Projet à rendre pour le 4/1/2020 à 23h59, aucun retard ne sera toléré.
Des soutenances pourront être organisées ensuite.

Lire tout le sujet.

Un rendu de projet comprend : Avez-vous lu tout le sujet ?

Protocole de dépôt

Vous devez rendre

rassemblés dans une archive tar gzippée identifiée comme votre_prénom_votre_nom.tgz.
La commande devrait ressembler à :
tar zcvf randolph_carter.tgz rapport.pdf fichiers.c autres_truc_éventuels.c
N'OUBLIEZ surtout PAS de mettre le nom identifiant l'archive (donc nouveau) en PREMIER.
Lisez le man ! et testez le contenu de votre archive (une commande comme par exemple :
tar tvf randolph_carter.tgz doit lister les fichiers et donner leur taille).

Toute tentative de fraude (plagiat, etc.) sera sanctionnée. Si plusieurs projets ont des sources trop similaires (y compris sur une partie du code uniquement), tous leurs auteurs se verront attribuer la note 0/20. En particulier, il faudra prendre soin de ne pas publier son travail sur un dépôt public (en tout cas pas avant la date de fin de rendu). On évitera également de demander (ou de donner) des conseils trop précis à ses camarades (y compris des promotions précédentes), ces conseils ayant pu être donnés à plusieurs personnes. Les rendus seront comparés deux à deux.

Procédure de dépôt
Vous devez enregistrer votre archive tgz dans le dépôt dédié au cours IPI (ipi-2020) en vous connectant à http://exam.ensiie.fr. Ce dépôt sera ouvert jusqu'au 4 janvier inclus.


Contexte

Le but de ce projet est d'implanter une plateforme de jeu de plateau.

Ce jeu se présente sous la forme d'un plateau de taille n×n dans lequel sont placés des piles de jetons de couleur, chaque joueur possédant une couleur différente. Initialement aucun jeton n'est présent.

Le jeu se joue à un nombre quelconque de joueurs qui jouent chacun à tour de rôle.

Le but du jeu est d'avoir le plus possible de jetons de sa couleur en haut des piles une fois que le plateau est complètement rempli.

Fonctionnement

Interface

On travaille dans un premier temps en mode texte.

Au début de la partie, on demande le nombre j de joueurs, puis la taille du plateau n. Chaque joueur est identifié par un entier entre 1 et j qui est sa couleur.

À chaque tour du joueur i,

Si le plateau est rempli, c'est-à-dire qu'il y a au moins un jeton sur chaque case, alors on compte le nombre de jetons au sommet des cases pour chaque joueur et c'est celui qui en a le plus qui gagne.

Exemple d'affichage attendu (n = 5) :


Tour du joueur 1.
  
 |1 2 3 4 5
-+---------
1|  1 1 1
2|1 3     1
3|1 3 3 3 
4|1   2 3 2
5|  2 1 3

Quelle case choisissez-vous ?
5 2

 2
 3
---

Voulez-vous mettre le jeton ici ?
n

Tour du joueur 1.
  
 |1 2 3 4 5
-+---------
1|  1 1 1
2|1 3     1
3|1 3 3 3 
4|1   2 3 2
5|  2 1 3

Quelle case choisissez-vous ?
3 2

 3
 1
 2
 1
---

Voulez-vous mettre le jeton ici ?
o 

Tour du joueur 2.

 |1 2 3 4 5
-+---------
1|  1 1 1
2|1 3     1
3|1 1 3 3 
4|1   2 3 2
5|  2 1 3


Votre programme lira les commandes sur l'entrée standard. En particulier, il devra fonctionner correctement en lisant le fichier suivant partie.txt en entrant

./mon_programme < partie.txt    

Conseils

Pour la récupération d'une entrée de l'utilisateur, plutôt que faire un scanf directement, il vaut mieux récupérer une ligne en entier avec fgets puis utiliser sscanf dessus ;on peut utiliser la suite de commandes suivantes :
char buf[256];
 .
 .
 .
fgets(buf, 256, stdin);
sscanf(buf, "format", ...);
Vous devez avoir lu jusqu'ici avant de commencer.