0

皆さん、また戻ってきてください。ダンジョンジェネレーターに取り組んでいて、実際にその進歩に驚いています。それでも、私はまだ散らかった部屋を時々持っています。配列をループして、すべての '1' (フロア タイル) が接続されているかどうかを確認し、接続されていない場合はそれらを接続する方法があるかどうか疑問に思っていました。

ありがとう!

編集: 配列は部屋と廊下でランダムに埋められます。コードは次のとおりです。

import java.util.Random;
public class Level
{
  Random random = new Random();
  int[][] A = new int[100][100];
  int minimum = 3;
  int maximum = 7;
  int xFeature = 0;
  int yFeature = 0;
private void feature()
  {
    int i = 0;
    while(i>=0)
    {
      xFeature = random.nextInt(100-1) + 1;
      yFeature = random.nextInt(100-1) + 1;
      if(A[xFeature][yFeature]==1)//||A[xFeature++][yFeature]==1||A[xFeature][yFeature--]==1||A[xFeature][yFeature++]==1)
        break;
      i++;
    }
  }


  private void room()
  {
    int safeFall = 0;
    int xCoPLUS = minimum + (int)(Math.random()*minimum);
    int yCoPLUS = minimum + (int)(Math.random()*minimum);
    if(yCoPLUS >= xCoPLUS)
    {
      for(int across = xFeature; across < xFeature+xCoPLUS+2; across++) 
      {
        for(int vert = yFeature; vert < yFeature+yCoPLUS+1; vert++)
        {
          if(A[vert][across] == 0)
            safeFall++;
          else
            break;
        }
      }
    }
    if(yCoPLUS < xCoPLUS)
    {
      for(int across = xFeature; across < xFeature+xCoPLUS+1; across++) 
      {
        for(int vert = yFeature; vert < yFeature+yCoPLUS+2; vert++)
        {
          if(A[vert][across] == 0)
            safeFall++;
          else
            break;
        }
      }
    }
    if((safeFall== (xCoPLUS+1) * (yCoPLUS+2)) || ((safeFall== (xCoPLUS+2) * (yCoPLUS+1))))
    {
      for(int across = xFeature; across < xFeature+xCoPLUS; across++) 
      {
        for(int vert = yFeature; vert < yFeature+yCoPLUS; vert++)
        {
          A[vert][across] = 1;
        }
      }
    }
  }
private void corridor()
  {

    int xCoONE = xFeature;
    int yCoONE = yFeature;
    int xCoTWO = random.nextInt(10)+10;
    int yCoTWO = random.nextInt(10)+10;
    while(xCoONE > xCoTWO)
    {
      A[xCoONE][yCoONE] = 1;
      xCoONE--;
    }
    while(xCoONE < xCoTWO)
    {
      A[xCoONE][yCoONE] = 1;
      xCoONE++;
    }
    while(yCoONE > yCoTWO)
    {
      A[xCoONE][yCoONE] = 1;
      yCoONE--;
    }
    while(yCoONE < yCoTWO)
    {
      A[xCoONE][yCoONE] = 1;
      yCoONE++;
    }
}
public Level()
  {
    firstroom();
    for(int i = 0; i < 500; i++)
    {
      int x = random.nextInt(50);
      feature();
      if(x > 1)
        room();
      else
        corridor();
    }
    troubleShoot();
  }

基本的に、このクラスのオブジェクトを作成すると、100x100 の配列が、乱数によって決定された廊下と部屋で満たされます。(まあ、それらのいくつか) しかし、私の部屋が重ならないフェイルセーフ (room() の safeFall) をどのように持っているかで、私は時々手の届かない 1 つのタイトルである部屋で立ち往生します。

例

4

1 に答える 1

0

記事「迷路生成アルゴリズム」では、迷路を生成するためのいくつかのアプローチについて説明しています。Javaの例へのリンクが含まれています。

于 2011-05-14T02:14:46.187 に答える