|
| 移動可能範囲を計算する手順は次の通りだ。 |
| 戦術マップの左上、座標(1,1)から右方向へユニットが存在するかどうかをチェックしていく。 |
| 現在、座標(3,3)に味方のユニットがいる。 |
| |
| 次にこの座標(3,3)を基準にして、周りの座標へ移動可能であるか調べに行く。 |
| 上、右、下、左の順にチェックを行い、移動可能なら、移動力を1減らした値をそこへ格納する。 |
| 移動力はWaik配列を使っており、10×10の2次元配列内へ、とこへ移動したときの残りの移動ポイントを |
| 格納する。1歩動くごとに移動力を1消費するとして、初期座標(3,3)から周囲へ動いた場合、残りの移動 |
| ポイントは「2」になる。 |
| |
 |
|
| pubMoveルーチン処理へ飛ばして、移動可能範囲を探る。 |
| この処理は「経路探索処理」と呼ばれているようなので、当サイトも名前の使用に当たって倣うことにした。 |
| |
 |
| |
 |
| |
| 戦術マップに登場するユニットは、4種類で、すべて同じ移動力「2」をもっている。 |
| そして、1歩移動するごとに移動力を1消費するものとする。つまり、2マス分しか動けないわけだ。 |
| ただし、プログラムの関係上、最大移動力は「3」として変数・配列等へ格納するものとする。 |
| |
| pubMove2ルーチンを眺めてみよう。 |
| ここでは、上右下左の座標(マス目)への経路を格納している。 |
| 「U」「R」「D」「L」という記号をstrDerectionString変数へ格納していく。 |
| 「U」はUpの、「R」はRightの頭文字だ。 |
| |
 |
| |
| pubMoveChkルーチンは、その座標へ移動できるかチェツクするプログラムだ。 |
| 戦術マップの外へ出てはいけない、通行不可能なところであってはならない、ユニットがいてはならない、など |
| の条件がある。そして移動可能だと分かれば、MoveDerection配列へ、そこまでの経路を文字列で格納する。 |
| |
 |
| |
| MoveDerection配列に、「RD」と入っていたら、右、下の順に移動すれば、そこへたどり着けるという意味に |
| なる。またWalk配列は何を意味しているのかというと、移動可能な座標へ移動したときの残りの移動ポイント |
| である。 |
| 当然、遠くへ行くにしたがって減っていく。最終的には、次のような値の格納された配列を作ることである。 |
| |
 |
| |
| 2次元配列を分かりやすくするために、X座標・Y座標からなるマトリクス(表)で示した。 |
| ■の部分が現在、そのユニットのある座標である。隣へ動こうとすると移動力が1減る。 |
| 配列の初期値は0であるから、0を移動不可能な座標と考えている。 |
| |
| Walk(3,2)やWalk(4,4)は、移動不可能にして(「おまけ」としてプログラム内に書き込んだ部分)、処理を抜けて |
| いるから、入っている値は初期値の0である(思い出してください)。 |
| |
 |
| |
| MoveDerection配列には、そこへ行き着くまでの経路が文字列として格納される。 |
| MoveDerection(2,2)に「LU」と入っているのは、座標(3,3)から左、上へ移動すると、その場所へたどりつく |
| という意味である。LはLeft、UはUpの頭文字を示している。 |
| |
| MoveDerection(2,4)が「DL」であって「LD」でないのは、プログラムの処理上から、そのようになってしまうため。 |
| 結果として、移動先は同じになるが経路が異なることになる。経路の違いで生じる問題は、後の課題とする。 |
| (同地点に行くためのルートがふたつあるとして、一方のルートには敵が隠れているとか) |
| |
| 移動範囲探査処理はけっこう複雑なので、詳細に見ていくことにする。 |
| |