Démineur

On souhaite générer des grilles du jeu de démineur à partir de la position des bombes à placer.
On se limite à la génération de grilles carrées de taille \(n \times n\)\(n\) est le nombre de bombes du jeu.

Dans le jeu du démineur, chaque case de la grille contient soit une bombe, soit une valeur qui correspond aux nombres de bombes situées dans le voisinage direct de la case (au- dessus, en dessous, à droite, à gauche ou en diagonale : chaque case a donc 8 voisins si elle n'est pas située au bord de la grille).

Exemple

Voici un exemple de grille \(5 \times 5\) de démineur dans laquelle la bombe est représentée par une étoile :

image

On utilise une liste de listes pour représenter la grille et on choisit de coder une bombe par la valeur -1.

L'exemple ci-dessus sera donc codé par la liste :

🐍 Script Python
[[1, 1, 1, 0, 0],
[1, -1, 1, 1, 1],
[2, 2, 3, 2, -1],
[1, -1, 2, -1, 3],
[1, 1, 2, 2, -1]]
Compléter le code ci-dessous

La fonction genere_grille permet de générer des grilles de démineur. On pourra vérifier que l’instruction genere_grille([(1, 1), (2, 4), (3, 1), (3, 3), (4, 4)]) produit bien la liste donnée en exemple.

###
# Testsbksl-nlbombes = [(1, 1), (2, 4), (3, 1), (3, 3), (4, 4)]bksl-nlgrillepy-undtest = [[1, 1, 1, 0, 0], [1, -1, 1, 1, 1], [2, 2, 3, 2, -1], [1, -1, 2, -1, 3], [1, 1, 2, 2, -1]]bksl-nlassert generepy-undgrille(bombes) == grillepy-undtestbksl-nlbksl-nl# Autres testsbksl-nlbombespy-und2 = [(1, 1), (2, 4), (3, 1), (3, 3), (4, 4), (2,5)]bksl-nlassert generepy-undgrille(bombespy-und2)== [[1, 1, 1, 0, 0, 0], [1, -1, 1, 1, 2, 2], [2, 2, 3, 2, -1, -1], [1, -1, 2, -1, 4, 3], [1, 1, 2, 2, -1, 1], [0, 0, 0, 1, 1, 1]]bksl-nlbksl-nl 5/5
def voisinage(n, ligne, colonne):bksl-nl """ Renvoie la liste des coordonnées des voisins de la casebksl-nl (ligne, colonne) en gèrant les cases sur les bords. """bksl-nl voisins = []bksl-nl for l in range(max(0, ligne - 1), min(n, ligne + 2)):bksl-nl for c in range(max(0, colonne - 1), min(n, colonne + 2)):bksl-nl if (l, c) != (ligne, colonne):bksl-nl voisins.append((l, c))bksl-nl return voisinsbksl-nlbksl-nldef incrementepy-undvoisins(grille, ligne, colonne):bksl-nl """ Incrémente de 1 toutes les cases voisines d'une bombe. """bksl-nl voisins = ...bksl-nl for l, c in voisins:bksl-nl if grille[l][c] != ...: # si ce n'est pas une bombebksl-nl ... # on ajoute 1 à sa valeurbksl-nlbksl-nldef generepy-undgrille(bombes):bksl-nl """ Renvoie une grille de démineur de taille nxn où n estbksl-nl le nombre de bombes, en plaçant les bombes à l'aide debksl-nl la liste bombes de coordonnées (tuples) passée enbksl-nl paramètre. """bksl-nl n = len(bombes)bksl-nl # Initialisation d'une grille remplie de 0bksl-nl grille = [[0 for colonne in range(n)] for ligne in range(n)]bksl-nlbksl-nl # Place les bombes et calcule les valeurs des autres casesbksl-nl for ligne, colonne in bombes:bksl-nl grille[ligne][colonne] = ... # place la bombebksl-nl ... # incrémente ses voisinsbksl-nlbksl-nl return grillebksl-nlbksl-nl# Testsbksl-nlbombes = [(1, 1), (2, 4), (3, 1), (3, 3), (4, 4)]bksl-nlgrillepy-undtest = [[1, 1, 1, 0, 0], [1, -1, 1, 1, 1], [2, 2, 3, 2, -1], [1, -1, 2, -1, 3], [1, 1, 2, 2, -1]]bksl-nlassert generepy-undgrille(bombes) == grillepy-undtestbksl-nlbksl-nlbksl-nlbksl-nldef voisinage(n, ligne, colonne):bksl-nl """ Renvoie la liste des coordonnées des voisins de la casebksl-nl (ligne, colonne) en gèrant les cases sur les bords. """bksl-nl voisins = []bksl-nl for l in range(max(0, ligne - 1), min(n, ligne + 2)):bksl-nl for c in range(max(0, colonne - 1), min(n, colonne + 2)):bksl-nl if (l, c) != (ligne, colonne):bksl-nl voisins.append((l, c))bksl-nl return voisinsbksl-nlbksl-nldef incrementepy-undvoisins(grille, ligne, colonne):bksl-nl """ Incrémente de 1 toutes les cases voisines d'une bombe. """bksl-nl voisins = voisinage(len(grille), ligne, colonne)bksl-nl for l, c in voisins:bksl-nl if grille[l][c] != -1: # si ce n'est pas une bombebksl-nl grille[l][c] += 1 # on ajoute 1 à sa valeurbksl-nlbksl-nldef generepy-undgrille(bombes):bksl-nl """ Renvoie une grille de démineur de taille nxn où n estbksl-nl le nombre de bombes, en plaçant les bombes à l'aide debksl-nl la liste bombes de coordonnées (tuples) passée enbksl-nl paramètre. """bksl-nl n = len(bombes)bksl-nl # Initialisation d'une grille remplie de 0bksl-nl grille = [[0 for colonne in range(n)] for ligne in range(n)]bksl-nlbksl-nl # Place les bombes et calcule les valeurs des autres casesbksl-nl for ligne, colonne in bombes:bksl-nl grille[ligne][colonne] = -1 # place la bombebksl-nl incrementepy-undvoisins(grille, ligne, colonne) # incrémente ses voisinsbksl-nlbksl-nl return grillebksl-nlbksl-nl