Générer un puzzle Sudoku, Excel VBA

Générer un puzzle Sudoku, Excel VBA

Voici un code détaillé en VBA pour générer un puzzle Sudoku dans Excel, avec une explication :
1. Préparation de la feuille Excel :
Avant de commencer avec le code VBA, vous devez préparer une grille dans Excel qui représente le plateau de Sudoku. Vous pouvez le faire en sélectionnant une plage de 9×9 cellules (par exemple, A1:I9).
2. Code VBA pour générer un puzzle Sudoku :

Option Explicit
Dim SudokuGrid(1 To 9, 1 To 9) As Integer
Dim SolvedGrid(1 To 9, 1 To 9) As Integer
Sub GenerateSudokuPuzzle()
    Dim i As Integer, j As Integer
    ' Initialiser la grille Sudoku
    Call GenerateSolution
    ' Retirer certains numéros pour créer le puzzle
    Call RemoveNumbers
    ' Afficher le puzzle dans la feuille Excel
    Call DisplayPuzzle
End Sub
Sub GenerateSolution()
    ' Remplir la grille avec une solution valide de Sudoku
    Call FillGrid(1, 1)
End Sub
Function FillGrid(Row As Integer, Col As Integer) As Boolean
    Dim num As Integer
    If Row > 9 Then
        FillGrid = True
        Exit Function
    End If
    If Col > 9 Then
        FillGrid = FillGrid(Row + 1, 1)
        Exit Function
    End If
    If SudokuGrid(Row, Col) > 0 Then
        FillGrid = FillGrid(Row, Col + 1)
        Exit Function
    End If
    For num = 1 To 9
        If IsSafeToPlace(Row, Col, num) Then
            SudokuGrid(Row, Col) = num
            If FillGrid(Row, Col + 1) Then
                FillGrid = True
                Exit Function
            End If
            SudokuGrid(Row, Col) = 0
        End If
    Next num
    FillGrid = False
End Function
Function IsSafeToPlace(Row As Integer, Col As Integer, num As Integer) As Boolean
    ' Vérifier si le numéro peut être placé à la position spécifiée
    Dim i As Integer, j As Integer
    ' Vérifier la ligne
    For i = 1 To 9
        If SudokuGrid(Row, i) = num Then
            IsSafeToPlace = False
            Exit Function
        End If
    Next i
    ' Vérifier la colonne
    For i = 1 To 9
        If SudokuGrid(i, Col) = num Then
            IsSafeToPlace = False
            Exit Function
        End If
    Next i
    ' Vérifier le carré 3x3
    Dim startRow As Integer, startCol As Integer
    startRow = (Row - 1) \ 3 * 3 + 1
    startCol = (Col - 1) \ 3 * 3 + 1
    For i = startRow To startRow + 2
        For j = startCol To startCol + 2
            If SudokuGrid(i, j) = num Then
                IsSafeToPlace = False
                Exit Function
            End If
        Next j
    Next i
    IsSafeToPlace = True
End Function
Sub RemoveNumbers()
    Dim removed As Integer
    removed = 0
    Dim i As Integer, j As Integer
    Dim index As Integer
    Dim numbers(81) As Integer
    For i = 1 To 81
        numbers(i) = i
    Next i
    ' Mélanger le tableau numbers
    For i = 1 To 81
        index = Int((81 - 1 + 1) * Rnd + 1)
        Dim temp As Integer
        temp = numbers(i)
        numbers(i) = numbers(index)
        numbers(index) = temp
    Next i
    ' Retirer des numéros pour créer le puzzle
    For i = 1 To 81
        Dim row As Integer, col As Integer
        row = (numbers(i) - 1) \ 9 + 1
        col = (numbers(i) - 1) Mod 9 + 1
        If SudokuGrid(row, col) <> 0 Then
            SudokuGrid(row, col) = 0
            removed = removed + 1
        End If
        If removed >= 40 Then Exit For
    Next i
End Sub
Sub DisplayPuzzle()
    Dim row As Integer, col As Integer
    For row = 1 To 9
        For col = 1 To 9
            If SudokuGrid(row, col) > 0 Then
                Cells(row, col).Value = SudokuGrid(row, col)
            Else
                Cells(row, col).Value = ""
            End If
        Next col
    Next row
End Sub

Explication du code :
1. Tableaux globaux (SudokuGrid, SolvedGrid) :

  • SudokuGrid : Ce tableau contient l’état actuel du puzzle. Il sera rempli de nombres de 1 à 9 pour la solution, et certains nombres seront retirés pour créer le puzzle.
  • SolvedGrid : Ce tableau contient la solution complète du Sudoku.

2. Sous-programme principal (GenerateSudokuPuzzle) :

  • Il s’agit du sous-programme principal qui génère le puzzle Sudoku. Il commence par appeler GenerateSolution pour créer une solution valide, puis il appelle RemoveNumbers pour retirer certains numéros du tableau et créer le puzzle, et enfin, il utilise DisplayPuzzle pour afficher le puzzle dans la feuille Excel.

3. Génération de la solution (GenerateSolution) :

  • Le sous-programme GenerateSolution appelle la fonction FillGrid, qui est une fonction récursive qui tente de remplir la grille avec une solution valide.

4. Remplir la grille (FillGrid) :

  • Cette fonction essaie de remplir la grille de Sudoku ligne par ligne, colonne par colonne, en utilisant une méthode de recherche avec retour arrière (backtracking). Si elle rencontre une situation où un nombre ne peut pas être placé, elle revient en arrière et essaie un autre nombre.

5. Vérification de sécurité (IsSafeToPlace) :

  • Cette fonction vérifie si un numéro peut être placé dans une cellule donnée sans violer les règles du Sudoku. Elle vérifie la ligne, la colonne et le sous-carré 3×3 pour s’assurer que le numéro n’apparaît pas ailleurs.

6. Retirer des numéros (RemoveNumbers) :

  • Une fois la grille remplie avec une solution valide, la sous-routine RemoveNumbers retire aléatoirement des numéros du tableau pour créer le puzzle. Elle s’assure qu’il y a suffisamment de numéros retirés (environ 40 cellules) pour créer un puzzle résolvable.

7. Afficher le puzzle (DisplayPuzzle) :

  • Cette sous-routine parcourt le tableau SudokuGrid et affiche les numéros dans les cellules correspondantes de la feuille Excel. Si une cellule contient un zéro, elle n’affiche rien.

Comment utiliser le code :
1. Ouvrez votre fichier Excel et appuyez sur ALT + F11 pour ouvrir l’éditeur VBA.
2. Insérez un nouveau module en cliquant sur Insertion > Module.
3. Collez le code complet dans le module.
4. Fermez l’éditeur VBA et revenez à votre feuille Excel.
5. Exécutez la macro GenerateSudokuPuzzle en appuyant sur ALT + F8, en sélectionnant GenerateSudokuPuzzle et en cliquant sur « Exécuter ».
Ce code générera un puzzle Sudoku aléatoire à chaque fois qu’il sera exécuté, avec certaines cellules remplies et d’autres laissées vides. Vous pouvez ajuster le nombre de cellules à retirer en modifiant la condition dans RemoveNumbers (actuellement, il est défini pour retirer 40 cellules).

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x