構造体を勉強したのですが、いまいちどのようなプログラムを組む時に、有効なのかが分かりません。
できればこうゆう時に使ったというのを教えて下さい!!
目的ある変数を管理したい時でしょうか。
A.項目1 B.項目1
A.項目2 B.項目2
A.項目3 B.項目3
A.項目4 B.項目4
比較にも使えますし、何より目的別に管理する必要がある場合は効果があると思います。
例えば、マウスの機能を管理したい時などは
マウス.↑移動
マウス.↓移動
マウス.→移動
マウス.←移動
マウス.右クリック
マウス.右ダブルクリック
マウス.左クリック
マウス.左ダブルクリック
マウス.右ドラッグ
マウス.左ドラッグ
のように名前をつけておけば管理しやすいのでは?
あんちゃんお返事ありがとうございます。
構造体を配列で使いたいのですが使い方がよく分からないので出来れば教えて下さい。
構造体というのは、かいただけでは実体が存在しません。
実行時エラーになったときに"ユーザー定義型"と出るとおり、
まだ変数の型を宣言したようなものに過ぎません。
なので、
Dim record As Myrecord
とかいう風にして、宣言しないといけません。
なので、配列にしたいときは、普通の変数宣言と同じようにやります。
あと、最近気づいたことなんですけど、構造体というのは一つの変数として見られます。
なので、ZeroMemoryなどのAPIなどで、いっぺんに初期化したりできます。
あと、こっちは試したことはありませんけど、
For Eachなどで全要素を参照することもできると思います。
'使い方がわからない、ということですので例を1つ・・・。
'ゲームを作ろうと思ったとします。
'そのゲームには敵が出てきます。
'敵には、識別番号、名称、x座標、y座標、ヒットポイント、攻撃力、防御力、速度があります。
'これを構造体(ユーザ定義型)で宣言/定義しましょう。
'=========================================================
'まずはユーザ定義型の型宣言/定義
Private Type TekiType
ID As Long
Name As String
x As Long
y As Long
hp As Long
Att As Long
Def As Long
sp As Long
End Type
'敵は最大100体でてきますので、配列でユーザ定義型の変数宣言/定義
Dim udtTeki(99) As TekiType
'次に変数の中身を初期化する関数を作ります。
Private Sub TekiInit()
Dim i As Long
For i = 0 To 99
With udtTeki(i)
.ID = i + 1
.Name = "スライム" & CStr(.ID) ' 名前はスライム1〜スライム99
.x = Int(Rnd * 100)
.y = Int(Rnd * 100)
.hp = Int(Rnd * 6) + 5 ' ヒットポイントは 5〜10
.Att = Int(Rnd * 4) + 3 ' 攻撃力は 3〜6
.Def = Int(Rnd * 3) + 2 ' 防御力は 2〜4
.sp = Int(Rnd * 2) + 1 ' 速度は 1〜2
End With
Next
End Sub
'で、敵にダメージを与える関数は
Private Sub TekiDamage(lngTekiNo As Long, lngDamage As Long)
Dim strMsg As String
With udtTeki(lngTekiNo)
If .hp = 0 Then
strMsg = .Name & " はすでに死んでいる"
Else
If .hp - lngDamage < 0 Then
lngDamage = .hp
.hp = 0
Else
.hp = .hp - lngDamage
End If
strMsg = .Name & " は " & CStr(lngDamage) & " のダメージを受けた"
strMsg = strMsg & vbCrLf & .Name & " の体力は " & CStr(.hp) & " になった"
If .hp = 0 Then
strMsg = strMsg & vbCrLf & .Name & " は死んだ"
End If
End If
MsgBox strMsg
End With
End Sub
'でもって、ボタンを押したらスライム11に5のダメージを与えましょう。
Private Sub Command1_Click()
Call TekiDamage(10, 5)
End Sub
'あとは、Form_Loadで初期化処理を呼べば出来上がり。
Private Sub Form_Load()
Randomize
Call TekiInit
End Sub
'=========================================================
'ゲームにはほど遠いですが、Formにボタン1個置いて、
'このレスを丸ごと貼り付ければ、一応動作します。
'ボタンを2回も押せばスライム11を退治できるでしょう。
'ちなみに、今回の例ようにユーザ定義型変数に
'敵の攻撃、敵の防御などの関数を関連付けたほうが都合がいいときは、
'クラス化したほうがすっきりします。
'PS.
'適当に作ってるのであら捜ししないように (^_^;
固定長の物は配列に入れるにはどうしたらいいのでしょうか
構造体ではなく配列ですか?
結局何がやりたいのでしょう?
やりたいことがあるのならはっきり書かないと
無駄に時間とトラフィックとサーバリソースを
浪費するだけです。
10バイトのデータを配列にとりたいなら
Dim bytData(10) As Byte
とすればいいでしょう。
失礼、
VBの場合、
Dim bytData(9) As Byte
ですね。
ツイート | ![]() |