Implantation du jeu 2048

Transcription

Implantation du jeu 2048
Projet: 2048
11 septembre 2016
Après plusieurs heures de programmation intense, l’objectif est de se détendre
avec votre nouvelle version du jeu 2048 !
Le jeu 2048 est une variante du jeu de taquin, inventée par le web designer
Gabriele Cirulli (quelqu’un de votre âge...) en mars 2014. Le jeu est une grille
4×4 où chaque case/tuile est soit vide, soit une puissance de 2. Le but du jeu est
de faire glisser (verticalement et/ou horizontalement) toutes les tuiles (en même
temps) sur la grille afin de combiner les tuiles de même valeur. Si deux tuiles de
même valeur (2k ) sont adjacentes pendant le glissement, alors elles se combinent
en une unique tuile étiquetée par la somme des valeurs (2k+1 ). Après chaque
déplacement, une nouvelle tuile apparaît aléatoirement sur un des emplacements
vides. Cette nouvelle tuile a pour valeur soit 2, soit 4, avec probalité respective
1
9
10 et 10 . Pour que le jeu commence, il faut au minimum une tuile sur la grille
(habituellement deux). Le jeu se termine lorsque toutes les tuiles sont occupées
et que plus aucun mouvement ne permet de combiner de tuiles.
Après avoir étudié le démineur, le sudoku. . . voici le 2048 ! Encore une grille
à coder ! Encore des règles et conditions à satisfaire. . . Et surtout un rapport !
(oui ça c’est nouveau. . .)
Objectif : Rendre un programme mettant en oeuvre le jeu 2048, et rédiger
un rapport de projet.
Pour les modalités pratiques (soutenance, ...), voire la page web du cours.
Bases du jeu
Le niveau 0 (alias le niveau “J’en fais pas plus qu’en TP”) du projet est de
modéliser et implémenter une version du jeu 2048 en mode console en C++.
En s’inspirant du TP sudoku, on pourra modéliser une grille de jeu par un
type Grille et identifier l’affichage, les règles et les actions du jeu par différentes
fonctions (affichage, deplacement_autorise, etc).
Tout comme en TP, le code fournit devra impérativement suivre
la structure suivante et contenir au minimum les fonctions suivantes
(respectant la syntaxe ! ! !) :
1
#include <i o s t r e a m >
using namespace s t d ;
const
const
const
const
int
int
int
int
GAUCHE = 7 ;
DROITE = 4 ;
HAUT = 8 ;
BAS = 2 ;
typedef /∗ A d e f i n i r ∗/ G r i l l e ;
Grille grilleVide ();
Grille initialiseGrille ( Grille grille );
G r i l l e deplacementGauche ( G r i l l e g r i l l e ) ;
G r i l l e deplacementDroite ( G r i l l e g r i l l e ) ;
G r i l l e deplacementHaut ( G r i l l e g r i l l e ) ;
G r i l l e deplacementBas ( G r i l l e g r i l l e ) ;
/∗ ∗ Documentation a f a i r e ∗ ∗/
G r i l l e deplacement ( G r i l l e g r i l l e , int d i r e c t i o n ) {
switch ( d i r e c t i o n ) {
case GAUCHE:
return deplacementGauche ( g r i l l e ) ;
case DROITE:
return d e p l a c e m e n t D r o i t e ( g r i l l e ) ;
case HAUT:
return deplacementHaut ( g r i l l e ) ;
case BAS :
return deplacementBas ( g r i l l e ) ;
default :
c e r r << " Deplacement ␣non−a u t o r i s e ! " << e n d l ;
e x i t ( −1);
}
}
bool e s t T e r m i n e e ( G r i l l e g r i l l e ) ;
int s c o r e ( G r i l l e g r i l l e ) ;
bool estGagnant ( G r i l l e g r i l l e ) ;
void a f f i c h e G r i l l e ( G r i l l e g ) ;
void j e u ( ) ;
2
Ces différentes fonctions devront être spécifiées, documentées et testées.
À ce premier niveau, on rentre chaque déplacement (haut, bas, gauche et
droite) par l’intermédiaire de caractères (par exemple h, b, g et d ou encore i,
k, j et l). De plus on affiche la grille après chaque déplacement, avec la nouvelle
tuile apparue. Voir ci-dessous un exemple d’exécution :
...
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 128 ∗ 4 ∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 2 ∗ 16 ∗ 4 ∗ 2 ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗
∗
∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 2 ∗
∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
E n t r e r commande : h
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 128 ∗ 4 ∗ 4 ∗ 2 ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 4 ∗ 16 ∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗
∗
∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 2 ∗
∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
E n t r e r commande : g
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 128 ∗ 8 ∗ 2 ∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 4 ∗ 16 ∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗
∗
∗ 4 ∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 2 ∗
∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
E n t r e r commande :
...
La moyenne pourra être obtenue si le jeu est fonctionnel :
– le(s) fichier(s) de votre projet compile(nt),
– le code est spécifié, documenté et testé (incluant le code des tests),
– le jeu respecte les règles et spécifications du 2048,
3
– lors de l’affichage, les colonnes sont bien alignées, quelles que soient les
valeurs de chaque tuile :
Correct
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 128 ∗ 128 ∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 2 ∗ 16 ∗ 4 ∗ 2 ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗
∗
∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 2 ∗
∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
Pas c o r r e c t
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 128 ∗ 128 ∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 2 ∗ 16 ∗ 4 ∗ 2 ∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗
∗
∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ 2 ∗
∗
∗
∗
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗
et si le rapport est bien rédigé (orthographe...) et comprend :
– une présentation du jeu,
– une documentation de votre application.
Remarque : Le non respect de la syntaxe des fonctions entraînera que le
projet ne sera pas corrigé ! (En gros, triché et c’est pas corrigé !)
Amélioration
Le niveau 1 (ou “comment gagner des points avec un minimum d’efforts”)
propose différentes améliorations (faciles) :
1. Le site du jeu original propose un système de score. Étudier son fonctionnement, ajouter cette fonctionnalité à votre code/jeu et écrire la documentation. Le score associé à une grille ne doit pas être une variable globale !
Il doit donc être associé à la structure de données Grille. (∼ 2pt)
2. Comme sur le jeu original, rajouter un peu de couleur à notre triste
console. . . (∼ 1pt)
3. On aimerait jouer en utilisant directement les flèches (haut, bas, gauche et
droite) du clavier, sans avoir à appuyer sur entrée à chaque fois. Étudier
différentes solutions envisageables et ajouter cette fonctionnalité. (∼ 2pt)
4. Pour des raisons de jouabilité encore une fois, on aimerait que l’affichage
d’une grille se fasse à la même place que la grille précédente, plutôt que
de les voir à la suite. Autrement dit, on souhaiterait que l’écran se raffraichisse. Étudier différentes solutions et ajouter la fonctionnalité. (∼ 2pt)
Pour les 3 derniers points, une solution envisageable est d’utiliser la bibliothèque ncurses. Un exemple minimal d’utilisation est fourni dans le fichier
ncurses_min.cpp, à compiler avec le paramètre de compilation −lncurses pour
l’éditeur de lien. Pour de la documentation, voir par exemple http://invisible-island.
net/ncurses/ncurses-intro.html ou http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/.
Attention : L’utilisation de certaines librairies nécessite d’ajouter des paramètres de compilation. Si tel est le cas, le rapport devra expliciter la procédure
de compilation.
4
Compilation
Le niveau 2 (on veut passer la barre des 16−17 ?) : Code::blocks vous cache
bien des choses. . . en particulier que se passe-t-il vraiment lorsque vous cliquez
sur le petit icone en forme d’engrenage ? La compilation de votre programme. . .
Étudier les instructions de compilation et proposer un Makefile permettant de
compiler votre projet. (∼ 2pt)
Attention : Deux choix s’offrent à vous, créer un (petit) Makefile (simple)
adapté à votre projet ou trouver un Makefile générique qui compile tout. . .
Pour mériter les points de la question, l’important est de comprendre ce qui se
passe (n’oublions pas la soutenance. . .).
Pour aller plus loin...
Vous pouvez par exemple implanter des variantes du jeu, comme l’une de
celles décrites sur https://phenomist.wordpress.com/2048-variants/, ou
encore mieux la votre. Et avoir un menu en début de jeu pour choisir la variante.
Le niveau 42 (le vrai geek comprend !) : Un jeu en mode console ? Mouais. . .
j’aimerais une vraie fenêtre. . . ou mieux, avoir l’appli sur mon portable. . .
1. Découvrir SDL (ou mieux GTK+) et proposer une version du 2048 avec
une interface graphique. (∼ 2pt)
2. Vous en voulez encore ? Une version android ou iOS c’est possible ? (∼
2pt)
La note maximale est sûrement de 20 mais. . . des points se cachent encore
dans la soutenance de votre projet. . . Ceux qui atteignent le dernier niveau
assurent (presque) le 20 mais tout n’est pas perdu pour les autres. . . Soutenance
bien préparée et travail soigné seront récompensés !
5