我在VB.NET中編寫了一個Sudoku應用程序。目前我正在開發Sudoku智力發生器的實現。我寫的一個有一個奇怪的問題,應用程序剛剛停頓。起初我只是理性地認爲我的代碼中有一個無限循環。所以我添加了一個功能,如果do ... while循環連續運行超過50次,函數將被重置。但那沒有做任何事情!對於我的生活我不能弄清楚我的程序正在發生什麼。如果有人能解釋這個凍結,我會所以感激不盡。我的程序被困在奇怪的凍結/無限循環中
這裏是我的功能/子/子過程:
Private Sub CreatePuzzle(ByVal Dificulty As Integer)
Dim Rand As New Random()
For Each Row As List(Of Box) In Rows
Dim UsedNumbers As New List(Of Integer)
Dim Column As Integer = 0
For Each Cell As Box In Row
Column = Cell.Column
Dim I As Integer
Do
I = Math.Floor(Rand.NextDouble() * 9) + 1
Loop While Arrays.Contains(UsedNumbers.ToArray(), I) Or _
Arrays.Contains(Box.GetValues(Columns(Column)), I) Or _
Arrays.Contains(Box.GetValues(Squares(Math.Floor(Column/3D))), I)
Cell.Val(I)
UsedNumbers.Add(I)
Debug.Print("Row: " & "ABCDEFGHI"(Cell.Row) & ", Column: " & _
(Cell.Column + 1).ToString() & ", Square: " & Cell.Square.ToString() & _
", (Predicted) Square: " & Math.Floor(Column/3D).ToString())
Debug.Print("I: " & I.ToString())
Debug.Print("")
Next
Next
End Sub
而且,這裏是我用來表示在數獨謎題的細胞自定義Box
類的實現:
Public Class Box
Private _Value As Integer = 0
Private _Row As Integer
Private _Column As Integer
Private _Square As Integer
Private Label As Label
Private _Name As String
Public ReadOnly Property Value As Integer
Get
Return _Value
End Get
End Property
Public ReadOnly Property Row As Integer
Get
Return _Row
End Get
End Property
Public ReadOnly Property Column As Integer
Get
Return _Column
End Get
End Property
Public ReadOnly Property Square As Integer
Get
Return _Square
End Get
End Property
Public ReadOnly Property Name As String
Get
Return Label.Name
End Get
End Property
Public Sub New(ByRef Box As Label)
Dim Values As String() = Box.Tag.ToString.Split(",")
If Not Box.Text = "" Then
_Value = Integer.Parse(Box.Text)
End If
_Row = Integer.Parse(Values(0))
_Column = Integer.Parse(Values(1))
_Square = Integer.Parse(Values(2))
Label = Box
End Sub
Public Sub Val(ByVal Digit As Char, ByRef PreVal As Integer, ByRef PrevSelect As Label)
Dim Value As Integer
If Integer.TryParse(Digit, Value) AndAlso Not Value = 0 Then
If Label.Text = "" Then
PreVal = 0
Else
PreVal = Integer.Parse(PrevSelect.Text)
End If
PrevSelect = Label
Label.Text = Digit
_Value = Value
End If
End Sub
Public Sub Val(ByVal Digit As Integer)
If Digit = 0 Then
Label.Text = ""
Else
Label.Text = Digit.ToString()
End If
_Value = Digit
End Sub
Public Shared Function GetValues(ByVal Boxes As List(Of Box)) As Integer()
Dim Output(Boxes.Count - 1) As Integer
For I As Integer = 0 To Output.GetUpperBound(0)
Output(I) = Boxes(I).Value
Next
Return Output
End Function
End Class
編輯:這裏是陣列的代碼.Contains()
Function Contains(ByVal HayStack() As Integer, ByVal Needle As Integer) As Boolean
For I As Integer = 0 To HayStack.GetUpperBound(0)
If HayStack(I) = Needle Then
Return True
End If
Next
Return False
End Function
Please writ writ如果有任何您需要查看的自定義實現,請參閱此處。
哪個是無限循環?你有沒有調試過,看看你的代碼無限循環? –
@Josh部分Do ... while CreatePuzzle循環() –
我的問題有什麼問題嗎?如果有人向我解釋爲什麼他們低估了這個問題,我會很樂意解決這個問題。 –