https://github.com/mat06mat/candy-crush
Projet ISN S2
https://github.com/mat06mat/candy-crush
Last synced: about 2 months ago
JSON representation
Projet ISN S2
- Host: GitHub
- URL: https://github.com/mat06mat/candy-crush
- Owner: MAT06mat
- Created: 2026-03-08T19:18:01.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2026-04-17T10:32:41.000Z (2 months ago)
- Last Synced: 2026-04-17T11:26:02.469Z (2 months ago)
- Language: Python
- Size: 14.5 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Candy Crush
> Projet ISN S2
>
> Groupe :
>
> - Matthieu
> - Théo
> - Arthur
Lien du repo github avec le code source : [https://github.com/MAT06mat/candy-crush](https://github.com/MAT06mat/candy-crush)
## Difficulté implémentée
La difficulté implémentée est le niveau 1, cependant, nous avons ajouté des bonus pour les bonbons :
Les bonbons rayés (h/v):


Les bonbons explosifs (p) :

Et le bonbon arc-en-ciel (r) :

Pour la grille, nous avons choisi de la représenter par une liste 2D de strings. Chacun des éléments de cette liste 2D est sur 2 caractères. La convention pour la grille est la suivante :
- Le premier caractère donne la couleur, "\_" si case vide ou "r" si bonbon arc-en-ciel
- Le deuxième caractère donne le bonnus, "\_" si aucun
- Les bonus sont : v - vertical / h - horizontal / p - explosif
Exemple :
- "0\_" le bonbon est normal de la première couleur
- "2v" le bonbon à un bonus vertical et est de la troisième couleur
- "r\_" c'est un bonbon arc-en-ciel, par convention on met sa couleur à "r" et on ne lui met pas de bonus
- "\_\_" est une case vide
## Algorithme en pseudo code
L'algorithme suivant sera ensuite placé dans la fonction `candy_crush`.
```txt
Charger la grille depuis le fichier csv
Afficher la grille
Tant que le jeu n'est pas bloqué et que l'utilisateur n'a pas atteint le nombre max d'iter :
Demander à l'utilisateur un mouvement
Jouer le coup
Enlever 1 aux coups restants
Tant que la grille n'est pas stable :
Calculer la nouvelle grille
Afficher la grille
```
Décomposition du calcul de la nouvelle grille :
```txt
Créer une nouvelle grille (duplication de la première)
Supprimer tous les bonbons qui forment une ligne de 3 par rapport à la première grille
Si bonbons supprimés :
Appliquer la gravité et descendre tous les bonbons volants
Remplir les emplacements vides par de nouveaux bonbons aléatoires
```
## Découpage fonctionnel (liste des fonctions)
| Fonction | Chargé de la réalisation | Terminé |
| -------------------------- | ------------------------ | ------- |
| charger_fichier | Tout le monde | Oui |
| jeu_est_bloque | Matthieu | Oui |
| afficher_grille | Arthur | Oui |
| demander_mouvement | Théo | Oui |
| echanger_deux_bonbons | Matthieu | Oui |
| grille_est_stable | Théo | Oui |
| calculer_nouvelle_grille | Arthur | Oui |
| dupliquer_grille | Théo | Oui |
| supprimer_bonbons_en_ligne | Matthieu | Oui |
| appliquer_gravite | Théo | Oui |
| ajouter_bonbons_aleatoires | Arthur | Oui |
Les sous-tâches sont dans le fichier `fonctions.py`.
## Les différents programmes
En exécutant `terminal.py` vous pourrez voir le jeu dans le terminal, sans interface graphique. Avec `app.py`, le jeu se lancera avec une interface graphique à condition que tous les fichiers soient bien présents dans le dossier racine. En lançant `tests.py`, vous pourrez observer les tests sur les fonctions du fichier `fonctions.py`.
## Tests
Pour les tests, nous avons utilisé la librairie built-in [unittest](https://docs.python.org/fr/3/library/unittest.html) qui permet de lancer les tests à notre place sans devoir appeler une à une les fonctions. Celle-ci se trouvent dans `tests.py`. Voici un exemple d'utilisation de `unittest`:
```py
from unittest import TestCase, main
from exemple import ajouter
# Définition de la classe pour faire des tests sur une fonction
class Ajouter(TestCase):
# Définition du cas numéro 1 : ajouter 1
def test_premier_cas_sur_cette_fonction(self):
a = 1
b = ajouter(a, 1)
self.assertEqual(a + 1, b) # S'assure que (a + 1) == b sinon, fait une erreur
def test_cas_2(self):
...
def test_cas_2(self):
...
# Lance tous les tests se trouvant dans les fonctions des classes au dessus de cette ligne
# Créé également automatiquement des erreurs si les tests ne sont pas bon
main()
```
Les fonctions se trouvents dans `fonctions.py` et les tests dans `test.py`
## Calcule de complexité de la fonction supprimer_bonbons_en_ligne
Les lignes précisées par la suite font référence au fichier `fonction_calcul_complexite.py`, pour éviter de devoir systématiquement modifier le numéro des lignes quand une fonction est modifiée dans le fichier `fonctions.py`.
Lignes 39-40 / 56-57: On observe une série de conditionnelles dépendantes, qui exécute au pire 2 doubles boucles for. Complexité de la fonction : o(n) = 2n^2
Lignes 101-102 : Dans cette double boucle for, contenant des conditionnels, qui renferment au pire une boucle for. Comme chacune de ces boucles for sont situés dans des conditionnelles dépendantes les unes des autres, on n'effectuera qu'une seule de ces boucles quand la fonction sera effectuée. Complexité de la fonction : o(n) = n^3 + 2n^2
Ligne 164-166-171 : On a respectivement une boucle while-for-for. Complexité de la fonction : o(n) = 2n^3 + 2n^2
Ligne 181-185 : On a deux boucles for simples : Complexité de la fonction : o(n) = 2n^3 + 2n^2 + 2n
On a donc finalement une complexité de la fonction de 2n^3 car 2n^2 + 2n est négligeable devant 2n^3. Soit o(2n^3).