diff --git a/README.md b/README.md new file mode 100644 index 0000000..130cbf4 --- /dev/null +++ b/README.md @@ -0,0 +1,118 @@ +# Table des Matières +- 🇫🇷 French + 1. [Rapport](#rapport) + 2. [Modélisation du jeu et décision de structure](#modélisation-du-jeu-et-décision-de-structure) + 3. [Comment lancer le jeu ?](#comment-lancer-le-jeu-) + 4. [Les contrôles](#les-contrôles) + 5. [Pour aller plus loin](#pour-aller-plus-loin) +- 🇬🇧 English + 1. [Report](#report) + 2. [Game Modeling and Design Decisions](#game-modeling-and-design-decisions) + 3. [How to Run the Game?](#how-to-run-the-game) + 4. [Controls](#controls) + 5. [Going Further](#going-further) + + +# Rapport + +## Modélisation du jeu et décision de structure + +Nous avons choisi d'utiliser Doxygen pour faire une documentation de notre code. La majorité de ce PDF est la documentation de notre code. + +Nous sommes partis sur un tableau 2D de `char` afin de représenter notre plateau. Nous avons utilisé des `char` car on sait qu'on n'a pas besoin de plus de possibilités de nombre qu'un octet. Nous avons fait des `define` qui permettent de définir quels nombres correspondent à quel objet dans le jeu (joueur, caisse, mur, ...). + +Nous avons ensuite créé une structure `coor` qui représente des coordonnées x et y. Cela est pratique pour naviguer dans le tableau 2D. + +Nous utilisons une structure de score qui contient tout ce qu'il faut pour calculer le score à la fin de la partie : le temps avant et après la partie (pour obtenir le temps passé), le nombre de déplacements du joueur ainsi que ceux des caisses. + +Pour finir, nous avons créé une structure `dis` contenant tout ce qu'il faut pour l'affichage SDL : `window`, `renderer`, taille de la fenêtre, taille des boîtes et taille du menu. La fenêtre s'adapte à n'importe quel écran. + +## Comment lancer le jeu ? + +Il vous faut installer SDL2, SDL2 Mixer, SDL2 Image, SDL2 TTF, `make` et `gcc`. + +```bash +make all +./sokoban +``` + +## Les contrôles + +* `zqsd` pour se déplacer +* `Échap` pour sortir du niveau +* `Entrée` pour sélectionner le niveau à jouer + +## Pour aller plus loin + +1. Tous nos niveaux sont stockés dans des fichiers `.txt` dans le dossier `map`. Les fichiers `original_X` sont au nombre de trois et représentent des niveaux construits manuellement. Les fichiers `custom_X` sont les niveaux créés avec l'éditeur intégré. +2. Nous avons fait un affichage de score en fin de niveau prenant en compte : + + * le temps passé + * le nombre de mouvements du joueur + * le nombre de mouvements des caisses + * la réussite du niveau +3. Affichage en temps réel du chronomètre, des déplacements du joueur et des caisses. +4. Menu permettant de sélectionner un niveau et de le lancer. Les niveaux originaux sont représentés par un escalier blanc, les niveaux créés par l’éditeur par un escalier noir. +5. La partie s’arrête automatiquement si le joueur ne peut plus gagner. Il peut alors observer son score. +6. Éditeur de niveau intégré : + + * Déplacement du personnage avec `zqsd` + * Clic gauche pour placer un objet, clic droit pour placer l’objet précédent + * Sauvegarde automatique lors de la sortie, niveau ajouté au menu principal + * Pour modifier un niveau après sauvegarde, il faut éditer le fichier `.txt` manuellement +7. Effets visuels supplémentaires : végétation générée avec seed, sprites différents selon direction du personnage, menu des titres + +Bon jeu ! + +--- + +# Report + +## Game Modeling and Structure Decisions + +We chose to use Doxygen to create a documentation of our code. Most of this PDF is the code documentation itself. + +We used a 2D `char` array to represent our game board. We chose `char` since we don’t need more values than a byte. We defined constants (`#define`) to map numbers to game objects (player, box, wall, etc.). + +We then created a `coor` structure to represent x and y coordinates, which is useful for navigating the 2D array. + +We also have a score structure that tracks everything needed to compute the score at the end of the game: start and end time (to get total duration), number of player moves, and number of box moves. + +Finally, we created a `dis` structure to hold all SDL display elements: `window`, `renderer`, window size, box size, and menu size. The window adapts to any screen size. + +## How to Run the Game + +You need SDL2, SDL2 Mixer, SDL2 Image, SDL2 TTF, `make`, and `gcc`. + +```bash +make all +./sokoban +``` + +## Controls + +* `zqsd` to move +* `Escape` to exit the level +* `Enter` to select and start the level + +## Going Further + +1. All levels are stored in `.txt` files in the `map` folder. Files `original_X` are three manually created levels. Files `custom_X` are levels created with the built-in editor. +2. End-of-level score display includes: + + * time spent + * player moves + * box moves + * level completion +3. Real-time display of timer, player moves, and box moves +4. Menu for selecting and starting a level. Original levels use a white staircase icon; custom levels use a black staircase icon +5. The game ends automatically if the player can no longer win, allowing them to view their score +6. Built-in level editor: + + * Move character with `zqsd` + * Left click to place an object, right click to revert previous object + * Automatic save on exit; level added to main menu + * To edit a saved level, modify the `.txt` file manually +7. Additional visual effects: ground vegetation generated via seed, different sprites for character directions, title menu + +Enjoy the game!