OneHourProcessing 五日目

OneHourProcessing 五日目

はい、今日作ったのはこちら。

1時間どころか四捨五入で2時間かかってます。
お前…話と違うやんけ…

コード

MazeMaker mazeMaker;
boolean canEx = false;
boolean reStart = false;

void setup()
{
  size(800, 450);
  mazeMaker = new MazeMaker(79, 45);
}

void draw()
{
  background(0);
  mazeMaker.display();
  if (canEx)
    return;
  canEx = mazeMaker.make();
}

void mouseReleased()
{
  if (reStart)
  {
    canEx = false;
    reStart = false;
  }
  else
  {
    mazeMaker = null;
    mazeMaker = new MazeMaker(79, 45);
    canEx = true;
    reStart = true;
  }
}

MazeMakerクラス

class MazeMaker
{
  Square[][] squares;
  ArrayList<Square> isAisle = new ArrayList<Square>();
  ArrayList<Square> stackAisle = new ArrayList<Square>();

  Square operateSquare;

  MazeMaker(int xSize, int ySize)
  {
    squares = new Square[xSize][ySize];
    for (int x = 0; x < squares.length; x++)
      for (int y = 0; y < squares[x].length; y++)
      {
        boolean isWall = false;

        if (x * y == 0 || x == squares.length - 1 || y == squares[0].length - 1)
          isWall = true;
        squares[x][y] = new Square(x, y, height / squares[x].length, isWall);
        if (x % 2 == 0 && y % 2 == 0 && !isWall)
          isAisle.add(squares[x][y]);
      }

    getRandomStart();
  }

  void display()
  {
    for (int x = 0; x < squares.length; x++)
      for (int y = 0; y < squares[x].length; y++)
        squares[x][y].display();
  }

  boolean make()
  {
    ArrayList<PVector> canExpansion = new ArrayList<PVector>();
    for (int x = -2; x <= 2; x += 4)
      if (checkCanExpansion(x, 0))
        canExpansion.add(new PVector(x, 0));
    for (int y = -2; y <= 2; y += 4)
      if (checkCanExpansion(0, y))
        canExpansion.add(new PVector(0, y));

    if (canExpansion.size() == 0)
    {
      if (stackAisle.size() == 0)
      {
        return getRandomStart();
      }
      stackAisle.remove(operateSquare);
      operateSquare = stackAisle.get(stackAisle.size() - 1);
      return false;
    }

    PVector expansion = canExpansion.get(int(random(canExpansion.size())));
    Square nextSquare = squares[operateSquare.x + (int)expansion.x][operateSquare.y + (int)expansion.y];

    squares[(operateSquare.x + nextSquare.x) / 2][(operateSquare.y + nextSquare.y) / 2].isWall = true;

    if (nextSquare.isWall)
      return getRandomStart();

    nextSquare.isWall= true;
    operateSquare = nextSquare;
    stackAisle.add(operateSquare);
    isAisle.remove(operateSquare);

    return false;
  }

  boolean checkCanExpansion(int x, int y)
  {
    for (int i = 0; i < stackAisle.size(); i++)
      if (stackAisle.get(i) == squares[operateSquare.x + x][operateSquare.y + y])
        return false;

    return true;
  }

  boolean getRandomStart()
  {
    int remainderAisle = isAisle.size();

    if (remainderAisle == 0)
      return true;

    operateSquare = isAisle.get(int(random(remainderAisle)));
    operateSquare.isWall = true;
    stackAisle.clear();
    stackAisle.add(operateSquare);
    isAisle.remove(operateSquare);
    return false;
  }
}

Squareクラス

class Square
{
  int x, y;
  float size;
  boolean isWall;

  Square(int x, int y, float size, boolean isWall)
  {
    this.x = x;
    this.y = y;
    this.size = size;
    this.isWall = isWall;
  }

  void display()
  {
    if (isWall)
      fill(255);
    else
      fill(0);

    rect(x * size, y * size, size, size);
  }

  void toWall()
  {
    isWall = true;
  }
}