りょうのゲーム塾 -39ページ目

りょうのゲーム塾

再開、準備中。

■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を元に戻して戻ります。
$思い出の欠片

洋ランの種類にシンビジュームというのがあります。
実は自分にはあまり馴染みのない種類だったんです。

ランと言えば華やかに咲く洋ランをイメージする方も多いと思います。

そうですね、胡蝶蘭などはその中の代表的なものではないでしょうか?
私も宮崎に行った時に瓶詰めの胡蝶蘭の苗を購入し室内で育てた記憶がありますが、
冬場の寒さに枯れてしまうものがほとんどでした。

だから胡蝶蘭やその他の洋ランは育てるのをやめました。

そこで寒さに強い和ランを育てる事にしました。

今でも風ランという種類の和ランを育てています。
それも結構な数に増えてきました。

洋ランは寒さに弱い。。。そういう認識だったのですが。。。
このシンビジュームは寒い時期も室外で育てています。

そしてなんと3年前から花も咲きだしました。

あ、本当は前に住んでいた方が残していった鉢で
シンビジュームに縁がなかった自分は知らないまま育てていたんです。

調べもしませんでした。

花は全然咲かないけど、枯れる事もなかったんで他の花と一緒に育ててました。

初めて立派な花芽が出てきた時に、明らかに普通じゃなかったんでびっくり。
花が咲いたらまたびっくり。

明らかにランの花。。。それからもずっと屋外で育てています。

流石に雪が積もった時は花芽が枯れてしまうこともありますが、
それ以外は立派に咲いてくれます。
■GETSPACE
このGETSPACEサブルーチンは現在のステージマップにおいて壁でない移動できるスペースを見つけます。
今回のプログラムの場合はプレイヤやエネミー(敵)をマップ上に配置するため使用しています。
このサブルーチンを呼び出したあとに変数XとYに座標が代入されていますが、座標はランダムに抽出されます。

それでは順を追って説明します。


@GETSPACE
X=RND(23):Y=RND(23)
GOSUB @GETCHKW
IF F GOTO @GETSPACE
RETURN


まずランダムにXおよびY座標を決めます。
ステージのマップの大きさは23×23です。
座標でいうならX座標およびY座標共に、0から22の間です。
RND関数は0から引数に指定された整数値未満の値をランダムに返します。

ランダムに抽出された座標が壁であるか判定するためにGETCHKWサブルーチンを呼び出します。
このサブルーチンを呼び出した後に結果がフラグ変数Fに代入されるので、その変数Fを判断します。

IF文は条件式を記述しますが、その条件が真なのか偽なのかを判定します。
条件式がない場合にはその値が0のとき偽で0でない時真となります。

変数Fにはフラブ値が代入されているので、真の場合には1、そうでない場合には0が代入されています。
なのでIF文で判断する場合

IF F THEN ・・・

となります。
今回はもし真の場合には壁なのでもう一度ラベルGETSPACEに戻り、再度ランダムに座標を作り繰り返します。
もし偽の場合にはスペースが見つかったわけですからサブルーチンから戻ります。

以上でマップ上で壁でないスペースを見つけ、その座標をランダムに求めることができました。