Un jeu de puzzle Sokoban complet développé en Python avec une approche modulaire pour la création de niveaux et de nombreuses fonctionnalités améliorées.
Sokoban ("gardien d'entrepôt" en japonais) est un jeu de puzzle classique où le joueur doit pousser des boîtes jusqu'à des emplacements cibles dans un entrepôt. Ce projet implémente le jeu avec:
- Un système de menu central (hub) pour naviguer entre les différentes fonctionnalités
- Un mode terminal pour jouer dans la console
- Un mode GUI utilisant Pygame pour une expérience graphique
- Un éditeur de niveaux graphique avec fonctionnalité drag-and-drop
- Un système de skins/sprites pour personnaliser l'apparence du jeu
- Un système de validation de niveaux pour vérifier qu'ils sont jouables
- Une structure modulaire permettant d'étendre facilement le jeu
- Support pour différentes dispositions de clavier (QWERTY et AZERTY)
Le projet est organisé de manière modulaire:
src/- Package principal contenant tout le code sourcecore/- Contient les classes de base et les constantesrenderers/- Contient les différents renderers (terminal, GUI)level_management/- Gestion des niveaux et collectionseditors/- Éditeurs de niveauxui/- Interface utilisateur et système de menugeneration/- Génération procédurale de niveauxmain.py- Point d'entrée unique pour toutes les versions du jeu
levels/- Répertoire contenant les fichiers de niveauxskins/- Répertoire contenant les différents thèmes visuels
Le système de menu central permet aux joueurs de naviguer facilement entre les différentes fonctionnalités du jeu:
- Jouer au jeu
- Éditer des niveaux
- Changer les paramètres
- Sélectionner des skins
- Voir les crédits
L'éditeur de niveaux graphique offre une interface intuitive pour créer et modifier des niveaux:
- Interface drag-and-drop pour placer les éléments
- Validation des niveaux pour s'assurer qu'ils sont jouables
- Test en direct des niveaux
- Sauvegarde et chargement des niveaux
Le système de skins permet de personnaliser l'apparence du jeu:
- Chargement de différents thèmes visuels
- Création de nouveaux thèmes
- Application des thèmes en temps réel
Le jeu dispose désormais d'un point d'entrée unique via le module src.main ou le script launch_game.py. Vous pouvez lancer différentes versions du jeu en utilisant l'option --mode.
Pour lancer le jeu avec toutes les fonctionnalités améliorées (mode par défaut):
python launch_game.pyou
python -m src.mainou explicitement:
python -m src.main --mode enhancedPour jouer en mode terminal:
python -m src.main --mode terminalPour jouer avec l'interface graphique:
python -m src.main --mode guiPour lancer l'éditeur de niveaux graphique:
python -m src.main --mode editorVous pouvez spécifier un répertoire de niveaux différent:
python -m src.main --levels chemin/vers/niveauxPour choisir une disposition de clavier spécifique (qwerty ou azerty):
python -m src.main --keyboard azertyToutes les options peuvent être combinées:
python -m src.main --mode gui --levels chemin/vers/niveaux --keyboard azertyPour voir toutes les options disponibles:
python -m src.main --help- Flèches directionnelles ou WASD: Déplacer le joueur
- R: Réinitialiser le niveau
- U: Annuler le dernier mouvement
- N: Niveau suivant (si le niveau actuel est terminé)
- P: Niveau précédent
- H: Afficher l'aide
- Q: Quitter le jeu
- J: Résoudre automatiquement le niveau (utilise le solveur Sokolution)
- F11: Basculer en mode plein écran
- G: Afficher/masquer la grille
- Flèches directionnelles ou ZQSD: Déplacer le joueur
- R: Réinitialiser le niveau
- U: Annuler le dernier mouvement
- N: Niveau suivant (si le niveau actuel est terminé)
- P: Niveau précédent
- H: Afficher l'aide
- A: Quitter le jeu
- J: Résoudre automatiquement le niveau (utilise le solveur Sokolution)
- F11: Basculer en mode plein écran
- G: Afficher/masquer la grille
- Clic gauche: Placer l'élément sélectionné
- Clic droit: Effacer l'élément (mettre un sol)
- Clic sur la palette: Sélectionner un élément
- Boutons:
- New: Créer un nouveau niveau
- Open: Ouvrir un niveau existant
- Save: Sauvegarder le niveau
- Test: Tester le niveau
- Validate: Vérifier si le niveau est valide
- Help: Afficher l'aide
- Exit: Quitter l'éditeur
Les niveaux sont stockés sous forme de fichiers texte dans le répertoire levels/. Chaque caractère représente un élément du jeu:
#- Mur- Sol vide@- Joueur$- Boîte.- Cible+- Joueur sur une cible*- Boîte sur une cible
Vous pouvez créer des niveaux manuellement en éditant ces fichiers ou utiliser l'éditeur de niveaux graphique inclus.
Ce projet nécessite:
- Python 3.6 ou supérieur
- Bibliothèque
keyboardpour le mode terminal - Bibliothèque
pygamepour le mode GUI et les fonctionnalités améliorées
Installation des dépendances:
pip install -r requirements.txt- Architecture modulaire séparant la logique du jeu, le rendu et les entrées utilisateur
- Système de chargement de niveaux à partir de fichiers texte
- Système de menu central (hub) pour naviguer entre les fonctionnalités
- Éditeur de niveaux graphique avec drag-and-drop
- Système de skins/sprites pour personnaliser l'apparence du jeu
- Validation des niveaux pour s'assurer qu'ils sont jouables
- Test en direct des niveaux
- Deux modes de jeu: terminal et GUI
- Support pour les dispositions de clavier QWERTY et AZERTY
- Système d'annulation des mouvements
- Statistiques de jeu (mouvements, poussées)
- Détection automatique de la complétion des niveaux
- Navigation entre les niveaux
- Solveur automatique de niveaux (Sokolution)
- Mode plein écran (F11)
- Affichage de grille optionnel
- Configuration personnalisable via fichier JSON
Le jeu intègre un solveur avancé basé sur les techniques de Sokolution:
- Plusieurs algorithmes de recherche (BFS, DFS, A*, IDA*, Greedy)
- Modes de recherche avant, arrière et bidirectionnel
- Heuristique avancée utilisant l'algorithme hongrois (couplage biparti)
- Table de transposition avec fonction de hachage
- Élagage PI-Corral
- Macro-mouvements
- Détection dynamique des impasses
Pour utiliser le solveur pendant le jeu, appuyez sur la touche J. Le solveur tentera de trouver une solution au niveau actuel et, s'il réussit, exécutera automatiquement les mouvements pour résoudre le niveau.
Le jeu utilise un fichier de configuration config.json qui permet de personnaliser divers aspects:
current_skin: Le thème visuel actueltile_size: Taille des tuiles en pixels
window_width: Largeur de la fenêtrewindow_height: Hauteur de la fenêtrefullscreen: Mode plein écran (true/false)
keyboard_layout: Disposition du clavier (azerty/qwerty)show_grid: Affichage de la grille (true/false)zoom_level: Niveau de zoommovement_cooldown: Délai entre les mouvements (en millisecondes)
Les touches peuvent être personnalisées dans la section keybindings du fichier de configuration.