OneHourProcessing 六日目

OneHourProcessing 六日目

今日作ったのはこちら

作るのにかかった時間は「2時間20分」
うっせやろおい…

コード

昨日と同じ部分(MazeMasterクラス、Squareクラス)は省略

MazeMaker mazeMaker;
Agent agent;

boolean canEx = false;
boolean reStart = false;

void setup()
{
  size(800, 450);
  //mazeMaker = new MazeMaker(19, 15);
  mazeMaker = new MazeMaker(79, 45);
  //mazeMaker = new MazeMaker(191, 107);
}

void draw()
{
  background(0);
  mazeMaker.display();
  
  if(agent != null)
  {
    agent.secondSearch();
    agent.display();
  }

  if (canEx)
    return;

  for(int i = 0; i < 10 && !canEx; i++)
  canEx = mazeMaker.make();
}

void mouseReleased()
{
  if (mouseButton == LEFT)
  {
    if (reStart)
    {
      canEx = false;
      reStart = false;
    } else
    {
      agent = null;
      mazeMaker = null;
  //mazeMaker = new MazeMaker(19, 15);
      mazeMaker = new MazeMaker(79, 45);
      //mazeMaker = new MazeMaker(191, 107);
      canEx = true;
      reStart = true;
    }
  } else if (mouseButton == RIGHT)
  {
    if(canEx && !reStart)
    {
      agent = null;
      //agent = new Agent(mazeMaker.squares, 1, 1, 17, 13);
      agent = new Agent(mazeMaker.squares, 1, 1, 77, 43);
      agent.firstSearch();
    }
  }
}

Agentクラス

class Agent
{
  Square[][] field;
  ArrayList<SquareData> searchedSquare = new ArrayList<SquareData>();
  ArrayList<SquareData> operateSquares = new ArrayList<SquareData>();
  SquareData start;
  SquareData goal;

  Agent(Square[][] field, int startX, int startY, int goalX, int goalY)
  {
    this.field = field;
    start = new SquareData(field[startX][startY], null);
    goal  = new SquareData(field[ goalX][ goalY], null);
    start.data = "START";
    goal.data  = "GOAL";
  }

  void display()
  {
    for (int i = 0; i < searchedSquare.size(); i++)
      searchedSquare.get(i).display();

    start.display();
    goal.display();
  }

  void finish()
  {
    SquareData operateSquare = goal;
    while (operateSquare.previousSquare != start)
    {
      operateSquare.previousSquare.data = "ANSWER";
      operateSquare = operateSquare.previousSquare;
    }
    operateSquares.clear();
  }

  void firstSearch()
  {
    search(start);
  }

  void secondSearch()
  {
    int x = operateSquares.size();
    for (int i = 0; i < x; i++)
    {
      if (search(operateSquares.get(0)))
      {
        finish();
        return;
      }
    }
  }

  boolean search(SquareData operateSquare)
  {
    for (int x = -1; x <= 1; x += 2)
      if (checkCanExpansion(operateSquare, x, 0))
      {
        SquareData addData = new SquareData(field[operateSquare.x + x][operateSquare.y], operateSquare);
        if (addData.x == goal.x && addData.y == goal.y)
        {
          goal.previousSquare = operateSquare;
          return true;
        }
        searchedSquare.add(addData);
        operateSquares.add(addData);
      }
    for (int y = -1; y <= 1; y += 2)
      if (checkCanExpansion(operateSquare, 0, y))
      {
        SquareData addData = new SquareData(field[operateSquare.x][operateSquare.y + y], operateSquare);
        if (addData.x == goal.x && addData.y == goal.y)
        {
          goal.previousSquare = operateSquare;
          return true;
        }
        searchedSquare.add(addData);
        operateSquares.add(addData);
      }
      operateSquares.remove(operateSquare);
    return false;
  }

  boolean checkCanExpansion(SquareData operateSquare, int addX, int addY)
  {
    if (!operateSquare.data.equals("START"))
      if (operateSquare.previousSquare.x == operateSquare.x + addX && operateSquare.previousSquare.y == operateSquare.y + addY)
        return false;

    if (field[operateSquare.x + addX][operateSquare.y + addY].isWall)
      return false;

    return true;
  }
}

SquareDataクラス

class SquareData extends Square
{
  String data;
  SquareData previousSquare;

  SquareData(Square square, SquareData previousSquare)
  {
    super(square.x, square.y, square.size, square.isWall);
    if (square.isWall)
      data = "WALL";
    else
      data = "AISLE";
    this.previousSquare = previousSquare;
  }

  void display()
  {
    switch(data)
    {
    case "ANSWER":
      fill(0, 0, 255);
      break;
    case "WALL":
      fill(0, 0);
      break;
    case "AISLE":
      fill(150, 150, 0, 200);
      break;
    case "START":
      fill(0, 255, 0);
      break;
    case "GOAL":
      fill(200, 0, 0);
      break;
    default:
      fill(255, 255, 0);
      println(data);
    }

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