package nars.lab.grid2d.map; import nars.lab.grid2d.main.Cell.Material; import nars.lab.grid2d.main.Hauto; import nars.lab.grid2d.main.Hauto.SetMaterial; import static nars.lab.grid2d.main.Hauto.irand; /** * * @author Tyrant */ public class Maze { public static void buildMaze(Hauto m, int x1, int y1, int x2, int y2) { m.forEach(x1,y1,x2,y2, new SetMaterial(Material.StoneWall)); buildInnerMaze(m,x1+1,y1+1,x2-1,y2-1); m.copyReadToWrite(); } public static void buildInnerMaze(Hauto m, int x1, int y1, int x2, int y2) { m.forEach(x1,y1,x2,y2, new SetMaterial(Material.StoneWall)); int w=x2-x1+1; int rw=(w+1)/2; int h=y2-y1+1; int rh=(h+1)/2; int sx=x1+2*irand(rw); int sy=y1+2*irand(rh); m.at(sx, sy, new SetMaterial(Material.DirtFloor)); int finishedCount=0; for (int i=1; (i<(rw*rh*1000))&&(finishedCount<(rw*rh)); i++) { int x=x1+2*irand(rw); int y=y1+2*irand(rh); if (m.at(x,y).material!=Material.StoneWall) continue; int dx=(irand(2)==1)?(irand(2)*2-1):0; int dy=(dx==0) ?(irand(2)*2-1):0; int lx=x+dx*2; int ly=y+dy*2; if ((lx>=x1)&&(lx<=x2)&&(ly>=y1)&&(ly<=y2)) { if (m.at(lx,ly).material!=Material.StoneWall) { m.at(x, y, new SetMaterial(Material.DirtFloor)); m.at(x+dx, y+dy, new SetMaterial(Material.DirtFloor)); m.readCells[x][y].setHeight( (int)(Math.random() * 24 + 1)); m.writeCells[x][y].setHeight( (int)(Math.random() * 24 + 1)); finishedCount++; } } } } }