OneHourProcessing 五日目
OneHourProcessing 五日目
はい、今日作ったのはこちら。
#OneHourProcessing #Proessing
— 霜暮黒夢@V高専生 (@V_hero_aid) August 8, 2020
五日目の作品です
壁伸ばし法を用いた迷路自動生成システムを作ってみました
作るのにかかった時間は「59分と2460秒」もしくは「100分」です
ユルシテ…コロサナイデ… pic.twitter.com/IijgJatrhZ
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; } }