よく使う処理 :  桁分離| ポインタ| ソート| 探索


ポインタ

変数の値を読み込む、変数に値を格納するなど変数の操作をするとき、直接その変数を操作するのではなく、その変数の番号を指定して、指定された番号の変数を操作するという方法。これを用いると処理の記述が短くなり効率的です。

例:ダメージ計算

バトルシステムでダメージ計算をする場合を考えてみます。キャラは味方・敵ともに4キャラずつ参戦しているものとし、ダメージ計算式はデフォルトのものを使用するものとします。また、このダメージ計算処理の前に予め、攻撃するキャラとダメージを受けるキャラが決定されているものとし、単体攻撃の場合のみを考えるものとします。

まず、デフォルトの計算式は、
(ダメージ量) = (攻撃する側の攻撃力 / 2) - (ダメージを受ける側の防御力 / 4)
となっています。この計算式で必要なデータは攻撃力と防御力ですが、攻撃力を格納する変数、防御力を格納する変数はそれぞれキャラごとに異なるので、どの変数から必要なデータを取りだすのかを特定すべく、攻撃をする側受ける側の組み合わせを確かめる必要があります。

その組み合わせを考えてみると、味方側を攻撃側とした場合は、4キャラいてその各キャラにとって攻撃対象(敵)が4キャラいるわけなので、4×4=16通りの組み合わせがあります。敵側を攻撃側とした場合も組み合わせの数は同数なので、合わせて32通りとなります。これはつまり、攻撃するキャラとダメージを受けるキャラの組み合わせだけでも条件分岐で32通りの分岐を記述する必要があり、その組み合わせ(分岐)の1つ1つで同じ種類の変数からデータを取りださなければならないということです。

キャラ番号1〜4を味方、5〜8を敵として考えてみます。

攻撃するキャラの番号が1のとき(味方が敵を攻撃する場合)
攻撃を受けるキャラの番号
5のとき
6のとき
7のとき
8のとき
必要な値
キャラ1の攻撃力, キャラ5の防御力
キャラ1の攻撃力, キャラ6の防御力
キャラ1の攻撃力, キャラ7の防御力
キャラ1の攻撃力, キャラ8の防御力
組み合わせの数

計
4通り

攻撃するキャラの番号が2のとき(味方が敵を攻撃する場合)
攻撃を受けるキャラの番号
5のとき
6のとき
7のとき
8のとき
必要な値
キャラ2の攻撃力, キャラ5の防御力
キャラ2の攻撃力, キャラ6の防御力
キャラ2の攻撃力, キャラ7の防御力
キャラ2の攻撃力, キャラ8の防御力
組み合わせの数

計
4通り

・
・
・
攻撃するキャラの番号が8のとき(敵が味方を攻撃する場合)
攻撃を受けるキャラの番号
1のとき
2のとき
3のとき
4のとき
必要な値
キャラ8の攻撃力, キャラ1の防御力
キャラ8の攻撃力, キャラ2の防御力
キャラ8の攻撃力, キャラ3の防御力
キャラ8の攻撃力, キャラ4の防御力
組み合わせの数

計
4通り

これに対してポインタを使った場合は、例えば以下のようにすることができます。

予め、各キャラの能力値を格納する変数を次の表のように規則的に割り当てておきます。

キャラの能力値キャラ1キャラ2・・・キャラ8
HPV[0101]V[0201]・・・V[0801]
SPV[0102]V[0202]・・・V[0802]
Attack(攻撃力)V[0103]V[0203]・・・V[0803]
Defence(防御力)V[0104]V[0204]・・・V[0804]
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・

すると、攻撃するキャラの番号とダメージを受けるキャラの番号(ここではそれらが予め決定されているとする)から、ダメージ計算に必要なデータが格納された変数の番号を次の表のように求めることができます。

必要なデータ必要なデータを格納した変数の番号を算出する式
攻撃する側の攻撃力(攻撃するキャラの番号)×100+3
ダメージを受ける側の防御力(ダメージを受けるキャラの番号)×100+4

こうすれば(これは1つの方法ですが)、32通りもの分岐を作る必要はなくなり、後は算出した番号を持つ変数の値を取りだして作業用変数でダメージ計算をすればいいだけです。ポインタを使った方が処理の記述が短くて効率的になることが何となくわかりませんか?

ここで重要なのは、必要なデータを格納した変数の番号を算出する式を導き出せるかどうかです。算出式がなかったら同じ種類のデータを格納した変数であっても個別にその番号を直接指定することになり、ポインタの利便性が失われます。また、上の表では1キャラに100個分の変数を割り当てていますが、

キャラの能力値キャラ1キャラ2・・・キャラ8
HPV[0101]V[0111]・・・V[0171]
SPV[0102]V[0112]・・・V[0172]
Attack(攻撃力)V[0103]V[0113]・・・V[0173]
Defence(防御力)V[0104]V[0114]・・・V[0174]
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・

という風に1キャラに10個分を割り当てたとしたら必要なデータを格納した変数の番号を算出する式は、

必要なデータ必要なデータを格納した変数の番号を算出する式
攻撃する側の攻撃力(攻撃するキャラの番号 - 1)×10+103
ダメージを受ける側の防御力(ダメージを受けるキャラの番号 - 1)×10+104

となり、各キャラの能力値を格納する変数の割り当て方で算出式が変わってきます。

ちなみにツクール2000では、「変数の操作」ウィンドウの「操作する変数」欄内で「変数・・・の番号の変数」のラジオボタンを選択すれば、ある変数V[xxxx]の値を番号とする変数の操作(その変数への代入・加算、その変数からの減算、など)ができ、この変数は「イベント実行内容」の欄内で
[V[xxxx]]
と表されます。


ホーム → tkool2 → よく使う処理:ポインタ