EPFL CS-112(j) POO

Course Website

Cours : Jeudi 8h15–9h00, CM 1 4

Exercices : Jeudi 9h15–11h, INF 3, BC 07-08

Accueil

Site Moodle

Tutoriels

Références

Séries

Projet

Midterm 2025

Solutions

Instructions

Plus exactement, voici toutes les consignes officielles qui s’appliquaient à ce midterm :

Sujet : Fiefs de lapins

Situation exemple

Dans le jeu de société Bunny Kingdom, les joueurs et joueuses incarnent des factions de lapins. Chaque faction contrôle des fiefs (anglais : fiefdom). Les fiefs rapportent des points de victoire en fonction des ressources qu’ils produisent (anglais : resource), et des tours de cités qu’ils contiennent (anglais : tower). Vous allez modéliser et implémenter les aspects nécessaires pour calculer les points produits par un fief.

Sauf mention contraire, les éléments du jeu ne changent pas au cours de la partie.

Il y a 5 types de ressources (anglais : resource kind) : bois, carotte, poisson, champignon et or (anglais : wood, carrot, fish, mushroom, gold). Les différents types de ressources n’ont pas de pouvoirs spéciaux, mais ils sont importants car les points sont comptés en fonction de nombre de ressources différentes produites par un fief.

Un fief est une liste de cases (anglais : square). Il y a 3 sortes de cases :

Sur les cases à ressources et sur les cases vides (mais pas sur les villages), on peut construire jusqu’à 1 bâtiment (anglais : building). La construction d’un bâtiment se fait pendant la partie ; une case peut donc commencer sans bâtiment et recevoir un bâtiment plus tard. Il y a 3 sortes de bâtiments :

Si une industrie ou un marché est construit sur une case à ressource, cette case peut (indirectement) produire deux types de ressources différents. On peut aussi construire une ville sur une case à ressource, auquel cas, indirectement, elle produit une ressource et apporte sa ou ses tours au décompte.

Le calcul des points totaux d’un fief se fait comme ceci :

Dans l’exemple en image, le fief produit 2 bois et 3 poissons (sur les cases), ainsi qu’un 1 or et 1 champignon (via des industries). Il a 2 villages, avec chacun 1 tour, ainsi que deux villes, qui ont respectivement 2 et 3 tours. On a donc un total de 4 ressources différentes et 7 tours. Sans compter le marché, cela devrait donner 28 points. Mais le fief contient aussi un marché, qui peut choisir de produire de la carotte. On a ainsi 5 types de ressources différents, et donc 35 points.

Questions

Quand vous définissez des classes, laissez de la place pour y ajouter des méthodes plus tard. Vous pouvez toujours les ajouter à un autre endroit si vous n’avez plus de place.

Remarque générale 1 : à tout moment, vous pouvez décider de “revenir en arrière” pour ajouter des méthodes ou des attributs à vos classes, si vous le désirez. Pensez à laisser de la place dans vos classes, au cas où. Vous pouvez toujours aussi définir plus de classes, de méhodes et de fonctions que demandé, bien entendu ! Les points par question sont donc un peu flexibles.

Remarque générale 2 : quand on dit qu’une fonction doit accepter un certain type de données $B$, il est permis de l’écrire de sorte qu’elle accepte en fait des valeurs de type $A$ à la place, du moment que $B <: A$.


1. Définissez (en Python) un type de données pour représenter un type de ressource (resource kind).


2. Définissez (en Python et/ou sous forme de diagramme) un ou des types de données pour représenter un bâtiment (building).


3. Définissez et implémentez (en Python) une fonction count_building_resources qui accepte une list de bâtiments, et qui renvoie le nombre de ressources différentes produites par ces bâtiments (c’est donc un entier). Ne vous préoccupez pas des cases dans cette question.

Commencez par définir votre fonction sans tenir compte des marchés (au moins sur votre brouillon). Ensuite, adaptez-là pour tenir compte de ce que les marchés peuvent apporter.


4. Définissez et implémentez (en Python) une fonction count_building_points qui accepte une list de bâtiments, et qui compte le nombre de points totaux que produiraient ces bâtiments. On peut imaginer qu’ils seraient tous construits dans un fief qui n’a que des cases vides.


5. Définissez (en Python et/ou sous forme de diagramme) un ou des types de données pour représenter une case (square).


6. Définissez et implémentez (en Python) une méthode attempt_build que l’on peut appeler sur une case, qui accepte en paramètre un bâtiment. Cette méthode essaye de construire le bâtiment donné sur la case. Elle doit échouer si la case est une case de village, ou si il y a déjà un bâtiment sur cette case. Elle renvoie True si elle a réussi, et False sinon. Cette fonction doit être la seule façon dont on peut construire un bâtiment sur une case.


7. Définissez et implémentez (en Python) une méthode count_square_resources qui accepte une list de cases, et qui renvoie le nombre de ressources différentes produites par ces cases (uniquement par les cases elles-mêmes ; pas par leurs bâtiments éventuels).


8. Définissez et implémentez (en Python) une méthode square_buildings qui accepte une list de cases, et qui renvoie une list de tous les bâtiments construits sur ces cases.


9. Finalement, définissez et implémentez (en Python) une méthode total_points qui accepte une list de cases (donc un fief), et qui renvoie le nombre total de points pour ce fief.