Objectif : programmer un prototype d'interface adaptée au jeu "En garde !".
Ce jeu de Reiner Knizia, aux règles simples qui peuvent sembler simplistes, permet de simuler à moindre coût un duel entre deux protagonistes.
Résumé des règles du jeu :
Les escrimeurs, représentés par des dés, se tiennent chacun à un bout du plateau. Les joueurs possèdent 5 cartes en mains. Les cartes possèdent des valeurs allant de 1 à 5. Chaque carte apparaît 5 fois dans le paquet.
Chacun son tour, on joue une carte et on déplace son personnage d’autant de cases, généralement vers l’avant, mais on peut aussi reculer.
Quand les personnages sont assez près l’un de l’autre, le joueur dont c’est le tour peut jouer une carte de la valeur exacte qui sépare les deux personnages. C’est une attaque. Pour parer, le joueur qui défend peut jouer à son tour une carte de la même valeur. C’est la parade.
Si un joueur peut jouer plusieurs cartes d’attaque de la même valeur, c’est une attaque renforcée. Le défenseur devra joueur le même nombre de cartes de même valeur pour parer, ce qui est plus difficile.
Mieux encore, on peut charger. Le joueur qui charge joue d’abord une carte pour bouger, puis une autre pour toucher. Le défenseur aura alors la possibilité de reculer s’il ne possède pas de carte adéquate pour parer. Mais, déséquilibré, il ne pourra pas jouer au prochain tour, laissant la main au joueur offensif.
Si à la fin de la pioche, aucune touche n’a été faite, le joueur le plus avancé sur le plateau remporte le point.
Chaque attaque non parée ou défendue est une touche. La manche prend fin immédiatement et le vainqueur marque 1 point. Le premier qui remporte 5 touches gagne la partie.
Vous trouverez les règles complètes dans ce fichier PDF : engarde-regles.pdf.
Cahier des charges
Ce projet s'inscrivant dans une mise en pratique des notions vu dans le module IHM, il est bien entendu hors de question d'établir un cahier des charges dépassant cet objectif. On s'attachera donc à proposer une interface simple, intuitive et conviviale permettant à deux joueurs de s'affronter en "hot seat" sur la base de ces règles (en s'abstenant d'implanter un adversaire électronique et une liaison réseau notamment).
Une réflexion préalable doit être menée pour décider quelle représentation donnée au plateau de jeu, aux protagonistes et aux cartes ainsi que de leur agencement réciproques. Ces deux aspects, représentation et agencement, doivent pouvoir être personnalisés par les utilisateurs. Le fait que cette application soit utilisable par deux utilisateurs durant la même session ne doit pas être négligé.
Le système doit permettre le bon déroulement d'une partie dans le respect des règles du jeu, ce qui suppose un traitement des erreurs approprié et adapté à tout public ainsi que de tenir à jour le nombre de manches remportées.
Enfin l'utilisateur doit pouvoir retrouver son interface telle qu'il l'a personnalisée entre deux sessions de jeu. Par contre, aucune sauvegarde d'une partie en cours n'est demandée.
Programmation
Ce projet devra être développé en Python exclusivement, avec l'aide du module tkinter et de la bibliothèque Pillow (un "fork" du module PIL, Python Imaging Library) qui permet d'afficher des images au format JPEG ou PNG, et dont le principal intérêt dans le cadre de ce projet est de pouvoir gérer le canal alpha des couleurs.
L'adoption des paradigmes objets est demandée et doit mener à l'élaboration d'un diagramme des classes mises en oe uvre dans le projet. Il n'est pas obligatoire de respecter le formalisme UML mais le diagramme doit être sans ambigu"ité.
Il est indispensable de construire ce projet modulairement, seule approche succeptible de garantir au minimum les principes d'encapsulation, de protection et de réutilisabilité.
L'utilisation de modules ou de portions de programmes disponibles sur le net améliorant l'ergonomie et/ou la présentation de l'application est autorisée à condition de le signaler dans le code. En toute généralité, toute portion de code dont on n'est pas l'auteur doit être déclarée (avec sa référence).
Aspect technique
Pour améliorer l'aspect visuel du jeu, le plus simple est d'utiliser le module PIL, une bibliothèque qui permet de manipuler de nombreux formats d'images (PNG en particulier) et d'effectuer des transformations géométriques sur celles-ci (notamment rotation et dilatation). Néanmoins, il est utile de clarifier un certain nombre de points techniques.
L'affichage dans un canvas de tkinter d'une image lue par l'intermédiaire du module Pillow se fait en trois étapes :
- lecture du fichier image : im = Image.open(name),
- conversion au format PhotoImage : imp = ImageTk.PhotoImage(im),
- affichage dans le canvas : id = canv.create_image(x, y, image=imp).
Attention : l'identificateur associé à la PhotoImage doit avoir une durée de vie égale à celle du programme (sinon aucune image ne s'affichera dans le canvas et ce sans message d'erreur).
La rotation (im.rotate(angle) avec angle en degrés) et la dilatation d'une image (im.resize(largeur, hauteur, Image.ANTIALIAS)) nécessitent de créer une nouvelle PhotoImage avant de l'afficher.
Notation
La notation de ce projet prendra en compte le respect du cahier des charges, la qualité de la programmation (robustesse, lisibilité et modularité du code) ainsi que les aspects propres à une IHM que sont : cohérence, concision (limitation du nombre d'intervention de l'utilisateur), structuration des activités (décomposition d'une tâche complexe), flexibilité (application personnalisable), retour d'informations et gestion des erreurs, toutes choses qui garantissent une interface ergonomique et intuitive et qui n'apparaissent pas explicitement dans cette présentation.