Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 6: Программирование на Visual Basic искусственного интеллекта. Продолжение 2
Шрифт:
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Private Function CalculateScore As Integer
Dim row As Integer
Dim column As Integer
Dim total As Integer = 0
For column = matrix.GetLength(1) – 1 To 0 Step -1
' If column is completely empty, then move everthing
' down one.
For row = 0 To matrix.GetLength(0) – 1
If Not matrix(row, column) Is Nothing Then
If matrix(row, column).MarkedForDeletion Then
total += 1
End If
End If
Next
Next
Return total
End Function
''' <summary>
''' After the blocks are removed from the columns, there may be
''' columns that are empty. Move columns from right to left to
''' fill in the empty columns.
''' </summary>
''' <remarks></remarks>
Public Sub CollapseColumns
Dim row As Integer
Dim column As Integer
For column = matrix.GetLength(1) – 1 To 0 Step -1
' If column is completely empty, then all the columns
' over one.
Dim noBlocks As Boolean = True
For row = 0 To matrix.GetLength(0) – 1
If Not matrix(row, column) Is Nothing Then
noBlocks = False
End If
Next
If noBlocks Then
Dim newcol As Integer
For newcol = column To matrix.GetLength(1) – 2
For row = 0 To matrix.GetLength(0) – 1
matrix(row, newcol) = matrix(row, newcol + 1)
Next
Next
newcol = matrix.GetLength(1) – 1
For row = 0 To matrix.GetLength(0) – 1
matrix(row, newcol) = Nothing
Next
End If
Next
End Sub
''' <summary>
''' Remove all the blocks from the grid.
''' </summary>
''' <remarks></remarks>
Public Sub CollapseBlocks
Dim theBlock As Block
Dim column As Integer
Dim row As Integer
Dim aRow As Integer
' First remove the blocks from each column.
For column = 0 To matrix.GetLength(1) – 1
For row = matrix.GetLength(0) – 1 To 0 Step -1
theBlock = matrix(row, column)
If (Not theBlock Is Nothing) Then
If theBlock.MarkedForDeletion Then
For aRow = row To matrix.GetLength(0) – 2
matrix(aRow, column) = _
matrix(aRow + 1, column)
Next
matrix(matrix.GetLength(0) – 1, _
column) = Nothing
End If
End If
Next
Next
' Reset the MarkedForDeletion flags.
For row = 0 To matrix.GetLength(0) – 1
For column = 0 To matrix.GetLength(1) – 1
theBlock = matrix(row, column)
If Not theBlock Is Nothing Then
theBlock.MarkedForDeletion = False
End If
Next
Next
' Remove any columns that are now empty.
CollapseColumns
End Sub
''' <summary>
''' Provides access into the grid.
''' </summary>
''' <param name="row"></param>
''' <param name="column"></param>
''' <value></value>
''' <remarks></remarks>
Default Public Property Item(ByVal row As Integer, _
ByVal column As Integer) As Block
Get
Return matrix(row, column)
End Get
Set(ByVal Value As Block)
matrix(row, column) = Value
End Set
End Property
Private blocksToExamine As ArrayList
''' <summary>
''' Set MarkedForDeletion to True for each neighboring block
''' of the same color.
''' </summary>
''' <param name="row"></param>
''' <param name="column"></param>
''' <remarks></remarks>
Private Sub FindSameColorNeighbors(ByVal row As Integer, _
ByVal column As Integer)
Dim color As Color = matrix(row, column).Color
blocksToExamine = New ArrayList
blocksToExamine.Add(New Point(row, column))
matrix(row, column).MarkedForDeletion = True
' Each time you find a neighbor, mark it for deletion, and
' add it to the list of blocks to look for neighbors.
' After you
' examine it, remove it from the list. Keep doing this
' until there are no more blocks to look at.
While blocksToExamine.Count > 0
FindNeighbors
End While
End Sub
''' <summary>
''' Look to the blocks on each side.
''' </summary>
''' <remarks></remarks>
Private Sub FindNeighbors
' Take the first block out of the arraylist and examine it.
Dim location As Point = CType(blocksToExamine(0), Point)
Dim currentBlock As Block = matrix(location.X, location.Y)
Dim row As Integer = location.X
Dim column As Integer = location.Y
blocksToExamine.RemoveAt(0)
Dim nextRow As Integer
Dim nextCol As Integer
Dim selected As Block
' look up
If row < matrix.GetLength(0) – 1 Then
nextRow = row + 1
selected = matrix(nextRow, column)
ExamineNeighbor(selected, nextRow, column, _