【问题标题】:VBA dice roll with additionVBA掷骰子加法
【发布时间】:2023-03-28 10:33:01
【问题描述】:

VBA 掷骰子即使对我来说也很容易,但我需要特定的类型,当掷 6 表示你可以再次掷骰并将两个掷骰相加(加上当你连续掷 6 次时,你会得到第三掷和等等)。

我尝试了两种方法,但都失败了

Sub roll_dice_1()

Dim result As Range

Set result = Range("A1")

result = Application.WorksheetFunction.RandBetween(1, 6)

If result = 6 Then
  result = result + Application.WorksheetFunction.RandBetween(1, 6)
  Do Until Application.WorksheetFunction.RandBetween(1, 6) <> 6
  result = result + Application.WorksheetFunction.RandBetween(1, 6)
  Loop
   Else
End If

End Sub

然而,这个可以产生 12 的结果,这显然是不可能的,因为两次 6 应该给出第三次滚动

Sub roll_dice_2()

Dim result As Range

Set result = Range("A1")

result = Application.WorksheetFunction.RandBetween(1, 6)

If result = 6 Then
  Do Until Application.WorksheetFunction.RandBetween(1, 6) <> 6
  result = result + Application.WorksheetFunction.RandBetween(1, 6)
  Loop
   Else
End If

End Sub

这个更糟糕,因为它可以返回 6。

我尝试搜索高低搜索,但我得到的只是简单的代码,用于简单的掷骰、两个骰子的掷骰以及某些结果可以重新掷骰时的掷骰。同样,所有选项都很简单,不像这个

【问题讨论】:

    标签: vba excel loops random dice


    【解决方案1】:

    循环错误。您不能 roll 在条件下然后再次 roll 累积,因为这些已经是 2 次滚动。

    基本上你需要的是条件最后出现的循环,例如

    结果 = 0 做 滚=... 结果=结果+滚动 滚动时循环 6

    【讨论】:

      【解决方案2】:

      您的问题是您正在生成一个随机数来进行测试,然后生成一个不同的数字来添加到您的结果中。它们必须相同。 VBA也有自己的随机函数。

      Sub roll_dice()
          Dim result As Integer, roll as Integer
          Dim lowerbound As Integer, upperbound As Integer
      
          lowerbound = 1
          upperbound = 6
      
          result = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
      
          If result = upperbound Then
              roll = result
              Do While roll = upperbound
                roll = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
                result = result + roll
              Loop
          End If
      
          MsgBox result
      End Sub
      

      【讨论】:

      • 谢谢,我知道循环错误会是这样的,但我不知道如何使它工作
      • 顺便说一句,当整数应该足够时,你有什么理由声明结果并滚动多久?
      • 在这种情况下可能是不良习惯。我习惯使用它来避免溢出错误,但是在这种情况下你不会冒这个问题的风险。所以你是对的。已更正
      • @telesien 在现代系统中使用Long 实际上可以更快。请参阅this post from RubberDuck 解释它。
      • @BerticusMaximus 谢谢 - 知道还有其他原因,但记不起我的一生
      【解决方案3】:

      如果处理6似乎有问题,如果是reroll,那么你应该执行:

      ... 滚动 = 6

      do while roll = 6
       roll = Int(( 6 * Rnd + 1)
       ShowRoll(roll)
      loop
      
      DoStuffWithRollValue
      

      ...

      这将显示每卷直到第 1-5 行 ShowRoll 是对动画或其他显示滚动的方法的调用

      【讨论】:

        【解决方案4】:
        Sub roll_dice()
            Dim die1, die2 As Integer
            
            'Randomize
            die1 = (Hour(Rnd) Mod 6) + 1
            die2 = (Hour(Rnd) Mod 6) + 1
        Exit Sub
        

        【讨论】:

        • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
        猜你喜欢
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        相关资源
        最近更新 更多