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 に答える