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\) où \(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 :
On utilise une liste de listes pour représenter la grille et on choisit de coder une bombe par la valeur -1.
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.
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