Le 2048 est un jeu qui se joue sur une grille de 4x4. Des blocs représentant des puissances de 2 (2, 4, 8, 16, 32, etc.) sont contenus dans cette grille (certaines cases peuvent aussi être vides). Initialement, la grille contient deux blocs de valeur 2 ou 4 placés aléatoirement.
À chaque tour, le joueur peut déplacer les blocs vers le haut, le bas, la gauche ou la droite. À chaque déplacement, les blocs se déplacent dans la direction choisie jusqu'à rencontrer un autre bloc ou le bord de la grille. Si deux blocs de même valeur se rencontrent, ils fusionnent en un bloc de valeur double. Après chaque mouvement, un bloc additionnel de valeur 2 ou 4 apparaît dans une case vide.
Le joueur gagne quand il obtient un bloc de valeur 2048. Le joueur perd quand la grille est remplie et qu'il n'est plus possible de déplacer les blocs.
Exemple en ligne : https://play2048.co/
Cahier des charges
Votre programme affiche la grille de jeu et demande à l'utilisateur
quelle action il veut effectuer. L'utilisateur peut saisir les lettres
z
, q
, s
ou d
pour déplacer les blocs vers le haut, la gauche, le bas ou la droite.
Lorsque l'utilisateur a entré son action, le programme calcule la
nouvelle grille de jeu. Il y a alors deux cas :
- si la grille a changé, l'action du joueur est valide : un nouveau bloc 2 ou 4 est placé aléatoirement sur une case vide, la nouvelle grille est affichée et le jeu continue ;
- si la grille n'a pas changé, l'action du joueur est invalide : aucun bloc n'est ajouté et on demande au joueur de choisir une autre action.
À chaque fois qu'un bloc doit apparaître, votre programme doit choisir aléatoirement entre 2 et 4. La probabilité d'apparition du bloc 2 est de 90% et celle du bloc 4 est de 10%.
Si l'utilisateur crée un bloc de valeur 2048, le programme affiche un message de félicitations et demande au joueur s'il veut tout de même continuer à jouer. Si oui, le jeu continue jusqu'à ce que l'utilisateur perde. Si non, le programme s'arrête.
Le programme s'arrête quand la grille est pleine et que le joueur n'a aucune action valide à effectuer. La valeur de la case la plus haute obtenue par le joueur est alors affichée.
Déplacement des blocs
Le déplacement des blocs n'est pas aussi simple qu'il n'y paraît. Pour expliquer les règles, supposons que le joueur veut déplacer les blocs vers la gauche (le fonctionnement est le même dans les autres directions). Chaque ligne est alors traitée indépendamment. Nous nous intéressons ici à une ligne donnée (il suffit de reproduire la même chose sur chacune des lignes).
On traite les blocs de gauche à droite. On déplace le bloc le plus à gauche possible. Si le bloc (A) est bloqué par un autre bloc (B), deux cas existent :
- si les deux blocs ont la même valeur et que le bloc B n'est pas déjà le résultat d'une fusion , ils fusionnent en un bloc de valeur double à la place du bloc B ;
- sinon, le bloc ne bouge plus et il n'y a pas de fusion.
Je vous recommande de créer une fonction (appelée par exemple
deplace_gauche(tab)
) qui prend en paramètre un tableau
tab
de 4 entiers et qui renvoie le tableau modifié après
déplacement des blocs vers la gauche. Vous pourrez ensuite utiliser
cette fonction pour déplacer les blocs vers le haut, le bas et la
droite en inversant les tableaux pris en entrée et reçus en sortie de
cette fonction.
Exemples : (on suppose que 0 représente une case vide)
[0, 0, 2, 4]
→[2, 4, 0, 0]
[0, 0, 2, 2]
→[4, 0, 0, 0]
[2, 16, 16, 4]
→[2, 32, 4, 0]
-
[2, 2, 4, 0]
→[4, 4, 0, 0]
(les4
ne fusionnent pas car le premier 4 est déjà le résultat de la fusion de deux2
) [8, 8, 32, 32]
→[16, 64, 0, 0]
-
[8, 8, 8, 8]
→[16, 16, 0, 0]
(les16
ne fusionnent pas car le premier 16 est déjà le résultat de la fusion de deux8
)
Pour aller plus loin (palier 4)
Une fois que vous avez atteint le palier 3 des fonctionnalités, voici quelques idées pour aller plus loin et atteindre le palier 4 :
- Permettre de personnaliser les blocs qui peuvent apparaître et leur probabilité d'apparition.
- Pouvoir joueur sur une grille de taille différente que 4x4.
- Ajouter un système de score avec une sauvegarde des meilleurs scores dans un fichier texte.