Results 1 to 3 of 3

Thread: Sudoku - generating a puzzle

  1. #1

    Thread Starter
    PowerPoster JuggaloBrotha's Avatar
    Join Date
    Sep 2005
    Location
    Lansing, MI; USA
    Posts
    4,286

    Sudoku - generating a puzzle

    I'm a little stuck. I have a class that I'll be using to generate an entire sudoku puzzle in which right now it's almost completely working, it'll generate a board but there's always an error with it (usually 2 to 10 cells will still have a zero in it because there isn't an available number to be filled in)

    Currently here's what I'm doing: I have a 9x9 array of type Integer and I have a 9x9 array of type List(Of Integer) and each element in the list array has the numbers 1 through 9. To fill the 9x9 Integer array I simply start with position 0,0 and work to 8,8 randomly picking a number from the List then a sub will go through and remove that number from the current column, the current row and the current mini-grid.

    This is why there's random cells that still have a 0 (zero) in them, it's because there isn't a number available for that cell because of the cells that came before it and this is where I'm stuck.

    Here's the code:
    Code:
    Option Explicit On
    Option Strict On
    
    Friend Class SudokuBoard
    
        Private WithEvents bw As New System.ComponentModel.BackgroundWorker
        Private m_TheBoard(8I, 8I) As Integer
        Private m_Numbers(8, 8) As List(Of Integer)
    
        Friend Event BoardGenerated(ByVal TheBoard(,) As Integer)
    
    #Region " Constructors "
        Friend Sub New()
            Me.GenerateBoard()
        End Sub
    #End Region
    #Region " GenerateBoard "
        Friend Sub GenerateBoard()
            Call Me.ClearBoard()
            Me.bw.RunWorkerAsync()
        End Sub
    
        Private Sub bw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
            Dim Rand As New Random
            'Dim Index As Integer
    
            For x As Integer = 0I To 8I
                For y As Integer = 0I To 8I
                    m_Numbers(x, y) = New List(Of Integer)
                    m_Numbers(x, y).AddRange(New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9})
                Next y
            Next x
    
            For x As Integer = 0I To 8I
                For y As Integer = 0I To 8I
                    Select Case m_Numbers(x, y).Count
                        Case 0
                            'No available numbers
                        Case 1
                            'Try
                            m_TheBoard(x, y) = m_Numbers(x, y)(0I)
                            'Catch
                            'End Try
                        Case Is > 1
                            'Try
                            'Index = Rand.Next(0I, m_Numbers(x, y).Count)
                            m_TheBoard(x, y) = m_Numbers(x, y)(Rand.Next(0I, m_Numbers(x, y).Count))
                            'Catch
                            'End Try
                    End Select
                    RemoveUsedValue(x, y)
                Next y
            Next x
        End Sub
    
        Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bw.RunWorkerCompleted
            Dim Copy(8, 8) As Integer
            For x As Integer = 0I To 8I
                For y As Integer = 0I To 8I
                    Copy(x, y) = m_TheBoard(x, y)
                Next y
            Next x
            RaiseEvent BoardGenerated(Copy)
        End Sub
    #End Region
    #Region " Friend Methods "
        Friend Sub ClearBoard()
            For x As Integer = 0I To 8I
                For y As Integer = 0I To 8I
                    Me.SetNumber(x, y)
                Next y
            Next x
        End Sub
    
        Friend Sub SetNumber(ByVal Row As Integer, ByVal Col As Integer)
            m_TheBoard(Row, Col) = 0I
        End Sub
    #End Region
    #Region " RemoveUsedValue "
        Private Sub RemoveUsedValue(ByVal Row As Integer, ByVal Col As Integer)
            Dim CurrNumber As Integer = m_TheBoard(Row, Col)
            For i As Integer = 0I To 8I
                m_Numbers(Row, i).Remove(CurrNumber)
            Next i
            For i As Integer = 0I To 8I
                m_Numbers(i, Col).Remove(CurrNumber)
            Next i
            Select Case Get3x3(Row, Col)
                Case "A1"
                    'A1, A2, A3
                    'B1, B2, B3
                    'C1, C2, C3
                    m_Numbers(0, 0).Remove(CurrNumber)
                    m_Numbers(0, 1).Remove(CurrNumber)
                    m_Numbers(0, 2).Remove(CurrNumber)
                    m_Numbers(1, 0).Remove(CurrNumber)
                    m_Numbers(1, 1).Remove(CurrNumber)
                    m_Numbers(1, 2).Remove(CurrNumber)
                    m_Numbers(2, 0).Remove(CurrNumber)
                    m_Numbers(2, 1).Remove(CurrNumber)
                    m_Numbers(2, 2).Remove(CurrNumber)
                Case "A2"
                    'A4, A5, A6
                    'B4, B5, B6
                    'C4, C5, C6
                    m_Numbers(0, 3).Remove(CurrNumber)
                    m_Numbers(0, 4).Remove(CurrNumber)
                    m_Numbers(0, 5).Remove(CurrNumber)
                    m_Numbers(1, 3).Remove(CurrNumber)
                    m_Numbers(1, 4).Remove(CurrNumber)
                    m_Numbers(1, 5).Remove(CurrNumber)
                    m_Numbers(2, 3).Remove(CurrNumber)
                    m_Numbers(2, 4).Remove(CurrNumber)
                    m_Numbers(2, 5).Remove(CurrNumber)
                Case "A3"
                    'A7, A8, A9
                    'B7, B8, B9
                    'C7, C8, C9
                    m_Numbers(0, 6).Remove(CurrNumber)
                    m_Numbers(0, 7).Remove(CurrNumber)
                    m_Numbers(0, 8).Remove(CurrNumber)
                    m_Numbers(1, 6).Remove(CurrNumber)
                    m_Numbers(1, 7).Remove(CurrNumber)
                    m_Numbers(1, 8).Remove(CurrNumber)
                    m_Numbers(2, 6).Remove(CurrNumber)
                    m_Numbers(2, 7).Remove(CurrNumber)
                    m_Numbers(2, 8).Remove(CurrNumber)
                Case "B1"
                    'D1, D2, D3
                    'E1, E2, E3
                    'F1, F2, F3
                    m_Numbers(3, 0).Remove(CurrNumber)
                    m_Numbers(3, 1).Remove(CurrNumber)
                    m_Numbers(3, 2).Remove(CurrNumber)
                    m_Numbers(4, 0).Remove(CurrNumber)
                    m_Numbers(4, 1).Remove(CurrNumber)
                    m_Numbers(4, 2).Remove(CurrNumber)
                    m_Numbers(5, 0).Remove(CurrNumber)
                    m_Numbers(5, 1).Remove(CurrNumber)
                    m_Numbers(5, 2).Remove(CurrNumber)
                Case "B2"
                    'D4, D5, D6
                    'E4, E5, E6
                    'F4, F5, F6
                    m_Numbers(3, 3).Remove(CurrNumber)
                    m_Numbers(3, 4).Remove(CurrNumber)
                    m_Numbers(3, 5).Remove(CurrNumber)
                    m_Numbers(4, 3).Remove(CurrNumber)
                    m_Numbers(4, 4).Remove(CurrNumber)
                    m_Numbers(4, 5).Remove(CurrNumber)
                    m_Numbers(5, 3).Remove(CurrNumber)
                    m_Numbers(5, 4).Remove(CurrNumber)
                    m_Numbers(5, 5).Remove(CurrNumber)
                Case "B3"
                    'D7, D8, D9
                    'E7, E8, E9
                    'F7, F8, F9
                    m_Numbers(3, 6).Remove(CurrNumber)
                    m_Numbers(3, 7).Remove(CurrNumber)
                    m_Numbers(3, 8).Remove(CurrNumber)
                    m_Numbers(4, 6).Remove(CurrNumber)
                    m_Numbers(4, 7).Remove(CurrNumber)
                    m_Numbers(4, 8).Remove(CurrNumber)
                    m_Numbers(5, 6).Remove(CurrNumber)
                    m_Numbers(5, 7).Remove(CurrNumber)
                    m_Numbers(5, 8).Remove(CurrNumber)
                Case "C1"
                    'G1, G2, G3
                    'H1, H2, H3
                    'I1, I2, I3
                    m_Numbers(6, 0).Remove(CurrNumber)
                    m_Numbers(6, 1).Remove(CurrNumber)
                    m_Numbers(6, 2).Remove(CurrNumber)
                    m_Numbers(7, 0).Remove(CurrNumber)
                    m_Numbers(7, 1).Remove(CurrNumber)
                    m_Numbers(7, 2).Remove(CurrNumber)
                    m_Numbers(8, 0).Remove(CurrNumber)
                    m_Numbers(8, 1).Remove(CurrNumber)
                    m_Numbers(8, 2).Remove(CurrNumber)
                Case "C2"
                    'G4, G5, G6
                    'H4, H5, H6
                    'I4, I5, I6
                    m_Numbers(6, 3).Remove(CurrNumber)
                    m_Numbers(6, 4).Remove(CurrNumber)
                    m_Numbers(6, 5).Remove(CurrNumber)
                    m_Numbers(7, 3).Remove(CurrNumber)
                    m_Numbers(7, 4).Remove(CurrNumber)
                    m_Numbers(7, 5).Remove(CurrNumber)
                    m_Numbers(8, 3).Remove(CurrNumber)
                    m_Numbers(8, 4).Remove(CurrNumber)
                    m_Numbers(8, 5).Remove(CurrNumber)
                Case "C3"
                    'G7, G8, G9
                    'h7, H8, H9
                    'I7, I8, I9
                    m_Numbers(6, 6).Remove(CurrNumber)
                    m_Numbers(6, 7).Remove(CurrNumber)
                    m_Numbers(6, 8).Remove(CurrNumber)
                    m_Numbers(7, 6).Remove(CurrNumber)
                    m_Numbers(7, 7).Remove(CurrNumber)
                    m_Numbers(7, 8).Remove(CurrNumber)
                    m_Numbers(8, 6).Remove(CurrNumber)
                    m_Numbers(8, 7).Remove(CurrNumber)
                    m_Numbers(8, 8).Remove(CurrNumber)
            End Select
        End Sub
    #End Region
    #Region " Get3x3 "
        Private Function Get3x3(ByVal x As Integer, ByVal y As Integer) As String
            Dim X_Val As Char, Y_Val As Integer
            Select Case x
                Case 0, 1, 2 : X_Val = "A"c
                Case 3, 4, 5 : X_Val = "B"c
                Case 6, 7, 8 : X_Val = "C"c
            End Select
            Select Case y
                Case 0, 1, 2 : Y_Val = 1
                Case 3, 4, 5 : Y_Val = 2
                Case 6, 7, 8 : Y_Val = 3
            End Select
            Return X_Val & Y_Val
        End Function
    #End Region
    End Class
    Currently using VS 2015 Enterprise on Win10 Enterprise x64.

    CodeBank: All ThreadsColors ComboBoxFading & Gradient FormMoveItemListBox/MoveItemListViewMultilineListBoxMenuButtonToolStripCheckBoxStart with Windows

  2. #2
    I'm about to be a PowerPoster! kleinma's Avatar
    Join Date
    Nov 2001
    Location
    NJ - USA (Near NYC)
    Posts
    23,373

    Re: Sudoku - generating a puzzle

    Do you read C#, This guy seems to have it down.

    http://www.c-sharpcorner.com/UploadF...5-a812535c45e5

  3. #3

    Thread Starter
    PowerPoster JuggaloBrotha's Avatar
    Join Date
    Sep 2005
    Location
    Lansing, MI; USA
    Posts
    4,286

    Re: Sudoku - generating a puzzle

    With some help it's working correctly now, here's the code:
    http://www.vbforums.com/showthread.php?p=3249653
    Currently using VS 2015 Enterprise on Win10 Enterprise x64.

    CodeBank: All ThreadsColors ComboBoxFading & Gradient FormMoveItemListBox/MoveItemListViewMultilineListBoxMenuButtonToolStripCheckBoxStart with Windows

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width