Cliquer ici pour revenir au début du tutoriel.
Voilà on peut maintenant jouer à Sokoban, mais je sais que vous avez déjà identifié deux problèmes:
- Il n’y a qu’un seul niveau, c’est pas un peu léger?
- J’en ai marre de faire on/off quand je veux recommencer le niveau
Bon, on va corriger ça, et on va commencer par traiter le deuxième problème:
Quand le joueur appuiera sur la touche A, alors le niveau sera ré-initialisé!
On va donc ajouter la partie suivante dans les contrôles:
... colonneJoueur = cs(dir,1); } void surveilleTouches() { if (toucheA() && relacheTouche) { initNiveau(); } if (toucheHaut() && relacheTouche) { deplace(HAUT); } ...
et on va coder la fonction initNiveau qui va devoir:
1- initialaiser le tableau NIVEAU
2- intialiser lignejoueur, colonnejoueur
Pour initier la tableau niveau, il faut que nous ayons enregistré le niveau tel qu’il est avant que le joueur n’ai commencé à joué, cela va pouvoir se faire par une constante. Cette fois-ci nous n’allons pas utiliser un tableau mais une chaîne de caractère car c’est le format universel de stockage des niveaux de Sokoban. Ainsi, notre niveau sera:
const char niveaux[] PROGMEM = "MMMM M@.M M$ M M M M $M M. M M M MMMM "; // ne pas oublier la dernière ligne vide!
(et on va même en profiter pour stocker les autres niveaux à la suite (avec une ligne vide entre chaque niveau).
L’initialisation du niveau sera donc:
indexChaine = 0; indexColonne = 0; indexLigne = 0; // tant que nous n'avons pas deux sauts de lignes à la suite (fin du niveau) while (niveaux[indexChaine]!='\n') { // on stocke le prochain caractère dans le tableau do { niveau[indexLigne][indexColonne] = niveaux[indexChaine]; indexColonne++; indexChaine++; } while (niveaux[indexChaine]!='\n'); // tant qu'on est pas à la fin de la ligne // on passe à la ligne suivante indexChaine++; indexLigne++; }
On va aussi en profiter pour indiquer une taille maximale de notre niveau. L’écran fait 84 pixels sur 48, et une case fait 4 pixels de côté, donc on a 84/4 sur 48/4, c’est à dire 21×12
#define NB_LIGNES_NIVEAUX 12 #define NB_COLONNES_NIVEAUX 21
Et pour éviter d’avoir des cases non initialisées:
for (int indLigne=0;indLigne<NB_LIGNES_NIVEAUX;indLigne++) { for (int indColonne=0;indColonne<NB_COLONNES_NIVEAUX;indColonnes++) { niveau[indLigne][indColonne]=' '; } }