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