0

此代码生成堆栈溢出。我知道这是由程序调用自身引起的。我该怎么做才能避免堆栈溢出?调用子过程并生成一个新的随机数是最容易做的事情,但是它会产生溢出。随机生成的数字选择一个随机库存项目,然后 if 语句将该数字(随机库存项目)与甲板库存中该项目的数量相匹配,以确保它不小于 1。如果该项目的库存是0,else播放并重新启动程序,生成一个新的随机数并重新执行该过程。在另一个程序中,我有一个功能,如果甲板的库存完全空了,那么丢弃堆会补充甲板,使丢弃堆变空,

我想知道我是否可以以某种方式强制随机数生成器

Number = (DeckGroup(Rnd.Next(0, DeckGroup.Count)).ID)

DeckGroup(Number).QuantityInteger不要为清零的项目生成编号。通过这样做,我什至不需要调用该函数。随机数由同一结构组中的不同分支生成。

Private Sub PlayElse()
        Dim CardCheckBoxArray() As CheckBox = {CardCheckBox1, CardCheckBox2, CardCheckBox3, CardCheckBox4, CardCheckBox5}
        'Reset Number Generator
            Number = (DeckGroup(Rnd.Next(0, DeckGroup.Count)).ID)
            Dim PlayerQuantitySubtractionInteger As Integer
            For PlayerQuantitySubtractionInteger = ChecksDynamicA To ChecksDynamicB
                If CardCheckBoxArray(TextBoxInteger).Checked = True And DeckGroup(Number).QuantityInteger > 0 Then
                    DeckGroup(Number).QuantityInteger -= 1
                    'Select the Player depending value of T
                    Select Case T
                        Case 0
                            Player1HandGroup(Number).QuantityInteger += 1
                        Case 1
                            Player1HandGroup(Number).QuantityInteger2 += 1
                        Case 2
                            Player1HandGroup(Number).QuantityInteger3 += 1
                        Case 3
                            Player1HandGroup(Number).QuantityInteger4 += 1
                        Case 4
                            Player1HandGroup(Number).QuantityInteger5 += 1
                    End Select
                    CardTypeArray(PlayerQuantitySubtractionInteger) = Player1HandGroup(Number).CardType
                    CardCheckBoxArray(TextBoxInteger).Text = Player1HandGroup(Number).CardNameString
                    NumberArray(PlayerQuantitySubtractionInteger) = Number
            Else
                If CardCheckBoxArray(TextBoxInteger).Checked = True And DeckGroup(Number).QuantityInteger < 0 Then
                    Call PlayElse()
                End If
                End If
        Next PlayerQuantitySubtractionInteger
    End Sub
4

2 回答 2

0

通过列表并仅确定那些有效的。然后从该集合中随机抽取。这是它的一个简单版本。您也可以使用 LINQ,但这应该足够清楚:

Dim validDeckGroupsIndexes As New List(Of Integer)

For ndx As Integer = 0 to DeckGroup.Count - 1
   If DeckGroup(ndx).QuantityInteger > 0 Then
      validDeckGroupsIndexes .Add(ndx)
   End If
Next ndx

然后使用这个:

Dim deckGroupNdx As Integer = Rnd.Next(0, validDeckGroupsIndexes.Count)

Number = DeckGroup(deckGroupNdx).ID
于 2013-03-26T14:21:26.623 回答
0

您可以使用 LINQ 首先清除所有您不想获得的对象,然后使用 linq 返回的集合而不是原始集合。

就像是:

Private Sub PlayElse()
    Dim CardCheckBoxArray() As CheckBox = {CardCheckBox1, CardCheckBox2, CardCheckBox3, CardCheckBox4, CardCheckBox5}
    'Reset Number Generator
    Dim temp As IEnumerable(Of LunchMoneyGame.LunchMoneyMainForm.Group) = From r In DeckGroup Where r.QuantityInteger > 0 Select r
    If temp IsNot Nothing AndAlso temp.Any Then
        Number = (temp(Rnd.Next(0, temp.Count)).ID)

        ' ** Edit **: This will ensure that you only got 1 object back from the LINQ which can tell you whether or not you have bad data. You *can* exclude this check but its good practice to include it.

        Dim obj As LunchMoneyGame.LunchMoneyMainForm.Group = Nothing

        Dim t = From r In temp Where r.ID = Number Select r
        If t IsNot Nothing AndAlso t.Count = 1 Then
            obj = t(0)
        End If

        If obj IsNot Nothing Then
            Dim PlayerQuantitySubtractionInteger As Integer
            For PlayerQuantitySubtractionInteger = ChecksDynamicA To ChecksDynamicB
               ' ** Edit **
               obj.QuantityInteger -= 1
               'Select the Player depending value of T
                Select Case T
                    Case 0
                        Player1HandGroup(Number).QuantityInteger += 1
                    Case 1
                        Player1HandGroup(Number).QuantityInteger2 += 1
                    Case 2
                        Player1HandGroup(Number).QuantityInteger3 += 1
                    Case 3
                        Player1HandGroup(Number).QuantityInteger4 += 1
                    Case 4
                        Player1HandGroup(Number).QuantityInteger5 += 1
                End Select
                CardTypeArray(PlayerQuantitySubtractionInteger) = Player1HandGroup(Number).CardType
                CardCheckBoxArray(TextBoxInteger).Text = Player1HandGroup(Number).CardNameString
                NumberArray(PlayerQuantitySubtractionInteger) = Number
            Next PlayerQuantitySubtractionInteger
        End If
    End If
End Sub
于 2013-03-26T14:26:15.020 回答