{"id":49626780,"url":"https://github.com/mat06mat/candy-crush","last_synced_at":"2026-05-05T08:03:01.758Z","repository":{"id":344871419,"uuid":"1176216518","full_name":"MAT06mat/candy-crush","owner":"MAT06mat","description":"Projet ISN S2","archived":false,"fork":false,"pushed_at":"2026-04-17T10:32:41.000Z","size":15255,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-17T11:26:02.469Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MAT06mat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-08T19:18:01.000Z","updated_at":"2026-04-17T10:32:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/MAT06mat/candy-crush","commit_stats":null,"previous_names":["mat06mat/candy-crush"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MAT06mat/candy-crush","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MAT06mat%2Fcandy-crush","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MAT06mat%2Fcandy-crush/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MAT06mat%2Fcandy-crush/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MAT06mat%2Fcandy-crush/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MAT06mat","download_url":"https://codeload.github.com/MAT06mat/candy-crush/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MAT06mat%2Fcandy-crush/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32640538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"online","status_checked_at":"2026-05-05T02:00:06.033Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-05T08:02:59.365Z","updated_at":"2026-05-05T08:03:01.745Z","avatar_url":"https://github.com/MAT06mat.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Candy Crush\n\n\u003e Projet ISN S2\n\u003e\n\u003e Groupe :\n\u003e\n\u003e - Matthieu\n\u003e - Théo\n\u003e - Arthur\n\nLien du repo github avec le code source : [https://github.com/MAT06mat/candy-crush](https://github.com/MAT06mat/candy-crush)\n\n## Difficulté implémentée\n\nLa difficulté implémentée est le niveau 1, cependant, nous avons ajouté des bonus pour les bonbons :\n\nLes bonbons rayés (h/v):\n\n![image](v2/assets/candies/red-h.png)\n![image](v2/assets/candies/red-v.png)\n\nLes bonbons explosifs (p) :\n\n![image](v2/assets/candies/red-p.png)\n\nEt le bonbon arc-en-ciel (r) :\n\n![image](v2/assets/candies/rainbow.png)\n\nPour 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 :\n\n- Le premier caractère donne la couleur, \"\\_\" si case vide ou \"r\" si bonbon arc-en-ciel\n\n- Le deuxième caractère donne le bonnus, \"\\_\" si aucun\n\n- Les bonus sont : v - vertical / h - horizontal / p - explosif\n\nExemple :\n\n- \"0\\_\" le bonbon est normal de la première couleur\n\n- \"2v\" le bonbon à un bonus vertical et est de la troisième couleur\n\n- \"r\\_\" c'est un bonbon arc-en-ciel, par convention on met sa couleur à \"r\" et on ne lui met pas de bonus\n\n- \"\\_\\_\" est une case vide\n\n## Algorithme en pseudo code\n\nL'algorithme suivant sera ensuite placé dans la fonction `candy_crush`.\n\n```txt\nCharger la grille depuis le fichier csv\nAfficher la grille\nTant que le jeu n'est pas bloqué et que l'utilisateur n'a pas atteint le nombre max d'iter :\n    Demander à l'utilisateur un mouvement\n    Jouer le coup\n    Enlever 1 aux coups restants\n    Tant que la grille n'est pas stable :\n        Calculer la nouvelle grille\n        Afficher la grille\n```\n\nDécomposition du calcul de la nouvelle grille :\n\n```txt\nCréer une nouvelle grille (duplication de la première)\nSupprimer tous les bonbons qui forment une ligne de 3 par rapport à la première grille\nSi bonbons supprimés :\n    Appliquer la gravité et descendre tous les bonbons volants\n    Remplir les emplacements vides par de nouveaux bonbons aléatoires\n```\n\n## Découpage fonctionnel (liste des fonctions)\n\n| Fonction                   | Chargé de la réalisation | Terminé |\n| -------------------------- | ------------------------ | ------- |\n| charger_fichier            | Tout le monde            | Oui     |\n| jeu_est_bloque             | Matthieu                 | Oui     |\n| afficher_grille            | Arthur                   | Oui     |\n| demander_mouvement         | Théo                     | Oui     |\n| echanger_deux_bonbons      | Matthieu                 | Oui     |\n| grille_est_stable          | Théo                     | Oui     |\n| calculer_nouvelle_grille   | Arthur                   | Oui     |\n| dupliquer_grille           | Théo                     | Oui     |\n| supprimer_bonbons_en_ligne | Matthieu                 | Oui     |\n| appliquer_gravite          | Théo                     | Oui     |\n| ajouter_bonbons_aleatoires | Arthur                   | Oui     |\n\nLes sous-tâches sont dans le fichier `fonctions.py`.\n\n## Les différents programmes\n\nEn 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`.\n\n## Tests\n\nPour 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`:\n\n```py\nfrom unittest import TestCase, main\nfrom exemple import ajouter\n\n\n# Définition de la classe pour faire des tests sur une fonction\nclass Ajouter(TestCase):\n    # Définition du cas numéro 1 : ajouter 1\n    def test_premier_cas_sur_cette_fonction(self):\n        a = 1\n        b = ajouter(a, 1)\n        self.assertEqual(a + 1, b) # S'assure que (a + 1) == b sinon, fait une erreur\n\n    def test_cas_2(self):\n        ...\n\n    def test_cas_2(self):\n        ...\n\n\n# Lance tous les tests se trouvant dans les fonctions des classes au dessus de cette ligne\n# Créé également automatiquement des erreurs si les tests ne sont pas bon\nmain()\n```\n\nLes fonctions se trouvents dans `fonctions.py` et les tests dans `test.py`\n\n## Calcule de complexité de la fonction supprimer_bonbons_en_ligne\n\nLes 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`.\n\nLignes 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\n\nLignes 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\n\nLigne 164-166-171 : On a respectivement une boucle while-for-for. Complexité de la fonction : o(n) = 2n^3 + 2n^2\n\nLigne 181-185 : On a deux boucles for simples : Complexité de la fonction : o(n) = 2n^3 + 2n^2 + 2n\n\nOn 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).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmat06mat%2Fcandy-crush","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmat06mat%2Fcandy-crush","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmat06mat%2Fcandy-crush/lists"}