その4 迷路を作ってみよう!

マッピングについての理解が出来たら
次は、いよいよゲームの作成です




手始めに、迷路ゲームを実際に作ってみましょう



マッピングで迷路を作ってみて
その迷路の上をキャラクターを歩かせるプログラムを作ります




ゲーム作成は、考え方が重要です

ほぼ、前章の応用のみ
迷路ゲームは作成できます



この章からは
今までのプログラムを
実際のゲーム作成に活かしてみましょう




 迷路ゲームプログラミング 


前章で10×10のマップを使用しましたが
迷路にするには少し狭すぎます


なので、
今回は 横30×縦20 のマップを用意しましょう




マップ用の変数を用意します

整数を30個含んだ配列変数を
20個用意します

int  map [20][30];


配列変数の順序に気を付けてください
横並びのx座標マップ map[30]は
y座標個[20]必要となるため
上のような配列変数となります





変数の中身を指定します

int  map[20][30] = {
{1,1,1,1,1,1,1,1,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,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,2,1}, {1,0,1,1,1,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,0,1,0,1}, {1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,1,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,1,0,1,1,1,1,0,1,0,0,0,1},
{1,0,1,0,1,1,1,1,1,0,1,0,0,0,1,0,1,0,1,0,0,0,0,1,0,1,1,1,1,1},
{1,0,1,0,0,0,0,0,0,1,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1},
{1,0,1,1,1,0,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,1,0,1},
{1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1},
{1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,1,0,0,1,1,1,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,1},
{1,0,1,1,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,1,1,1,0,1,0,0,0,1},
{1,0,0,0,0,0,1,0,0,1,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1},
{1,1,0,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1},
{1,0,0,1,0,0,0,1,1,0,1,1,1,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1},
{1,0,1,1,0,1,0,1,0,0,0,0,1,0,1,0,1,1,0,1,1,0,1,0,1,0,1,1,0,1},
{1,0,0,0,0,1,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,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,1,1,1,1,1,1,1,1}
};


数字に弱い方は

何これ気が狂うんですけど?!

と思うかもしれませんが、
こういった数字の羅列
ゲームを作っているうちに慣れます




昔、マトリックスという映画がありましたが、
あの映画はプログラマーが作ったそうです


TV画面や、人や物の動きが
数字や計算式に見えることは
プログラム漬けになるとよくある事です


プログラムがある程度出来るようになってから
あの映画をもう一度見ると
視点が変わって面白いですよ
(「バックドア」などの下りはむしろ
プログラマーでないと理解が困難なのではないかと思います



とりあえず・・
コピペしましょう!



ちなみに
指定した数字は
    が 
  ゴールが 
歩ける場所が 
となっています





迷路マッピングのコツ


迷路を作る際は
ゴールから作っていく
というのがセオリーです


数学的な理由もありますが
説明は面倒なので割愛します



スタート地点を目指して
迷路を作っていきましょう



迷路は
ゴール」を起点にして
好きなように作りかえてみて下さい





キャラクターの座標用変数・汎用変数を用意します

int x=1,y=18;
(一番左下、予めxy座標を0から起算しています)

int i,j,k;





マップを表示させるループを作成します

前回は数字マップでしたが、
今回から少しゲーム寄りにしてみましょう

for (i= 0;i < 20;i++) {
  for (j= 0; j < 30; j++) {

    //マップ表示かキャラ表示の条件分岐
    if(y==i & &x==j) {
      std::cout < < " “;
    }
    else if(map[i][j]==0){
      std::cout < < "  ";//歩ける場所表示
    }
    else if(map[i][j]==2){
      std::cout < < "@ “;//ゴール表示
    }
    else{
      std::cout < < "# “;//壁表示
    }
    //ここまで

  }
  std::cout < < "¥n “;
}


””の中は全角で揃えましょう




実行結果


おお!!
ゲームっぽい!


仕組みは単純、
数字を記号や空白で表示しただけです


ゲームプログラミングって
本当に考え方だけなんです





キャラクターを歩かせるプログラムも
前章のものをそのまんま使えます


・・が、
今回は「ゴール」があるので
その処理も作ってみましょう





キャラクター歩行プログラムの改造


    if(k== 8) {
      if(map[y – 1][x] == 0 || map[y – 1][x] == 2) {
         y--; Beep(830, 800);}
      else{ Beep(440, 800); }
     }
    else if (k== 4) {
      if(map[y][x – 1] == 0 || map[y][x – 1] == 2) {
          x--; Beep(830, 800); }
      else{ Beep(440, 800); }
    }
    else if(k== 6) {
      if(map[y][x + 1] == 0 || map[y][x + 1] == 2) {
          x++; Beep(830, 800);}
      else{ Beep(440, 800); }
    }
    else if(k== 2) {
       if(map[y + 1][x] == 0 || map[y + 1][x] == 2) {
          y++; Beep(830, 800); }
       else{ Beep(440, 800); } }
    else{ break; }
  }
}


変更したのは移動後の数字判定の部分のみです

(空白)(ゴール)なら
キャラクターは移動します


空白が移動できるのは当然だけど・・
なんでゴールも空白と同じ扱いにするの?



ゴール処理を作った時に分かりますが、
この条件式内でゴール処理を作ると
プログラムが膨大なものになります

ゴール処理への前置きだと考えて下さい





ゴール処理

if (map[y][x] == 2) {
   std::cout < < "NICE CLEAR!! “;//クリア表示
   std::cin > > k;
   break;
}


さっきの条件式の下に
これを足すだけです


仮に、条件式内にゴール処理を作った場合
同様の処理が4回必要になります
(上下左右で4回)


しかも、かなり複雑な処理ルーチンが必要となります




移動後に
今いる場所の条件文を作る方が
手っ取り早いのです





今章は
マッピングプログラムを
少しいじるだけで迷路ゲームを作ることが出来ました


次章はもう少しいじることで
RPG風マップを作成し
町の人を作り
会話も出来るようにしてみましょう!