Как найти все связанные числа в массиве? - PullRequest
0 голосов
/ 14 мая 2011

Привет всем, еще раз. Работаю над генератором подземелий, и я на самом деле удивляюсь самому прогрессу. Тем не менее, время от времени у меня все еще есть комната. Мне было интересно, есть ли способ перебрать массив и посмотреть, все ли «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();
  }

Итак, в основном, когда я создаю объект этого класса, массив 100х100 заполнен коридорами и комнатами, определенными случайным числом. (ну, пару из них) Но из-за того, что моя комната не перекрывается отказоустойчиво (safeFall in room ()), я время от времени зацикливаюсь на комнате, в которой один заголовок недоступен.

Example

1 Ответ

0 голосов
/ 14 мая 2011

В статье Алгоритм генерации лабиринта обсуждаются несколько подходов к созданию лабиринта.Включает ссылки на примеры Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...