Parcours Le démineur Étape 1
La grille et ses mines
Créer deux grilles de 9 × 9 (les mines et l'état des cases), placer 10 mines au hasard sans doublon, et les afficher pour vérifier.
Notions :deux tableaux à deux dimensionstirage sans doublon
Le démineur a besoin de deux grilles de 9 × 9 :
mines[l][c]vaut 1 s'il y a une mine, 0 sinon ;etat[l][c]dit ce que voit le joueur : 0 pour une case cachée, 1 pour une case découverte (et bientôt 2 pour un drapeau).
Séparer ce qui est de ce qu'on voit rend tout le programme plus clair.
Placer 10 mines, pas 9
On tire une case au hasard et on y pose une mine… mais le hasard peut retomber sur une case déjà minée ! Avec une simple boucle répète 10 fois, on aurait parfois 9 mines, ou moins. On compte donc les mines réellement posées :
tant que placees < 10
ml vaut hasard(0, 8)
mc vaut hasard(0, 8)
si mines[ml][mc] = 0 alors
mines[ml][mc] vaut 1
placees ajoute 1
fin si
fin tant queVérifier
Pour l'instant, on dessine la grille entièrement découverte, en « mode triche » : comptez les mines, il doit y en avoir exactement 10. Les cases font 30 pixels, sous une bande d'informations de 30 pixels.
Ouvrez CoddyRun et partez d'un programme vide : tout commence ici.
Il te faut le logiciel pour faire cette étape. Il est gratuit : crée ton compte pour le télécharger, puis reviens ici, ta place t'attend.
Créer mon compte et téléchargerIndice 1
Déclarez plateau est une toile (270 × 300) et mines, etat est un tableau.
Indice 2
La procédure placerMines déclare ses variables locales ml, mc, placees.
Indice 3
appelle dessinerPlateau(vrai) dessine toutes les cases, comme si elles étaient découvertes.
Voir la solution complète
Essayez d'abord par vous-même : c'est en cherchant qu'on apprend. La solution sert à vérifier ou à se débloquer.
@ Les déclarations
plateau est une toile
mines, etat est un tableau
procédure placerMines()
ml, mc, placees est un nombre
placees vaut 0
tant que placees < 10
ml vaut hasard(0, 8)
mc vaut hasard(0, 8)
// on ne compte la mine que si la case était libre
si mines[ml][mc] = 0 alors
mines[ml][mc] vaut 1
placees ajoute 1
fin si
fin tant que
fin procédure
@ Le dessin
procédure dessinerPlateau(toutMontrer)
px, py, nb est un nombre
effacer(plateau)
remplir(plateau, #2D3436)
label(plateau, 8, 20, "Démineur : 10 mines", #FFFFFF, 14)
pour ly de 0 à 8
pour cx de 0 à 8
px vaut cx * 30
py vaut 30 + ly * 30
si etat[ly][cx] = 1 ou toutMontrer alors
// une case découverte
rectangle(plateau, px + 1, py + 1, 28, 28, #DFE6E9)
si mines[ly][cx] = 1 alors
cercle(plateau, px + 15, py + 15, 8, #2D3436)
ligne(plateau, px + 6, py + 15, px + 24, py + 15, #2D3436, 2)
ligne(plateau, px + 15, py + 6, px + 15, py + 24, #2D3436, 2)
fin si
sinon
// une case encore cachée
rectangle_arrondi(plateau, px + 1, py + 1, 28, 28, 4, #74B9FF)
fin si
fin pour
fin pour
affiche plateau
fin procédure
@ Programme principal
dimension(plateau, 270, 300)
pour l de 0 à 8
pour c de 0 à 8
mines[l][c] vaut 0
etat[l][c] vaut 0
fin pour
fin pour
appelle placerMines()
appelle dessinerPlateau(vrai)