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:

  1. Il n’y a qu’un seul niveau, c’est pas un peu léger?
  2. 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]=' ';
  }
}
Publicités