【问题标题】:Making every variable in this code Dynamic Visual Basic 2010使此代码中的每个变量 Dynamic Visual Basic 2010
【发布时间】:2013-03-21 00:16:17
【问题描述】:

抱歉,代码太长了。在我正在设计的游戏中,我的代码从 checkbox.checked if 语句当前重复 5 次,每个复选框都被点击——每个复选框都等于游戏中玩家手中的一张牌。

我想知道的是,我能做些什么来让它变得更有活力。即 CardCheckBox1.Checked 对象/方法。如上所述,代码重复了 5 次,因为我有 5 个现有复选框。有没有办法将复选框放入数组或集合中,所以当我单击复选框并点击播放按钮时,它相当于点击 CardCheckBox2.checked = true、CardCheckBox2.checked = true 等。一旦我弄清楚如何为了使那部分动态化,我终于可以开始使其余代码动态化,因为我假设制作动态标签代码的过程与复选框等非常相似。

我吃过

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

在模块化级别、Form_Load 过程甚至 Play_Button 过程中发布,但我总是在 CardCheckBox(n).Checked 部分代码中出现空引用异常

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

【问题讨论】:

  • 如果可以的话,提出一些建议,以使您的代码更易于管理...在AtkPlayerDialog 检查中使用Select Case;循环遍历PlayerHandGroup,而不是对索引进行硬编码。尝试在条件语句中使用AndAlso 而不是And(以及OrElse 而不是Else)。
  • 我看不到 Select Case 如何缩短我的 AtkPlayer 对话框代码。无论如何,该部分工作正常。复选框和 play1handgroup 都必须为真——如果我把它短路,那么这两个结果就会是错误的......
  • 不用担心,它们只是建议,所以请随意忽略。 Select Case 将避免编写AtkPlayerDialog.DialogResult 五次,并且更少的重复使得代码更易于维护。 AndAlso 不会短路,它确保两个语句都是正确的,但它比And 好得多,因为如果第一个语句是错误的,它会避免执行第二个语句(如果你有If something IsNot Nothing AndAlso Something = "Whatever" then ... 如果你有If something IsNot Nothing AndAlso Something = "Whatever" then ...你有And 在这种情况下,如果something 什么都没有,你会得到一个例外。

标签: arrays vb.net checkbox


【解决方案1】:

如果您在大多数表单代码中/通过大多数表单代码使用复选框数组,则将其从表单加载事件中移出直到表单级别范围。当它在 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

等等等等

【讨论】:

  • 我刚刚在 play_button 过程中发布了它。它终于起作用了!但我现在意识到我可能需要重新考虑我的一些代码。不过非常感谢。
  • 我自己想通了,并在 Zaf 明智的话之后使代码完全动态化。
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 2013-03-07
相关资源
最近更新 更多