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