Dim possibleCells As Collection
Dim Hits As Range
Public Sub Init()
    Dim b As Range
    Dim col As Integer, row As Integer
        
    Set possibleCells = New Collection
    Set b = Battleship.Range(board2)
    For col = 1 To b.Columns.Count
        For row = 1 To b.Rows.Count
            possibleCells.Add (b.Cells(row, col).Address)
        Next
    Next
End Sub
Public Sub Move()
    Dim index As Integer
    index = -1
    Dim oShip As Ship
    Dim isHit As Boolean
    For Each oShip In g_userShips
        If oShip.Hits.Count > 0 And oShip.Hits.Count < oShip.Position.Cells.Count Then
            index = GetHit(oShip)
            Exit For
        End If
    Next
    
    If index < 0 Then
        index = (Rnd * (possibleCells.Count - 1)) + 1
    End If
    Dim cell As Range
    Set cell = Battleship.Range(possibleCells(index))
    isHit = False
    SetHit cell
    For Each oShip In g_userShips
        If oShip.isHit(cell, False) Then
            If CheckWinner(g_userShips) Then
                SetShipsVisible
                MsgBox "Computer wins!"
                Exit Sub
            End If
            isHit = True
            Exit For
        End If
    Next

    If IsHit = False Then
        Battleship.Unprotect
        Battleship.Cells(g_logRow, 2).value = "The Computer gets a miss on " & cell.Address
        Battleship.Names("ComputerMisses").RefersToRange.value = Battleship.Names("ComputerMisses").RefersToRange.value + 1
        g_logRow = g_logRow + 1
		Battleship.Protect ""
    End If
    possibleCells.Remove index
End Sub

Private Sub SetShipsVisible()
    Battleship.Unprotect
    Dim oShip As Ship
    For Each oShip In g_Ships
        Dim cell As Range
        For Each cell In oShip.Position.Cells
            If cell.Interior.Color <> ColorConstants.vbRed Then
                cell.Interior.Color = ColorConstants.vbBlack
            End If
        Next
    Next
    Battleship.Protect ""
End Sub
Private Function GetHit(oShip As Ship) As Integer
    Dim isHorizontal As Boolean
    If oShip.Hits.Count = 1 Then
        isHorizontal = Int((Rnd * 2)) = 1
    Else
        If oShip.Hits(1).row = oShip.Hits(2).row Then
            isHorizontal = True
        Else
            isHorizontal = False
        End If
    End If
    
    Dim index As Integer
    index = -1
    While index = -1
        If isHorizontal Then
            For Each Hit In oShip.Hits
                index = FindPossible(Hit.Offset(0, -1))
                If index = -1 Then
                    index = FindPossible(Hit.Offset(0, 1))
                    If index <> -1 Then
                        Exit For
                    End If
                Else
                    Exit For
                End If
            Next
            If index = -1 Then
                isHorizontal = False
            End If
        Else
            For Each Hit In oShip.Hits
                index = FindPossible(Hit.Offset(-1, 0))
                If index = -1 Then
                    index = FindPossible(Hit.Offset(1, 0))
                    If index > -1 Then
                        Exit For
                    End If
                Else
                    Exit For
                End If
            Next
            If index = -1 Then
                isHorizontal = True
            End If
        End If
    Wend
    GetHit = index
End Function
Private Function FindPossible(r As Range)
Dim index As Integer
Dim cell As Range
For index = 1 To possibleCells.Count
    If possibleCells(index) = r.Address Then
        FindPossible = index
        Exit Function
    End If
Next
FindPossible = -1
End Function