迷路ゲームを作る

【難易度】☆☆

ゲームの魅力

 いまや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」が壁。「0」が通路を表しています。
これが、まず、どんな感じになるのか、とりあえず、文字情報として表示してみましょう。
文字をそのまま表示する簡単なマップ表示
マップ=「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と0が、そのまま表示されました。
 なんとなく、迷路っぽい感じはしますね。それでは、この1の部分を、「■」と、0の部分を、「 」と、表示させてみてはどうでしょうか。
数字を文字に置き換えて表示するマップ表示
マップ=「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))を、表示。’*1
   )
)
*1の部分は、配列が多重構造になっていてちょっと分かりづらいと思いますが、マップ#XX#YYの値が、0ならば、表示字#0、即ち、「 」を表示します。もし、値が1ならば、表示字#1、即ち。「■」を、表示するということです。
 ここまで出来たら、後は、文字で表示していた迷宮を、画像ファイルに置き換えてやれば、ぐっとそれらしくなります。ここでは、ひまわりの、"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ならば(
      「体力が、0になりました。ゲームオーバー」と、言う。おわり。
   )
)
もし、C=2ならば(
   「宝をとりました。所持金+10」と、言う。
   所持金に、10を、足す。
   MAP#CX#CY=0
)
もし、C=3ならば(
   「水を飲みました。体力+100」と、言う。
   体力に、100を、足す。
   MAP#CX#CY=0
)
もし、C=4ならば(
   「ゲームクリアー!おめでとう!」と、言う。おわり。
)

マップ描画へ、飛ぶ。

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

戻る