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