OneHourProcessing 六日目
OneHourProcessing 六日目
今日作ったのはこちら
#OneHourProcessing #Proessing
— 霜暮黒夢@V高専生 (@V_hero_aid) August 9, 2020
六日目の作品です
昨日作った迷路を今日解かせる
幅優先探索型…のはずです
かかった時間…?えと…え…あ…はい… pic.twitter.com/kvrqQ3W8oD
作るのにかかった時間は「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); } }