Этот код генерирует переполнение стека. Я знаю, что это вызвано вызовом самой процедуры. Что я могу сделать, чтобы избежать переполнения стека? Вызов подпроцедуры и генерация нового случайного числа — это самое простое, что можно сделать, однако это приводит к переполнению. Случайно сгенерированное число выбирает случайный предмет инвентаря, затем оператор if сопоставляет это число (случайный предмет инвентаря) с количеством этого предмета из инвентаря колоды, чтобы убедиться, что оно не меньше 1. Если инвентарь этого предмета 0, else воспроизводит и перезапускает процедуру, генерируя новое случайное число и повторяя процесс заново. В другой процедуре у меня есть функция, согласно которой, если инвентарь колоды становится полностью пустым, то стопка сброса пополняет колоду, делая стопку сброса пустой, поэтому никогда не должно быть случая, когда все случайно сгенерированные числа могут быть связаны с элементом инвентаря. 0.
Интересно, можно ли как-то заставить генератор случайных чисел
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
Number = (DeckGroup(Rnd.Next(0, DeckGroup.Count)).ID)
наNumber = (DeckGroup(Rnd.Next(1, DeckGroup.Count)).ID)
, что приведет к тому, что 1 будет наименьшим случайным числом, которое может быть возвращено. - person Mike_OBrien   schedule 26.03.2013