so_long
so_long est mon premier projet graphique du cursus 42 : un petit jeu 2D en C construit avec la MiniLibX. L’objectif est de manipuler des textures/sprites, d’ouvrir une fenêtre, de gérer des événements clavier/souris, et de développer un gameplay simple mais complet.
L’objectif est double :
- Apprendre les bases d’un moteur 2D “tile-based” : rendu, boucle d’événements, collisions.
- Écrire un programme robuste grâce à une validation stricte des cartes
.ber(format, règles, chemin jouable).
Principe
Le programme prend une carte .ber en argument et lance une partie :
- Parser la map et vérifier qu’elle respecte les règles (rectangulaire, murs, éléments obligatoires, etc.).
- Charger les textures et afficher la carte en vue 2D.
- Déplacer le joueur avec W/A/S/D (et/ou flèches selon ton implémentation).
- Empêcher le passage à travers les murs.
- Compter chaque mouvement et l’afficher (au minimum dans le shell).
- La partie est gagnée quand tous les collectibles
Csont récupérés et que le joueur atteint la sortieE.
Points importants
-
Map validation :
-
caractères autorisés :
0(vide),1(mur),C(collectible),E(exit),P(player) - exactement 1
P, exactement 1E, au moins 1C - map rectangulaire et fermée par des murs
- existence d’un chemin valide (collectibles + sortie accessibles)
-
Gestion des événements :
-
ESC et la croix de la fenêtre ferment proprement le programme
- Rendu : utilisation des images MiniLibX (tiles/sprites) + refresh propre.
Contraintes respectées
- Langage : C
- Lib graphique : MiniLibX
- I/O & erreurs :
open/close/read/write,perror/strerror,exit - Mémoire :
malloc/free(zéro leak) - Build : Makefile standard (pas de relink)
- Libft autorisée (si intégrée)
Ce que ça m’a apporté
so_long m’a appris à relier plusieurs briques “systèmes” dans un projet concret : parsing d’un format de fichier, validation stricte, gestion mémoire, rendu graphique, et boucle d’événements. C’est aussi un bon exercice d’architecture : séparer lecture/validation, état du jeu, rendu, et inputs pour garder un code lisible et évolutif.
Bonus
- Ennemis/patrouilles : le joueur peut perdre au contact.
- Animations de sprites.
- Compteur de mouvements affiché directement dans la fenêtre.
Objectif
Collecter tous les C de la carte puis atteindre la sortie E.
Contrôles
- Déplacements :
W,A,S,D(et/ou flèches si tu l’as ajouté) - Quitter :
ESCou fermeture de la fenêtre (croix)
Map .ber
Caractères autorisés :
0: case vide1: murC: collectibleE: sortieP: position de départ
Contraintes :
- 1
P, 1E, au moins 1C - carte rectangulaire
- carte fermée par des murs
- existence d’un chemin valide (jouable)
En cas d’erreur : quitter proprement avec Error\n + message explicite.
Découpage conseillé
- Parsing : lecture du fichier
.ber, création d’une grillechar** -
Validation :
-
forme rectangulaire
- bordures en
1 - comptage des éléments (
P/E/C) - caractères invalides
- validité du chemin (flood fill / BFS)
- Game state : position joueur, nb collectibles restants, compteur de moves
- Render : draw tile map + overlay joueur (sprites)
- Input : hooks MiniLibX (key press / close window)
Vérification du chemin (idée)
- Dupliquer la map en mémoire
- Lancer un flood fill depuis
P - Marquer tout ce qui est atteignable
-
Vérifier :
-
tous les
Catteignables Eatteignable
Gestion propre des ressources
- Libérer : map, textures/images MLX, window/display
- Gérer les erreurs tôt (fail fast) avec cleanup