Le sokoban est un concept de jeu vidéo simple, où l'on controle un personnage qui pousse des caisses sur des cibles.
Pour prendre en main la programmation C, j'ai récréé ce jeu lors du premier projet d'informatique du semestre.
Le premier language appris lors du BUT informatique est le C. J'ai appris les bases de l'algorithmiques, et le fonctionnement de la console python.
Un niveau de sokoban se présente comme une grille de cases, pouvant chacune contenir un mur, une caisse, une cible, ou le joueur.
Le joueur et les caisses peuvent être sur une caisse.
Le joueur doit se déplacer pour pousser chaque caisse sur une cible, en évitant les murs et les autres caisses.
Le plateau se présente comme une liste de listes de caractères. Chaque liste est une ligne, et chaque caractère le contenu d'une case. On peut donc afficher chaqu'un de ces caractères sur le terminal pour afficher le plateau.
Lorsque le personnage tente de bouger, on vérifie la case devans lui. Si c'est une case vide ou une cible, on l'avance. Si c'est un mur, il ne bouge pas. Si c'est une caisse, on tente la même chose pour la caisse devant lui, mais on la bloque si une caisse est devans. Un objet ne se déplace jamais réellement dans ce cas là. Il faut remplacer le joueur par une case vide, et remplacer sa destination par un joueur. Si le personnage pousse une caisse, pensez à déplacer la caisse avant le personnage ou l'un des deux finira par disparaitre.
La fonction getchar() permet de trouver la touche que le joueur appuie. Il suffit de la traduire en direction pour bouger le personnage.
La partie est gagnée si toutes les caisses sont sur une cible. Puisqu'il y a autant de cibles que de caisses, il suffit de scanner le plateau jusqu'à trouver une caisse sans cible ou une cible sans caisse. Si on arrive à la fin du plateau, c'est que toutes les caisses sont sur une cible, donc le jeu est gagné.
Les fonctions fopen(), fread(), fclose() permettent d'ouvrir, de lire, et de fermer un fichier. On peut s'en servir pour lire un fichier .sok contenant un plateau de départ, et rentrer ces informations dans le plateau.
Pour sauvegarder un plateau, on peut utiliser les mêmes fonction que précédemment, plus fwrite() pour écrire le plateau sur un fichier.
La fonction de reset reviens à recharger le fichier de niveau. Par contre, pour le undo, il faut garder en mémoire tous les déplacements du joueur, et les refaire en sens inverse. Une autre option plus simple consiste à enrgistrer le tableau à chaque mouvement, mais ça couterais beaucoup de mémoire.
Pour un premier projet, je me suis beaucoup appliqué, et je trouve le résultat très satisfaisant.
Vous pouvez retrouver la page git du projet ici: https://gitlab.com/some_random_guy/sokoban,
Et télécharger les fichiers ici
Ce projet a été une de mes premières expériences de développement, et m'a permi de prendre en main le C et l'environnement Linux, mais aussi VScode et git.
J'ai aussi pris l'habitude de garder mon code organisé, lisible et documenté.