Валерий Алексеевич Жарков

Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 6: Программирование на Visual Basic искусственного интеллекта. Продолжение 2


Скачать книгу

Add a new block to each column.

      For column = 0 To matrix.GetLength(1) – 1

      Dim newBlock As New Block(New Color() _

      {Color.Red, Color.Blue, Color.Green, Color.Gray})

      ' Add the new block at the botttom of the column,

      ' and push the rest of the

      ' blocks up one column.

      For row As Integer = matrix.GetLength(0) – 1 To 1 Step -1

      matrix(row, column) = matrix(row – 1, column)

      Next

      matrix(0, column) = newBlock

      Next

      End Sub

      ''' <summary>

      ''' Draw the grid of blocks

      ''' </summary>

      ''' <param name="graphics"></param>

      ''' <param name="backColor"></param>

      ''' <remarks></remarks>

      Public Sub Draw(ByVal graphics As Graphics, _

      ByVal backColor As Color)

      graphics.Clear(backColor)

      Dim row As Integer

      Dim column As Integer

      Dim theBlock As Block

      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

      Dim pointA As New Point( _

      column * Block.BlockSize, _

      row * Block.BlockSize)

      matrix(row, column).Draw(graphics, pointA)

      End If

      Next

      Next

      End Sub

      ''' <summary>

      ''' This method responds to a click event in the UI.

      ''' </summary>

      ''' <param name="point"></param>

      ''' <returns>The number of blocks removed from the grid.</returns>

      ''' <remarks></remarks>

      Public Function Click(ByVal point As Point) As Integer

      ' Figure out row and column.

      Dim total As Integer

      Dim transPt As Point = PointTranslator.TranslateToTL(point)

      Dim selectedRow As Integer = transPt.Y \ Block.BlockSize

      Dim selectedColumn As Integer = transPt.X \ Block.BlockSize

      Dim selectedBlock As Block = matrix(selectedRow, _

      selectedColumn)

      If Not selectedBlock Is Nothing Then

      selectedBlock.MarkedForDeletion = True

      ' Determine if any of the neighboring blocks are

      ' the same color.

      FindSameColorNeighbors(selectedRow, selectedColumn)

      ' Determine how many blocks would be eliminated.

      total = Me.CalculateScore()

      If total > 1 Then

      Me.CollapseBlocks()

      Else

      Me.ClearMarkedForDeletion()

      End If

      End If

      Return total

      End Function

      Private Sub ClearMarkedForDeletion()

      Dim row As Integer

      Dim column As Integer

      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

      matrix(row, column).MarkedForDeletion = False

      End If

      Next

      Next

      End Sub

      ''' <summary>

      ''' Find out how many blocks will be eliminated.

      ''' </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