0

長いコードで申し訳ありません。私が設計しているゲームでは、チェックボックスから始まるこのコードがあります。チェックボックスがクリックされるたびに現在 5 回繰り返される if ステートメント - 各チェックボックスは、ゲーム内のプレーヤーの手の中のカードに相当します。

私が知りたいのは、それをほとんど動的にするために何ができるかということです。つまり、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 部分で常に nullreference 例外が発生します。

If CardCheckBoxArray(0).Checked = True And Player1HandGroup(Number1).QuantityInteger > 0 Then

だからどこに行けばいいのかわからない。コードの長い部分は、他の CardCheckBox if ステートメントを除いて、私の PlayButton_Click プロシージャ全体です。

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
4

1 に答える 1

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

などなど

于 2013-03-21T00:31:41.783 に答える