【はじめてのプチコン】ライブラリのプログラム解説③ | りょうのゲーム塾

りょうのゲーム塾

再開、準備中。

■GETDIR
指定された位置から上下左右に移動できる方向をランダムに求めます。


このサブルーチンの説明を行う前に少し解説をしておきましょう。


図1)位置関係
$思い出の欠片


図1を見てください。
中央の緑部分が現在指定されている位置となります。
その位置から上下左右方向に自分が進める場所があるかどうかを検索します。
コンピュータで上下左右といってもそのままでは扱えないので上下左右を数値に置き換えます。
ここでは上を1、下を3、右を2、左を4としています。
あと、ここには表記されていませんがもし進める方向が無い場合には0を使います。

ここで一つ不思議に思われることがあるならば、数値の割り当てでしょうね。
上下左右だったら上を1、下を2、右を3、左を4でも構わないのでは?
そう思われる方もいると思います。

実際にはそれでもいいのですが、実はこれには理由があります。
私の経験上この方が後で楽になるからです。
例えば上を向いている場合にそこに壁があったら皆さんだったらどうしますか?
回れ右して後ろを見ますか?
私だったら右周りもしくは左周りに通路かどうか探します。
ここでは明らかに右周りになりますね。

そのほかにも理由はありますがここでは解説を控えたいと思います。


では、プログラムの説明です。


@GETDIR
_R0=X:_R1=Y:_R2=0


_Rで始まる変数は今回ライブラリで使用する一時的な変数です。
前にも述べたようにプチコンベーシックは一度使った変数をできるだけ再利用します。
位置変数であるXとYの値を_R0と_R1へ退避(保存)しておきます。
なぜ保存するかというと後でこのXとYの値が変化するからです。

変数_R2はここで使用する配列の書き込み位置を表します。


FOR DIR=1 TO 4


変数DIRは方向変数です。
1から4までということは上、右、下、左の順番にという意味です。


X=_R0:Y=_R1


これはもともと変数XとYに入っていた位置座標をもとに戻します。


ON DIR-1 GOSUB @UPDPOSU,@UPDPOSR,@UPDPOSD,@UPDPOSL


これはDIRの値で呼び出すサブルーチンを選択しています。
この様なコードは良く使うので覚えておいてください。
DIRの値は0から4までです。
DIR-1の値はー1から3までになります。

値がー1(DIRの値が0)の場合はサブルーチンを呼び出しません。
ただし値がー1になることはありません。

値が1(DIRの値が1)の場合、要するに上の場合ですね。
この時UPDPOSUサブルーチンを呼び出します。
UPDPOSUは変数X,Yに代入された座標を上方向にひとつ進めます。

値が2(DIRの値が2)の場合、要するに右の場合ですね。
この時UPDPOSRサブルーチンを呼び出します。
UPDPOSRは変数X,Yに代入された座標を右方向にひとつ進めます。

これと同様に値が3の時、変数X,Yに代入された座標を下方向にひとつ進め、
値が4の時、変数X,Yに代入された座標を左方向にひとつ進めます。


GOSUB @MAPCHKW
IF F!=0 @GETDIR1
_R(_R2)=DIR:_R2=_R2+1
@GETDIR1
NEXT DIR


DIRの値は上右下左の順番に変化します。
その方向に進んだ後にその位置が壁かどうか判断します。
そして結果壁だった場合には次の方向を試します。
もし壁でなかったらその方向を配列_Rの先頭から順番に代入します。
_R2は最初0なので配列の先頭にDIRの値を代入します。
その後_R2の値をひとつ増やします。

この作業で進める方向のDIRの値が配列_Rの先頭から詰められます。
すべての方向を試したら終了です。

最後のプログラムですが説明しやすいように、仮の値を設定しておきます。
たまたま、壁のない方向が上と右だった場合、配列_Rは次のようになっています。

_R(0) … 1
_R(1) … 2
_R2 … 2

となっています。


_R2=RND(_R2):DIR=_R(_R2)


まず_R2は行ける方向がいくつあるかを指します。
今回の例では2方向ですね。
それも行ける方向は上と右ですから1と2が入っています。

RND(_R2)で0から個数ー1までの値をランダムに選択しています。
そしてその値を_Rで指定します。
例ではRND(_R2)はRND(2)となります。
値は0~1となります。
ここで仮に1だった場合には

DIR=_R(1)要するに2がDIRに代入されます。

これは右方向を意味します。


X=_R0:Y=_R1:RETURN


サブルーチンの中で変化した変数XとYを元に戻して戻ります。