DM 3 (MP2I 2021-2022) — Projet des vacances d'hiver¶
Devoir à la maison · MP2I · 2021-2022 · OCaml
Cours : Programmation impérative
Instructions et exemples pour le projet des MP2I du CIV (dépôt framagit.org/mdefalco/projet_mp2i).
Description du projet¶
Le projet « vacances d'hiver » consiste à réaliser un jeu par groupe de deux ou trois élèves.
L'idée est de pratiquer l'informatique sur un programme avec plus de programmation élémentaire, pas de révolutionner le monde du jeu vidéo.
Je vous suggère donc de partir sur un projet pas forcément très ambitieux et de vous concentrer sur le gameplay plus que sur les graphismes. L'écueil à éviter c'est de passer tout votre temps à faire un magnifique affichage et de n'avoir aucun temps restant pour le jeu en lui-même. L'autre manière d'éviter de perdre trop de temps est de ne pas faire un jeu temps réel mais en tour par tour. Cela permet d'avoir une boucle interactive assez simple : on affiche, on lit l'entrée, on calcule le prochain état du jeu, et on répète. L'avantage étant que tout le monde joue par intervalle de temps discret, et c'est beaucoup plus simple.
Quand on parle de jeu, cela peut être un jeu de réflexion ou un casse-tête. La dimension ludique n'est pas forcément la plus importante.
On essaiera de faire en sorte de dégager des parties algorithmiques intéressantes :
- dans un jeu à deux joueurs cela peut être de faire une IA pour l'adversaire
- s'il y a un système de grille, réaliser des recherches de chemins, de visibilité, ...
- Développer une notion de données procédurales : niveaux, ennemis aléatoires
Des idées de jeux simples :
- Tetris ou autres
- Aventure en mode texte : Zork, ...
- Roguelike en console : Nethack, Dwarf Fortress, ...
- Jeux multi simples comme Bomberman
Installation d'OCaml¶
On va avoir besoin d'utiliser OCaml avec un environnement permettant de développer, d'installer des programmes et de compiler des exécutables.
- Sous Windows :
- Installez https://fdopen.github.io/opam-repository-mingw/installation/ en prenant l'installeur graphique 64 bit (ou 32 bit si vous avez une vieille machine). Attention c'est long.
- Vous avez maintenant un
Terminal Cygwinqui vous permet d'accéder à un pseudo système Unix déjà configuré pour faire duOCaml. - Tapez dans le terminal
opam install dune graphics - Attention vos fichiers sont accessibles dans
C:\OCaml64\home\utilisateur\
- Sous Linux : il faut installer
opamavec votre distribution - Sous OSX :
- Installez https://brew.sh/
- une fois que c'est fait vous pouvez installer
opamavecbrew install opam
Récupérer ces fichiers¶
- Vous pouvez taper
git clone https://framagit.org/mdefalco/projet_mp2i.git
Compiler des programmes avec dune¶
On va utiliser dune pour compiler des programmes. C'est un peu une variante évoluée de make adaptée à OCaml. Dans le répertoire principal de votre projet, on va créer un fichier dune qui a en général la structure suivante
(executable
(name monprogramme)
(libraries liste des bibliotheques utilisées))
Ici le point d'entrée du programme, cela peut être le seul fichier, est monprogramme.ml dans le même répertoire que le fichier dune.
Pour compiler, on se place à la racine du projet et on tape dune build.
Ça va créer un fichier monprogramme.exe dans le répertoire _build/default créé lui aussi par dune. Pour le lancer on écrira donc ./_build/default/monprogramme.exe.
Pistes pour faire des jeux avec OCaml¶
Mode texte¶
On peut très bien faire un jeu en mode texte avec des entrées et des sorties purement textuelles. C'est le cas des jeux d'aventures en mode texte. Par exemple, https://fr.wikipedia.org/wiki/Zork et les jeux similaires peuvent être intéressants. Surtout avec une dimension lecture des entrées de manière intelligente. C'est en partant de variantes de ces jeux que le concept de MOOC a été créé et qu'on a dérivé celui de MMORPG.
Utiliser graphics¶
Cette bibliothèque est assez primitive mais suffisamment riche pour faire un petit jeu. On trouvera un exemple dans le répertoire graphics.
Il faut commencer par l'installer avec opam install graphics.
Deux exemples plus fournis dans civhack et pacman, ce dernier utilisant des graphismes depuis un format d'image bmp.
Utiliser la console comme un canevas¶
Avec la bibliothèque curses on peut utiliser la console comme un tableau de pixels. Cette bibliothèque est très riche mais n'est pas forcément très simple d'accès. Vous trouverez dans le répertoire curses un exemple avec des indications sur la manière d'obtenir de la documentation.
L'énorme avantage d'utiliser la console, c'est qu'on peut reposer sur l'imagination des joueurs sans avoir à faire de graphismes. Par exemple, @ pourra représenter l'@vatar dans un jeu de rôle ou un jeu d'action. C'est ce qui se passe dans les rogues comme Nethack ou Dwarf Fortress qui ont inspiré beaucoup de jeux récents alors qu'ils sont très vieux.
Installer curses :
- sur les plateformes autres que
windows,opam install cursessuffit - sur Windows directement ça a l'air plus compliqué et j'ai du mal à comprendre comment le faire marcher simplement avec cygwin. Mais pour compiler :
opam install depext depext-cygwinportsopam depext -i curses- en fait la première commande n'est plus nécessaire pour installer d'autres bibliothèques similaires.
- ensuite, il faut rajouter à la variable d'environnement PATH (tapez env et windows vous propose le dialogue) le chemin
/usr/x86_64-w64-mingw32/sys-root/mingw/binou similaire que vous pouvez trouver avecparcourir. C'est celui qui doit contenirlibncursesw6.dll - on fonctionne alors avec la console par défaut de Windows qui a de gros soucis de nombre de couleurs :-/
- avec WSL, c'est-à-dire Linux dans Windows, ça doit bien marcher.
Utiliser la lib sfml¶
On l'installe avec opam install sfml et on va sur internet pour se documenter. Attention, ici c'est une bibliothèque suffisante pour faire un jeu commercialisable, donc il y a sûrement beaucoup de boulot pour l'utiliser, mais le rendu final sera meilleur.
Charger des images avec camlimages¶
- Installer avec
opam install camlimages - Dans le répertoire
imagesun exemple où on charge un jpeg et on l'affiche - A noter que la boucle graphics est assez optimisée et peut servir de base.
- Dans le fichier dune il faut rajouter la bibliothèque correspondant aux formats qu'on souhaite ouvrir comme
camlimages.jpeget si on veut afficher directement des images avec graphics on rajoutecamlimage.graphics
Rendu des projets¶
Idéalement, vous travaillez avec git et vous rendez les projets sur github ou framagit. Sinon, un zip par mail avant la fin des vacances.
Les projets sont à faire par groupe de 2 ou 3.
Vos fichiers doivent être accompagnés d'un descriptif de ce que vous avez voulu faire, de comment vous l'avez réalisé, etc...
Coder avec git et github¶
Mise en place
- Allez sur
github.comet créez un compte- si vous êtes le premier de votre groupe créez un repository initialisé avec un
README.md - sinon, passez votre nom de compte à celui qui le gère pour qu'il vous donne les droits d'écriture
- si vous êtes le premier de votre groupe créez un repository initialisé avec un
- Dans le terminal, on va générer une clé SSH :
- tapez
ssh-keygen - laissez tout par défaut et pas de pass phrase
- tapez
- Sur le site de
github- vous cliquez sur le triangle descendant en haut à droite puis
Settings - Ensuite dans
SSH and GPG keysetnew ssh key - Vous copiez le contenu du fichier
C:\OCaml64\home\utilisateur\.ssh\id_rsa.pubet vous validez
- vous cliquez sur le triangle descendant en haut à droite puis
- Maintenant vous clonez le
repositoryen choisissant l'adresse avecSSHdans le menu déroulant deCode.- par exemple vous allez taper
git clone git@github.com:MarcdeFalco/MarcdeFalco.github.io.gitl'adresse doit bien commencer par ungit@github...
- par exemple vous allez taper
Utilisation minimale
Git fonctionne par lot de modifications de fichiers, on appelle ça un commit. Ces modifications sont locales. Vous allez donc faire des modifications de vos programmes, quand vous êtes content faire un commit avec un message explicatif, envoyer ces modifs sur github ou recevoir les modifs des autres.
- Pour commiter toutes les modifications :
git commit -a -m "un message descriptif"
- Pour récupérer les dernières modifications :
git pull- Attention il ne faut pas que vous ayez de fichiers modifiés mais non commités
- Pour envoyer vos modifications :
git push