Извините за длинный фрагмент кода. В игре, которую я разрабатываю, у меня есть этот код, начиная с checkbox.checked if, который в настоящее время повторяется 5 раз для каждого щелчка по галочке - каждый флажок равен карте в руке игроков в игре.Создание каждой переменной в этом коде Dynamic Visual Basic 2010
Что я хотел бы знать, это то, что я могу сделать, чтобы сделать его в основном динамичным. А именно: CardCheckBox1.Проверенный объект/метод. Как указано выше, код повторяется 5 раз, так как у меня есть 5 существующих флажков. Есть ли способ разместить флажки в массиве или коллекции, поэтому, когда я нажимаю флажок и нажимаю кнопку воспроизведения, это будет эквивалентно удалению CardCheckBox2.checked = true, CardCheckBox2.checked = true и т. Д. Как только я рисую, как чтобы сделать эту часть динамика, я могу, наконец, начать делать остальную часть кода динамического, так как я полагаю, процедуру принятия динамического кода метки будет очень похожи на флажки и т.д.
Я имел
Dim CardCheckBoxArray() As CheckBox = {CardCheckBox1, CardCheckBox2, CardCheckBox3, CardCheckBox4, CardCheckBox5}
, размещенный на модульном уровне, в процедуре Form_Load и даже в процедуре Play_Button, но всегда я получаю исключение с нулевой ошибкой в CardCheckBox (n) .Проверенная часть кода, когда я делаю
If CardCheckBoxArray(0).Checked = True And Player1HandGroup(Number1).QuantityInteger > 0 Then
Так что я не знаю, с чем это связано. Длинная часть кода - это моя вся процедура PlayButton_Click, за исключением других утверждений CardCheckBox if.
Private Sub PlayButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlayButton.Click
Dim n As Integer
Dim WeaponDiscardInteger As Integer = 1
AtkPlayerDialog.ShowDialog()
'Code for choosing which player to attack
If AtkPlayerDialog.DialogResult = Windows.Forms.DialogResult.Cancel Then
n = 2
ElseIf AtkPlayerDialog.DialogResult = Windows.Forms.DialogResult.OK Then
n = 1
ElseIf AtkPlayerDialog.DialogResult = Windows.Forms.DialogResult.Abort Then
n = 3
ElseIf AtkPlayerDialog.DialogResult = Windows.Forms.DialogResult.Retry Then
n = 4
ElseIf AtkPlayerDialog.DialogResult = Windows.Forms.DialogResult.Ignore Then
n = 5
End If
'playing card 1
If CardCheckBox1.Checked = True And Player1HandGroup(Number1).QuantityInteger > 0 Then
'Subtract Hitpoints when damage is delt
Player1HandGroup(n).HitPoints -= Player1HandGroup(Number1).DamageInteger
HitPoints1.Text = Player1HandGroup(1).HitPoints.ToString
HitPoints2.Text = Player1HandGroup(2).HitPoints.ToString
HitPoints3.Text = Player1HandGroup(3).HitPoints.ToString
HitPoints4.Text = Player1HandGroup(4).HitPoints.ToString
HitPoints5.Text = Player1HandGroup(5).HitPoints.ToString
'When player plays hand, card quantity is removed from hand to discard pile.
Player1HandGroup(Number1).QuantityInteger -= 1
DiscardGroup(Number1).QuantityInteger += 1
'Shuffle Deck from Discard Pile if Deck is out of cards
Call DiscardPile()
'Reset Number Generator, unless weapon isn't discard
Number = (DeckGroup(Rnd.Next(0, DeckGroup.Count)).ID)
If DeckGroup(Number).QuantityInteger > 0 Then
'Grab New Card From Deck
DeckGroup(Number).QuantityInteger -= 1
Player1HandGroup(Number).QuantityInteger += 1
Card1Type = Player1HandGroup(Number).CardType
CardCheckBox1.Text = Player1HandGroup(Number).CardNameString
Number1 = Number
Else
Call PlayElse()
End If
Пара предложений, если я могу, чтобы облегчить ваш код для управления ... Используйте 'Select Case' на проверка «AtkPlayerDialog»; Прокручивайте «PlayerHandGroup» вместо жесткого кодирования индексов. Попробуйте использовать 'AndAlso' вместо' And' в ваших условных операторах (а также 'OrElse' вместо' Else'). –
Я не вижу, как Select Case сократит мой код диалога AtkPlayer. Эта часть работает нормально, так как это так или иначе. И флажок, и команда play1handgroup должны быть правдой - если я его закорочу, два, тогда результаты будут ошибочными ... –
Не беспокойтесь, они были только предложениями, поэтому не стесняйтесь игнорировать. 'Select Case' не позволит писать' AtkPlayerDialog.DialogResult' пять раз, а меньшее количество повторений делает более удобный код. 'AndAlso' не является короткозамкнутым, это гарантирует, что оба оператора верны, но он намного лучше, чем' И', потому что он избегает выполнения второго оператора, если первый из них является ложным (очень полезно, что у вас есть 'If something IsNot Nothing AndAlso Something = «Независимо от того, что ...», если у вас есть «И» в этом случае вы получите исключение, если «что-то» ничего. –