119 lines
5.3 KiB
Markdown
119 lines
5.3 KiB
Markdown
# 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!
|