忍者ブログ

さしみのブログ

自作ゲームの製作過程を書き込んだりゲームを楽しんだりするブログです。

RPGあれこれ

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

RPGあれこれ

なんか最近自動生成なるものに興味が湧いてます。
特に終わる所まで終わったら、やることが終わってしまうRPGなんかはダンジョンなどを自動生成
したほうが楽しいと思います。
毎回変わるダンジョンの作り方がわからなくてなかなか作ってなかったんですけど、
最大の理由はストーリーが思いつかないから
今回いい感じに出来上がったので、画像をうpしておきます。
 

ところで、どうやってスタートからゴールまでちゃんと繋がるダンジョン(迷路)を作っているのかといいますと、

①ランダムで迷路を作る。
スタートからゴールまで繋がっているか確認する。
③ダンジョン画面へ移る

先ほど文字を赤色で示したように、スタートかゴールで確認できるかがとても重要になっていきます。
私の場合は、
二次配列変数スタートもしくはゴールにとても大きい数字(10000など)を代入して、
上下右左にまずマップにおいて通れない壁かどうか確認します。
もし通れるばあいはさらにその位置の変数に何も代入されてないか確認します。
代入されていない場合は、元の位置の変数-1の値を代入します。
ゴールもしくはスタートに変数が0以上代入されている場合はゴールに繋がっていると判断できます。
またゴールもしくはスタートに代入された数字でダンジョン(迷路)の難易度も取得できていいと思います。

最後にjavaのコードを貼っておきます。

 public boolean newMap(int dificulty){
  boolean out = true;
  for( int  y = 0; y < 100; y ++){
   for( int  x = 0; x < 100; x ++){
    map[x][y] = 0;
    if ( x%2 == 0 && y%2 == 0 ) map[x][y] = 1;
    if ( x == 0 || y == 0 || x == 99 || y == 99 ) map[x][y] = 1;
    if ( x%2 == 1 && y%2 == 0 ) if ( (int)(Math.random()*101) <= dificulty ) map[x][y] = 1;
    if ( x%2 == 0 && y%2 == 1 ) if ( (int)(Math.random()*101) <= dificulty ) map[x][y] = 1;
   }
  }
  int true_map[][] = new int[100][100];
  for( int  y = 0; y < 100; y ++){
   for( int  x = 0; x < 100; x ++){
    true_map[x][y] = 0;
   }
  }
  true_map[98][98] = 100000;
  for( int ok = 0; ok == 0; ok = ok){
   int temp = 0;
   for( int  y = 0; y < 100; y ++){
    for( int  x = 0; x < 100; x ++){
     if ( true_map[x][y] > 0){
      if ( x+1 < 100 ) if ( map[x+1][y] == 0 && true_map[x+1][y] == 0 ){
       true_map[x+1][y] = true_map[x][y]-1;
       temp ++;
      }
      if ( x-1 >=  0 ) if ( map[x-1][y] == 0 && true_map[x-1][y] == 0 ){
       true_map[x-1][y] = true_map[x][y]-1;
       temp ++;
      }
      if ( y+1 < 100 ) if ( map[x][y+1] == 0 && true_map[x][y+1] == 0 ){
       true_map[x][y+1] = true_map[x][y]-1;
       temp ++;
      }
      if ( y-1 >= 0 ) if ( map[x][y-1] == 0 && true_map[x][y-1] == 0 ){
       true_map[x][y-1] = true_map[x][y]-1;
       temp ++;
      }
     }
    }
   }
   System.out.println( temp);
   if ( temp == 0 ) ok = 1;
  }
  for( int  y = 0; y < 100; y ++){
   for( int  x = 0; x < 100; x ++){
    if ( true_map[x][y] == 0 ){
     map[x][y] = 1;
    }
   }
  }
  int box_max = (int)(Math.random()*45)+5;
  for( int i = 0 ; i < box_max; i ++ ){
   int rx = (int)(Math.random()*49);
   int ry = (int)(Math.random()*49);
   if ( map[1+rx*2][1+ry*2] == 0 ) map[1+rx*2][1+ry*2] = 2;
  }
  System.out.println(true_map[1][1]);
  if ( true_map[1][1] > 0 ) out = true;
  if ( true_map[1][1] == 0 ) out = false;
  
  zx = 1;
  zy = 1;
  map_x = 0;
  map_y = 0;
  
  return out;
 }
ちなみに int difficultyは迷路の濃さを示しています。大体48~52くらいがいいと思います。
ちなみに濃すぎると、なかなか生成完了しません。(爆

素材提供元
http://atsites.jp/warehouse/takarajima/
http://www.geocities.co.jp/Milano-Cat/3319/

拍手[0回]

PR

コメント

プロフィール

HN:
さしみ
性別:
非公開
趣味:
プログラミング/工作

Twitter

P R