# 迷路ゲームを作る

【難易度】☆☆

## ゲームの魅力

> いまやTVゲームというのは、子供だけのおもちゃとしてでなく、大人でも遊べるものとして広く一般に普及していますね。私はTVゲームでほとんど遊んだことがないのですが、私の兄弟がゲーム好きでして、PlayStation1,2、Dreamcast、スーパーファミコン、ゲームボーイ、などなど、さまざまなゲーム機があります。

> そこで、今回は、ゲーム作りの基本を解説してみたいと思います。ゲームと言っても、いろいろありますが、今回は、迷宮をさ迷う迷路ゲームを作ってみましょう。これが、はまるんですよね。

## ゲーム作りは腕試し

> ゲームを作るのは、なかなか難しいことです。迷路ゲームに限って言っても、まず、マップ（迷宮のデータ）を読み込み、データ通りに画面に表示し、キャラクターの移動。キーボードからの入力。座標の計算。ゲームデータの保存などなど。よって、この解説では、基本的なひまわりの文法を一通りマスターしているものとして進めていきます。

## 迷宮の表示

> まずは、マップ（迷宮の構造）データを作成しましょう。
> 普通マップは、数値で表現します。

> 1,1,1,1,1,1,1,1,1,1 1,0,0,0,0,1,0,0,1,1 1,0,1,0,0,0,0,0,0,1 1,0,1,0,1,0,0,1,0,1 1,0,1,0,1,0,0,1,1,1 1,0,0,0,1,0,0,0,0,1 1,1,1,1,1,1,1,1,1,1

> 「1」が壁。「０」が通路を表しています。
> これが、まず、どんな感じになるのか、とりあえず、文字情報として表示してみましょう。

> 文字をそのまま表示する簡単なマップ表示
> `マップ=「1,1,1,1,1,1,1,1,1,1 1,0,0,0,0,1,0,0,1,1 1,0,1,0,0,0,0,0,0,1 1,0,1,0,1,0,0,1,0,1 1,0,1,0,1,0,0,1,1,1 1,0,0,0,1,0,0,0,0,1 1,1,1,1,1,1,1,1,1,1」。 文字サイズは、12 XXを、0から、9まで、繰り返す( YYを、0から、9まで、繰り返す( (XX*20,YY*20)へ、移動。 (マップ#XX#YY)を、表示。 ) )。`

> １と０が、そのまま表示されました。
> なんとなく、迷路っぽい感じはしますね。それでは、この１の部分を、「■」と、０の部分を、「　」と、表示させてみてはどうでしょうか。

> 数字を文字に置き換えて表示するマップ表示
> `マップ=「1,1,1,1,1,1,1,1,1,1 1,0,0,0,0,1,0,0,1,1 1,0,1,0,0,0,0,0,0,1 1,0,1,0,1,0,0,1,0,1 1,0,1,0,1,0,0,1,1,1 1,0,0,0,1,0,0,0,0,1 1,1,1,1,1,1,1,1,1,1」。 表示字#0=「　」 表示字#1=「■」 文字サイズは、12 XXを、0から、9まで、繰り返す( YYを、0から、9まで、繰り返す( (XX*20,YY*20)へ、移動。 (表示字#(マップ#XX#YY))を、表示。’＊１ ) )。`

> ＊１の部分は、配列が多重構造になっていてちょっと分かりづらいと思いますが、マップ#XX#YYの値が、０ならば、表示字＃０、即ち、「　」を表示します。もし、値が１ならば、表示字＃１、即ち。「■」を、表示するということです。

> ここまで出来たら、後は、文字で表示していた迷宮を、画像ファイルに置き換えてやれば、ぐっとそれらしくなります。ここでは、ひまわりの、"sample"フォルダの中の、"demo"フォルダにある、画像ファイルを使ってプログラムしていきます。

> 迷路マップを画像で表示
> `＊迷路データ設定 マップ=「1,1,1,1,1,1,1,1,1,1 1,0,0,0,0,1,0,0,1,1 1,0,1,0,0,0,0,0,0,1 1,0,1,0,1,0,0,1,0,1 1,0,1,0,1,0,0,1,1,1 1,0,0,0,1,0,0,0,0,1 1,1,1,1,1,1,1,1,1,1」。 ＊画像の読み込み 壁イメージを、イメージとして、作成。 その、画像は、ランタイムのパス&『sample\demo\map1.png』 その、可視は、オフ。'マップ表示用画像データなので。 マップ幅 = 25 XXを、0から、9まで、繰り返す( YYを、0から、9まで、繰り返す( もし、マップ#XX#YYが、1ならば( 壁イメージを,母艦の,(XX*マップ幅,YY*マップ幅)に, イメージコピー。 )。 ) )。`

> さて、上のマップ表示は、ただ、壁があるかないかだけでしたが、壁以外のいろいろなオブジェを並べてみましょう。そして、それをスクロールさせましょう。

> 迷路マップ表示（スクロール版）
> `{迷路の表示} 白色で、画面クリア。 ＊画像の読み込み イメージ0を、イメージとして、作成。'道 その、サイズは、(0,0,32,32) 塗り色は、白色。ペン色は、白色。 イメージ0の、(0,0)から,(31,31)へ,四角形描画。 その、可視は、オフ。'マップ表示用画像データなので。 イメージ1を、イメージとして、作成。'壁 その、画像は、ランタイムのパス&『sample\demo\kabe.png』 その、可視は、オフ。'マップ表示用画像データなので。 イメージ2を、イメージとして、作成。'宝 その、画像は、ランタイムのパス&『sample\demo\takara.png』 その、可視は、オフ。'マップ表示用画像データなので。 イメージ3を、イメージとして、作成。'噴水 その、画像は、ランタイムのパス&『sample\demo\water.png』 その、可視は、オフ。'マップ表示用画像データなので。 イメージ4を、イメージとして、作成。'旗 その、画像は、ランタイムのパス&『sample\demo\flag.png』 その、可視は、オフ。'マップ表示用画像データなので。 キャライメージを、イメージとして、作成。 その、画像は、ランタイムのパス&『sample\demo\char.png』 その、サイズは、(64,64,96,96); ＊変数設定 マップ幅 = 32 CX=1; CY=1; 'キャラクターの座標 母艦の、キー押した時を、キーイベントに、設定。 左キー = 37 上キー = 38 右キー = 39 下キー = 40 ランタイムのパス&『sample\demo\map2.txt』を、開く。MAP=それ。 ＊マップ描画 母艦の、テキストは、「母艦｛CX｝,｛CY｝|EVENT={MAP#CX#CY}」 XXを、0から、4まで、繰り返す( YYを、0から、4まで、繰り返す( PX=CX+XX-2; PY=CY+YY-2; もし、(PX>=0)かつ(PY>=0)ならば( イベント番号は、MAP#PX#PY。 )違えば(イベント番号=0)。 もし、イベント番号=「」ならば、イベント番号=0 X2=XX×マップ幅。Y2=YY×マップ幅。 X3=X2+マップ幅。Y3=Y2+マップ幅。 「イメージ｛イベント番号｝を,母艦の,(X2,Y2,X3,Y3)に,イメージコピー。」を, ひまわりする。 )。 )。 キャライメージを,水平反転。 待機。 ＊キーイベント 前のX = CX；前のY = CY； もし、押されたキーが、左キーなら、CX = CX - 1。 もし、押されたキーが、右キーなら、CX = CX + 1。 もし、押されたキーが、上キーなら、CY = CY - 1。 もし、押されたキーが、下キーなら、CY = CY + 1。 {マップのイベント取得} もし、(CX >= 0)かつ(CY >= 0)ならば、C = MAP#CX#CY。 違えば、C = 0。 もし、(C = 1)なら( CX = 前のX；CY = 前のY；ランタイムのパス&『tools\ki.wav』を、演奏。 )違えば( ランタイムのパス&『tools\pi.wav』を、演奏。 )。 マップ描画へ、飛ぶ。`

## イベントを処理する

> 上のプログラムにちょっと手を加えただけですが、以下のプログラムでは、イベントを判断する部分を加えました。また、一歩歩くと体力が減り、噴水で水を飲むと体力が回復するというゲーム要素も取り入れてみました。

> 迷路マップ表示イベント判断付き
> `{迷路の表示} 母艦の、タイトルは、「迷路ゲーム」 白色で、画面クリア。 ＊画像の読み込み イメージ0を、イメージとして、作成。'道 その、サイズは、(0,0,31,31) 塗り色は、白色。ペン色は、白色。 イメージ0の、(0,0)から,(31,31)へ,四角形描画。 その、可視は、オフ。'マップ表示用画像データなので。 イメージ1を、イメージとして、作成。'壁 その、画像は、ランタイムのパス&『sample\demo\kabe.png』 その、可視は、オフ。'マップ表示用画像データなので。 イメージ2を、イメージとして、作成。'宝 その、画像は、ランタイムのパス&『sample\demo\takara.png』 その、可視は、オフ。'マップ表示用画像データなので。 イメージ3を、イメージとして、作成。'噴水 その、画像は、ランタイムのパス&『sample\demo\water.png』 その、可視は、オフ。'マップ表示用画像データなので。 イメージ4を、イメージとして、作成。'旗 その、画像は、ランタイムのパス&『sample\demo\flag.png』 その、可視は、オフ。'マップ表示用画像データなので。 キャライメージを、イメージとして、作成。 その、画像は、ランタイムのパス&『sample\demo\char.png』 その、サイズは、(64,64,96,96); (10,300)へ、移動。 情報ラベルを、ラベルとして、作成。 その、テキストは、「迷路ゲーム」 ＊変数設定 マップ幅 = 32 CX=1; CY=1; 'キャラクターの座標 所持金=0 体力=500'一歩歩くと、体力が1減る 左キー = 37 上キー = 38 右キー = 39 下キー = 40 ランタイムのパス&『sample\demo\map2.txt』を、開く。MAP=それ。 ＊マップ描画 情報ラベルの、テキストは、「座標（｛CX｝,｛CY｝）。体力＝｛体力｝。所持金＝｛所持金｝。」 XXを、0から、4まで、繰り返す( YYを、0から、4まで、繰り返す( PX=CX+XX-2; PY=CY+YY-2; もし、(PX>=0)かつ(PY>=0)ならば( イベント番号は、MAP#PX#PY。 )違えば( イベント番号=0 )。 もし、イベント番号=「」ならば、イベント番号=0 X2=XX×マップ幅。Y2=YY×マップ幅。 X3=X2+マップ幅。Y3=Y2+マップ幅。 「イメージ｛イベント番号｝を,母艦の,(X2,Y2,X3,Y3)に,イメージコピー。」を, ひまわりする。 )。 )。 キャライメージを,水平反転。 母艦の、キー押した時を、キーイベントに、設定。 待機。 ＊キーイベント 母艦の、キー押した時を、未定義に、設定。 前のX = CX；前のY = CY； もし、押されたキーが、左キーなら、CX = CX - 1。 もし、押されたキーが、右キーなら、CX = CX + 1。 もし、押されたキーが、上キーなら、CY = CY - 1。 もし、押されたキーが、下キーなら、CY = CY + 1。 {マップのイベント取得} もし、(CX >= 0)かつ(CY >= 0)ならば、C = MAP#CX#CY。 違えば、C = 0。 もし、(C = 1)なら( CX = 前のX；CY = 前のY；母艦のパス&『tools\ki.wav』を、演奏。 )違えば( ランタイムのパス&『tools\pi.wav』を、演奏。 体力から、1を、引く。 もし、体力<=0ならば( 「体力が、０になりました。ゲームオーバー」と、言う。おわり。 )。 )。 もし、C=2ならば( 「宝をとりました。所持金＋１０」と、言う。 所持金に、10を、足す。 MAP#CX#CY=0 )。 もし、C=3ならば( 「水を飲みました。体力＋１００」と、言う。 体力に、100を、足す。 MAP#CX#CY=0 )。 もし、C=4ならば( 「ゲームクリアー！おめでとう！」と、言う。おわり。 )。 マップ描画へ、飛ぶ。`

> こんな調子で、敵が出るようにしたり、もっといろいろなイベントを増やしていけば、本格的な迷路ゲームが作れることと思います。

戻る