cours22 - sbalev/processing101 GitHub Wiki
Le solitaire est un jeu de plateau qui, comme l'indique son nom, se pratique seul. Le plateau existe sous différentes formes, nous allons nous intéresser aux plateaux en forme de triangle équilatéral de longueur de coté n
cases. Au début du jeu toutes les cases sauf une sont occupées par des pions. Le but du jeu est d'éliminer tous les pions sauf un. Les pions se déplacent en ligne droite. On peut déplacer un pion si devant lui il y a un autre pion suivi par une case vide. Par exemple le premier pion déplacé pourrait être celui dessiné en gris :
Le pion sélectionné « saute » par-dessus du pion devant lui et atterrit dans la case vide. Le pion « sauté » est retiré du plateau.
Ensuite on peut décider de déplacer à gauche le pion dessiné en gris :
On obtient la configuration suivante :
On continue ainsi jusqu'à ce qu'on ne puisse bouger aucun pion. S'il nous reste un seul pion, on a gagné, s'il nous en reste plusieurs, on a perdu.
-
Commencez par générer et dessiner un plateau de taille paramétrable
n
. -
Gérez la souris de la façon suivante :
- Si on clique sur une case occupée, on la sélectionne (ou désélectionne si elle est déjà sélectionnée).
- Si on clique sur une case vide et il y a déjà un pion sélectionné et si les règles du jeu permettent de déplacer le pion sélectionné dans la case vide, on effectue ce déplacement.
-
Détectez la fin du jeu et affichez un message « Gagné » ou « Perdu ».
Le sketch suivant permet de charger le plan d'une maison à partir d'un fichier.
Maison maison;
void setup() {
size(600, 600);
maison = new Maison("maison.txt");
}
void draw() {
maison.dessiner();
}
class Maison {
Cellule[][] cellules;
int lignes, colonnes;
Maison(String fichier) {
String[] s = loadStrings(fichier);
String[] lc = split(s[0], ' ');
lignes = int(lc[0]);
colonnes = int(lc[1]);
cellules = new Cellule[lignes][colonnes];
float w = float(width) / colonnes;
float h = float(height) / lignes;
float r = min(w, h) / 2;
for (int i = 0; i < lignes; i++) {
for (int j = 0; j < colonnes; j++) {
int type;
if (s[i + 1].charAt(j) == '#') {
type = MUR;
} else {
type = VIDE;
}
cellules[i][j] = new Cellule(r * (2 * j + 1), r * (2 * i + 1), r, type);
}
}
}
void dessiner() {
for (int i = 0; i < lignes; i++) {
for (int j = 0; j < colonnes; j++) {
cellules[i][j].dessiner();
}
}
}
}
final int MUR = 0;
final int VIDE = 1;
class Cellule {
float x, y; // position du centre
float r; // "rayon" du carré
int type; // MUR ou VIDE
Cellule(float x, float y, float r, int type) {
this.x = x;
this.y = y;
this.r = r;
this.type = type;
}
void dessiner() {
strokeWeight(1);
stroke(192);
if (type == MUR) {
fill(0);
} else {
fill(255);
}
rectMode(RADIUS);
rect(x, y, r, r);
}
}
La maison est représentée sous forme d'une grille de cellules. Chaque cellule est soit vide, soit mur. Le fichier dans lequel le plan est stocké est dans le format suivant :
10 10
##..##..##
.........#
#..#.....#
#..#......
#..#......
...#......
...###..##
#........#
#........#
###..#..##
La première ligne contient le nombre de lignes n
et le nombre de colonnes m
de la grille. S'en suivent n
lignes de m
caractères chacune. Chaque caractère est #
si la cellule correspondante est un mur et .
si elle est vide. Ce fichier doit être dans le répertoire du sketch (ou alors il faut spécifier le chemin complet quand on crée la maison dans setup()
). Vous pouvez créer vos propres plans en utilisant ce format.
Le but de cet exercice est de développer un outil qui nous aidera à concevoir un système de sécurité pour notre maison. On peut placer dans chaque cellule vide l'un des éléments suivants :
- émetteur laser horizontal (vertical) qui émet des faisceaux de lumière infrarouge à gauche et à droite (vers le haut et vers le bas)
- miroir à deux faces incliné à +45° ou -45°
-
Faites en sorte que l'utilisateur puisse ajouter les quatre éléments de base dans une cellule vide en cliquant dessus avec la souris. Changez de façon cyclique à chaque click entre les cinq états sur l'illustration ci-dessus.
-
Visualisez en direct les faisceaux laser. Un faisceau part de chaque extrémité des émetteurs. Il continue en ligne droite et traverse les cellules vides. Quand un faisceau touche un miroir, il rebondit à +90° ou -90° en fonction de sa provenance et de l'inclinaison du miroir. Quand un faisceau touche un mur ou sort de la grille, il s'arrête.
Les faisceaux peuvent se croiser et cela ne pose pas de problème. Si un faisceau touche un émetteur il s'arrête. Cette situation n'est pas désirable car le faisceau risque d'endommager l'émetteur.
Voici une installation possible avec 2 émetteurs et 34 miroirs qui couvre la totalité de la maison dans le fichier de l'exemple.
La source d'inspiration pour cet exercice est ici.
Réalisez un jeu de Mastermind. La longueur du code, le nombre des couleurs et le nombre de tentatives doivent être paramétrables.
- Version facile : c'est l'utilisateur qui doit deviner le code.
- Version difficile : c'est l'ordinateur qui doit deviner le code.