2013-03-21 2 views
0

Извините за длинный фрагмент кода. В игре, которую я разрабатываю, у меня есть этот код, начиная с 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 
+0

Пара предложений, если я могу, чтобы облегчить ваш код для управления ... Используйте 'Select Case' на проверка «AtkPlayerDialog»; Прокручивайте «PlayerHandGroup» вместо жесткого кодирования индексов. Попробуйте использовать 'AndAlso' вместо' And' в ваших условных операторах (а также 'OrElse' вместо' Else'). –

+0

Я не вижу, как Select Case сократит мой код диалога AtkPlayer. Эта часть работает нормально, так как это так или иначе. И флажок, и команда play1handgroup должны быть правдой - если я его закорочу, два, тогда результаты будут ошибочными ... –

+0

Не беспокойтесь, они были только предложениями, поэтому не стесняйтесь игнорировать. 'Select Case' не позволит писать' AtkPlayerDialog.DialogResult' пять раз, а меньшее количество повторений делает более удобный код. 'AndAlso' не является короткозамкнутым, это гарантирует, что оба оператора верны, но он намного лучше, чем' И', потому что он избегает выполнения второго оператора, если первый из них является ложным (очень полезно, что у вас есть 'If something IsNot Nothing AndAlso Something = «Независимо от того, что ...», если у вас есть «И» в этом случае вы получите исключение, если «что-то» ничего. –

ответ

0

Я ж вы использовать массив флажка внутри/через большинство вашей формы коды затем переместить его о случае загрузки формы прямо вплоть до объема уровня формы. когда он находится внутри подпрограммы события forn_load, это не то же самое, что и область уровня модуля.

так что вы бы ......

Dim CardCheckBoxArray() As CheckBox = {CardCheckBox1, CardCheckBox2, CardCheckBox3, CardCheckBox4, CardCheckBox5} 


Sub Form_Load(blah blah blah) 
    ... 
End Sub 

Sub Play_Button(blah blah blah) 
    ... 
End Sub 

и т.д. и т.п.

+0

Я только что опубликовал его в процедуре play_button. поймите, что мне может потребоваться переосмыслить некоторые из моего кода. Спасибо большое. –

+0

приветствую вас, рад помочь. – Zeddy

+0

Я понял это сам и сделал код полностью динамичным после мудрых слов Сафа. –

Смежные вопросы