我在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循环() –
我的问题有什么问题吗?如果有人向我解释为什么他们低估了这个问题,我会很乐意解决这个问题。 –