スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ローグライクゲームを作ってみよう!  その1 ~ランダムダンジョン生成~

以前 お話したとおり、
とりあえず、ローグライクゲームが完成するまでの
アルゴリズムやら開発方法やらを記載していきます!


まず、記念すべき一回目。
今日はランダムダンジョン生成アルゴリズム(その1)を紹介します。

俗に穴掘り法と呼ばれるアルゴリズムです。

~やり方~
【1】まず、縦幅、横幅を決める
※ただし、奇数の幅とする。
【2】二次元配列を作った後、
  四隅を空白、それ以外は壁とする。

【3】穴を掘り始める起点を決める。
  ※ただし、起点の配列の添え字は0以上 幅未満の偶数とする。
【4】以下の再帰関数により、穴を開けていく。

void Dig(std::vector>& t_Vec, int x, int y)
{
int t_Flag[] = {0, 1, 2, 3};//右、左、上、下、どの方向に掘るかのフラグ
int t_Change[2] = {0};
//フラグを混ぜる。
for(int i = 0; i < 6; i++)
{
t_Change[0] = rand() % 4;
t_Change[1] = rand() % 4;

int t = t_Flag[t_Change[0]];
t_Flag[t_Change[0]] = t_Flag[t_Change[1]];
t_Flag[t_Change[1]] = t;
}

for(int i = 0; i < 4; i++)
{
switch(t_Flag[i]){
case 0: if(t_Vec[y][x + 2] == 1){
t_Vec[y][x] = t_Vec[y][x + 1] = t_Vec[y][x + 2] = 2;
Dig(t_Vec, x + 2, y);
}
break;
case 1: if(t_Vec[y][x - 2] == 1){
t_Vec[y][x] = t_Vec[y][x - 1] = t_Vec[y][x - 2] = 2;
Dig(t_Vec, x - 2, y);
}
break;
case 2: if(t_Vec[y - 2][x] == 1){
t_Vec[y - 2][x] = t_Vec[y - 1][x] = t_Vec[y][x] = 2;
Dig(t_Vec, x, y - 2);
}
break;
case 3: if(t_Vec[y + 2][x] == 1){
t_Vec[y + 2][x] = t_Vec[y + 1][x] = t_Vec[y][x] = 2;
Dig(t_Vec, x, y + 2);
}
break;
default:break;
}
}
}
※任意のX座標、Y座標、そしてマップ情報(配列)を引数として受け取り、
 その(X座標+2)が壁なら、 X座標、X座標+1、X座標+2を空白する ⇒ X座標+2でDig関数を呼ぶ
 その(X座標-2)が壁なら、 X座標、X座標-1、X座標-2を空白する ⇒ X座標-2でDig関数を呼ぶ
 その(Y座標+2)が壁なら、 Y座標、Y座標-1、Y座標-2を空白する ⇒ Y座標-2でDig関数を呼ぶ
 その(Y座標+2)が壁なら、 Y座標、Y座標+1、Y座標+2を空白する ⇒ Y座標+2でDig関数を呼ぶ
という関数。
上記の4つの処理を行う順番は、ランダムにしておく。



~解説~
【1】、【2】についてですが、
これは処理の簡略化のために定めているルールです。

このアルゴリズムは、2マスずつ掘っていくので、
マップの幅が偶数だったり、4隅(外周?)が壁だったりすると、
以下のような不具合が発生します。

【参考画像】
random1 

そして、【3】についてですが、
掘り始める起点は、 添え字で
必ず0以上 かつ マップの幅より小さい 偶数
である必要があります。

【追記】
今思ったんですが、正しくは"0より大きい"ですね。
0以上だと0も含まれる。


何でかというと、せっかく外周を空白(0とかの値)にしても、
掘り始める起点を(0,0)なんかにしてしまったら、上に彫った時点でアウトです。

範囲外を抑える為の外周の空白を活かすには、
最低でも起点を(2,2)にしないと駄目なのです。

というわけで、上記の3つのルールを守れば、
以下のような面倒な判定は要らなくなるのです!
------------------------------------
if( x + 2 < m_MapWidth){ //←要らない
  if(m_Map[y][x + 1] == 0){//空白なら
    //処理内容
  }
}

------------------------------------

【参考画像】
random2.jpg

【ソースコード】
RandomMap1.txt


そして次回予定。
エストポリス伝記Ⅱ というゲームに、
いにしえの洞窟 というランダムダンジョンがあるのですが、
次回は そのプログラムの解説を行います!(`・ω・´)
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。