VBA扫雷器随机生成

时间:2018-07-28 19:24:00

标签: vba minesweeper

我无法在Visual Basic语言中找到有关此问题的任何信息,但我试图为5x5扫雷游戏生成10个且只有10个随机地雷。我的问题涉及地雷的数量。我经常只生成4个地雷,或者10多个地雷,而且它总是不一致的。这是我的代码:

Sub Minesweeper()
    Dim i As Single
    Dim Col As Single
    Dim Row As Single
    Dim BombArray(1 To 5, 1 To 5) As String


    'assignment of mines
    Do
        Row = Application.WorksheetFunction.RandBetween(1, 5)
        Col = Application.WorksheetFunction.RandBetween(1, 5)
    1
        If BombArray(Row, Col) <> "X" Then
            BombArray(Row, Col) = "X"
            Sheet1.Cells(4 + Row, 3 + Col).Value = BombArray(Row, Col)

        Else
            i = i + 1
            GoTo 1
        End If
    Loop Until i = 10

End Sub

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

为循环使用标准

此外,由于您使用的是数组,因此在循环之后仅分配一次数组:

Sub Minesweeper()
    Dim i As Single
    Dim Col As Single
    Dim Row As Single
    Dim BombArray(1 To 5, 1 To 5) As String


    'assignment of mines
    For i = 1 To 10
        Row = Application.WorksheetFunction.RandBetween(1, 5)
        Col = Application.WorksheetFunction.RandBetween(1, 5)

        If BombArray(Row, Col) <> "X" Then
            BombArray(Row, Col) = "X"
        Else
            i = i - 1
        End If
    Next i

    Sheet1.Range("D5").Resize(UBound(BombArray, 1), UBound(BombArray, 2)).Value = BombArray

End Sub

答案 1 :(得分:1)

建立一个有关地雷位置的字典,并不断添加/覆盖,直到达到10。

Option Explicit

Sub Minesweeper()
    Dim mines As Object

    Set mines = CreateObject("scripting.dictionary")

    Do While mines.Count < 10
        mines.Item(Cells(Application.RandBetween(5, 9), Application.RandBetween(4, 8)).Address(0, 0)) = vbNullString
    Loop

    Debug.Print Join(mines.keys, ", ")
    Sheet1.Range(Join(mines.keys, ", ")) = "x"
End Sub