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

りょうのゲーム塾

再開、準備中。

$思い出の欠片

ライブラリの解説を行います。


■LIB_INIT
LIB_INIT はライブラリの初期化を行います。
主にライブラリのなかで使うデータなどの初期化です。

今回はライブラリで使う配列変数 _R を定義しています。
配列は数値配列で要素数は現在最大4個あれば良いので4になっていますが、
今後もっと使用することになれば増やします。
この配列は特定のデータを扱うためにあるんでなく、
汎用的に使用する配列です。


■GETMAPDT
数値変数XとYに座標を設定した後に呼び出します。
マップのデータは文字列配列 MAP$ に代入されているので、
指定位置の文字を取り出し文字列変数C$に代入し戻ります。

文字列配列 MAP$ は横一列分のマップデータが入っているので、
変数Yで指定される縦の位置(Y座標)が配列の要素番号になります。

MAP$(Y) ← Y位置の横一列分のデータ

変数Xで指定される横の位置(X座標)が文字列に位置になりるので
その位置の文字を取り出すために MID$ 関数を使用します。

MID$( 目的の文字列 , 文字を取り出す位置 , 取り出す文字数 )

目的の文字列は MAP$(Y) で取り出す位置は変数Xに入っている1文字なので

MID$( MAP$(Y), X, 1)

となります。
この取り出した文字をC$に代入して返します。


■MAPCHKW
数値変数XとYに座標を設定した後に呼び出します。
指定した位置が壁であれば変数Fに1を
もし壁でなければ変数Fに0を入れて戻ります。

変数Fはフラグ(Flag)変数です。
変数の値の意味はフラグが立っている状態か
フラグが立っていない状態かを表しています。

フラグが立っている状態を真(true)といい
フラグが立っていない状態を偽(false)といいます。

このサブルーチンではフラグFを1(真)の状態にしておいて
GETMAPDT を呼び出し指定された位置のマップデータをC$に代入します。
その後にこのC$が壁の文字なのかを判断し
もし壁の文字だった場合には RETURN 命令で戻ります。
最初にフラグ変数Fは1(真)になっているので
この場合指定した位置は壁だったという判定になります。

もし壁の文字で無かったらフラグ変数Fに0(偽)を代入して戻ります。


ここでたぶん理解のできている方は疑問に思うかもしれません。
指定された位置の文字が壁の場合にフラグ変数に1を代入して戻り、
そうでない場合にはフラグ変数に0を代入し戻れば良いんじゃないの?

答えは、それでも良いんです。


一概に言えませんが多くの数学問題の場合には、
正解は一つで間違いはいっぱいあるパターンが普通ですよね。
プログラムの場合には正解もいっぱいあります。

ただ、私がそうしなかった理由もあります。
もし上記のプログラムを記述するならば次のような感じになるでしょう。

(注意便宜上壁の文字を’壁’として扱っています)


@MAPCHKW
GOSUB @GETMAPDT
IF C$==”壁” THEN @MAPCHKW1
F=0:RETURN
@MAPCHKW1
F=1:RETURN


どうですか?
わかりますか?
このプチコンベーシックの場合IF文が貧弱なので
THENの後には1命令しか書けません。
フラグ変数を1にして戻るためには2命令必要なので
ジャンプしました。
おまけに無駄にラベルまで必要になります。

だからこれを回避しました。

もうひとつサンプルとして下記のプログラムも参考にしてください。


@MAPCHKW
F=0:GOSUB @GETMAPDT
IF C$==”壁” THEN F=1
RETURN