Documente Academic
Documente Profesional
Documente Cultură
Rapport de Projet
Kitty Wonderland
Tara Bahrami
Table des matières
1 Choix des types de données 2
1.1 Choix du plateau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Choix d’un joueur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Choix d’une carte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 La version de base 4
2.1 Les fonctions de base . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.1 L’effet des cartes . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.2 Modélisation de la main . . . . . . . . . . . . . . . . . . . . . 5
2.1.3 Mort d’un joueur . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Choix des différents modules . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Les difficultés rencontrées . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Achievement 1 6
3.1 Structure du deck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2 Déroulement du jeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.1 Modifications apportées . . . . . . . . . . . . . . . . . . . . . 6
3.2.2 Influence sur les autres fichiers . . . . . . . . . . . . . . . . . . 7
3.3 Les difficultés rencontrées . . . . . . . . . . . . . . . . . . . . . . . . 7
3.4 Gestion du Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4 Fonctions tests 8
1
Introduction
Dans le cadre du projet d’algorithmique et de programmation nous avons ici
travaillé sur un jeu nommé Kitty Wonderland. Ainsi, le but de ce projet est de mo-
déliser un jeu de société. En effet, Kitty Wonderland est un jeu de carte.
Tous les joueurs de la partie sont munis d’une jauge de points d’énergie, d’une
jauge d’idées, d’un gain mais également de cartes. Chaque joueur reçoit un nombre
fini de cartes. Il existe cinq types de cartes différentes : KITTY_THINK, KITTY_STEAL,
KITTY_PANACEA, KITTY_RAZOR, KITTY_HELL_IS_OTHERS. Ayant cha-
cune une rareté et un coût. Ainsi, chaque carte jouée a un impact sur le joueur et/ou
sur un adversaire. Un joueur meurt lorsque sa jauge d’énergie est inférieure ou égale
à zéro. Par conséquent, le jeu termine lorsqu’il ne reste plus qu’un joueur.
Il nous a été demandé de modéliser ce jeu sur des algorithmes rédigés en langage
C. Nous avons donc tout d’abord réfléchi aux éléments nécessaires à la définition
du plateau, d’un joueur et d’une carte. Dans un deuxième temps, nous avons pro-
grammé les fonctions de base c’est-à-dire les fonctions appliquant le traitement au
joueur selon la carte jouée. Enfin, nous avons codé un algorithme général faisant
tourner le jeu.
Ce rapport a pour but d’expliquer nos choix, nos démarches mais également des
certaines difficultés rencontrées.
Nous pouvons voir que le tableau de joueurs contient des éléments du type struct
joueur. Ce type sera explicité dans la partie suivante.
2
1.2 Choix d’un joueur
Comme nous l’avons vu dans l’introduction, tous les joueurs ont chacun une
jauge de points d’énergie, d’une jauge d’idées (autrement dit mana), d’un gain et de
cartes. Il nous a donc paru judicieux de modéliser le joueur à l’aide d’une structure
contenant toutes ces caractéristiques.
3
1.3 Choix d’une carte
Pour finir nous allons aborder la gestion des cartes. Comme dans les deux der-
nières sous parties nous avons choisi d’utiliser une structure pour modéliser ces
dernières.
Cette structure est très simple, elle comporte le type enum kittycarte et son coût
qui dépend de cette dernière.
2 La version de base
Comme nous l’avons vu dans la partie précédente, chaque joueur a une jauge de
points d’énergie, une jauge d’idée et d’un gain. En effet, avant de commencer le jeu,
chaque joueur reçoit par défaut cinquante points d’énergie, un point de gain et a sa
jauge d’énergie réduite à zéro. De plus, il tire cinq cartes dans le deck : dans le jeu
de base, le deck est simplement modélisé par un tirage de cartes aléatoire dépendant
de la rareté de cette dernière.
Dans cette partie, nous allons donc introduire les fonctions permettant de changer
les caractéristiques de chaque joueur.
4
La fonction cout prend en argument une kittycarte et renvoie son coût. La fonc-
tion action prend en argument une kittycarte et deux pointeurs sur la structure
joueur (le joueur à qui la kittycarte appartient et un joueur adversaire). Nous avons
choisi d’utiliser un pointeur sur joueur afin que les modifications sur le joueur dans
la fonction appelée soient répercutées sur le reste du programme.
5
3 Achievement 1
3.1 Structure du deck
Le deck a été modélisé par une structure liste_memento contenant une tableau
de struct cartes, un indice de début et un indice de fin du deck qui changent en
fonction de l’avancement du jeu. Le choix de cette modélisation a été fait de sorte
que la structure FIFO soit respectée et pour que la complexité ne soit pas très élevée
par rapport à d’autres solutions ; en effet, on aurait pu stocker les cartes jouées dans
un autre tableau, sauf que la manipulation de deux tableau implique l’utilisation
de deux boucles imbriquées, ce qui augmentera la complexité ( on aura donc une
complexité quadratique ), alors que dans notre cas la compléxité est linéaire.
Par conséquent la structure du joueur a dû être modifiée pour prendre en consi-
dération le nouveau modèle du deck, et ce en ajoutant un pointeur (*deck) sur la
structure liste mémento, ce qui permet au deck de garder l’état dans lequel il était
dans le dernier tour.
6
Figure 5 – Représentation du deck après que le joueur ait pioché une carte.
Figure 6 – Représentation du deck une fois que le joueur a fini de jouer le premier
tour.
7
sauf que l’on a appris par la suite de la part des encadrants que cette méthode
dépassait notre niveau en programmation et qu’on avait besoin des allocations de
la mémoire, il fallait donc utiliser des structures plus simples en manipulant des
tableaux. Néanmoins, ceci nous a permis de manipuler encore plus les pointeurs qui
nous paraissaient abstraits en cours de programmation impérative. Lors de la
compilation de deck_ach1, une erreur de segmentation a été signalée, on a donc
utilisé Valgrind pour essayer de comprendre l’erreur, on a remarqué ensuite qu’il
fallait initialiser le deck et les pointeurs. On a crée donc un tableau de struct carte
dont les indices représentent les identités des joueurs, et on a initialisé le pointeur
deck de sorte qu’il pointe vers la case du joueur correspondant.
4 Fonctions tests
Afin de valider chaque étape du jeu, il nous était demandé de créer un ficher test
pour vérifier le bon déroulement du jeu. Ainsi, pour chaque fonction utilisée dans le
fichier main.c nous avons créer des fonctions retournant des booléens. En effet, nous
avons testé l’égalité entre ce que la fonction à tester renvoie et ce qu’on est censé
obtenir.
Ces fonctions tests sont créées pour assurer le code. En effet, dans ces fonctions
on cherche à tester tous les cas possibles car notre code utilise des programmes du
type random qui ne testent donc pas forcément tous les cas possibles.
8
Conclusion
Nous nous sommes arrêtés à la fin de l’achievement 1 car nous avons