So Long est un jeu 2D développé en C utilisant la bibliothèque graphique MiniLibX. Ce projet fait partie du cursus de l'école 42 et consiste à créer un jeu de type "collecte et évasion" où le joueur doit récupérer tous les objets présents sur la carte avant de pouvoir s'échapper.
Le jeu propose une expérience immersive avec des sprites animés, des ennemis intelligents et un système de validation de cartes sophistiqué utilisant des algorithmes de pathfinding.
- Mouvement fluide : Déplacement du joueur dans 4 directions avec animations
- Collectibles animés : Bouteilles magiques avec effets visuels
- Ennemis intelligents : Fantômes avec IA de mouvement et détection de collision
- Système de progression : Compteur de mouvements affiché en temps réel
- Objectif clair : Collecter tous les objets avant d'atteindre la sortie
- Validation de cartes : Vérification automatique de la validité des niveaux
- Algorithme de pathfinding : Backtracking pour s'assurer qu'une solution existe
- Gestion mémoire optimisée : Allocation et libération propre des ressources
- Architecture modulaire : Code organisé en modules fonctionnels
- OS : Linux (testé sur Ubuntu/Debian)
- Compilateur : GCC ou Clang
- Make : Pour la compilation automatisée
# Installation des dépendances sur Ubuntu/Debian
sudo apt-get update
sudo apt-get install gcc make xorg libxext-dev libbsd-devgit clone [URL_DU_REPO]
cd so-long# Compilation complète (libft + MiniLibX + so_long)
make
# Nettoyage des fichiers objets
make clean
# Nettoyage complet
make fclean
# Recompilation complète
make re# L'exécutable so_long doit être créé à la racine
ls -la so_long./so_long maps/map_1.ber| Touche | Action |
|---|---|
W ou ↑ |
Déplacer vers le haut |
A ou ← |
Déplacer vers la gauche |
S ou ↓ |
Déplacer vers le bas |
D ou → |
Déplacer vers la droite |
ESC |
Quitter le jeu |
- Collecter tous les objets (bouteilles) présents sur la carte
- Éviter les ennemis (fantômes) qui patrouillent
- Atteindre la sortie (chaudron) une fois tous les objets récupérés
- Minimiser le nombre de mouvements pour un meilleur score
| Caractère | Élément | Description |
|---|---|---|
1 |
Mur | Obstacle infranchissable |
0 |
Sol | Espace libre de déplacement |
P |
Joueur | Position de départ (unique) |
C |
Collectible | Objet à récupérer |
E |
Sortie | Point d'arrivée (unique) |
M |
Ennemi | Fantôme mobile (optionnel) |
- ✅ La carte doit être rectangulaire
- ✅ Entourée de murs (
1) sur tous les bords - ✅ Contenir exactement un joueur (
P) et une sortie (E) - ✅ Contenir au moins un collectible (
C) - ✅ Tous les collectibles doivent être accessibles
- ✅ La sortie doit être accessible après collecte de tous les objets
1111111111111111
1P000000C0000001
1001110001110001
100101M001010001
100111000111M001
1C000000000000E1
1111111111111111
so-long/
├── srcs/
│ ├── main/ # Fonctions principales et initialisation
│ ├── parsing/ # Validation et lecture des cartes
│ ├── images/ # Gestion des sprites et textures
│ ├── enemy/ # Intelligence artificielle des ennemis
│ └── backtracking/ # Algorithmes de pathfinding
├── includes/ # Fichiers d'en-tête
├── graphics/ # Assets graphiques (XPM/PNG)
├── maps/ # Cartes de jeu et tests
├── libft/ # Bibliothèque personnelle
└── get_next_line/ # Lecture de fichiers ligne par ligne
- main.c : Point d'entrée et boucle de jeu
- init_*.c : Initialisation des structures et de MLX
- move.c : Gestion des déplacements du joueur
- render.c : Affichage et rendu graphique
- valid_map_*.c : Validation des cartes selon les règles
- charge_images_*.c : Chargement des sprites
- put_image_*.c : Affichage des éléments graphiques
- init_enemy.c : Initialisation des ennemis
- move_enemy.c : IA et déplacements des fantômes
- valid_path.c : Algorithme de recherche de chemin
- collectable.c : Vérification d'accessibilité des objets
- exitable.c : Vérification d'accessibilité de la sortie
Le jeu utilise des sprites personnalisés au format XPM :
- 4 directions : Haut, Bas, Gauche, Droite
- 3 frames d'animation par direction : Idle, Walk 1, Walk 2
- Style : Héros dans un environnement désertique
- 3 variations de bouteilles magiques flottantes
- Animation : Rotation et scintillement
- 4 états : Fermé, Ouvert basique, Ouvert avec étoiles, Ouvert avec effets
- Design : Chaudron magique
- 2 directions : Gauche et Droite
- 2 frames par direction pour l'animation
- Style : Fantômes du désert
Le code actuel présente quelques axes d'amélioration identifiés :
- Fonctions de mouvement : Optimiser
ft_move_1,ft_move_2,ft_move_3pour éviter les recalculs - Affichage : Utiliser
put_imageau lieu deput_mlx_imgpour réduire les lignes de code
- Système de score : Ajouter un classement basé sur le nombre de mouvements
- Niveaux de difficulté : Cartes avec différents niveaux de complexité
- Sons : Effets sonores pour les actions du jeu
map_1.beràmap_5.ber: Cartes valides de difficulté croissantemap_with_*.ber: Cartes invalides pour tester la validation
# Test avec une carte valide
./so_long maps/map_1.ber
# Test avec une carte invalide (doit afficher une erreur)
./so_long maps/map_with_no_path.berLe programme gère intelligemment les erreurs :
- ❌ Arguments invalides : Nombre incorrect d'arguments
- ❌ Fichier introuvable : Carte inexistante
- ❌ Format invalide : Extension non
.ber - ❌ Carte malformée : Ne respecte pas les règles
- ❌ Pas de solution : Aucun chemin valide trouvé
- ❌ Erreur MLX : Problème d'initialisation graphique
Etienne - edesaint@student.42.fr
Ce projet est développé à des fins éducatives dans le cadre de l'école 42.
Amusez-vous bien et que la collecte commence ! 🎮✨
