Skip to content

Commit

Permalink
Fixed the whole algorithm very good now is very strong very mazes
Browse files Browse the repository at this point in the history
  • Loading branch information
devedse committed Oct 5, 2016
1 parent 12ab14e commit 41d3c5b
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 90 deletions.
153 changes: 75 additions & 78 deletions src/DeveMazeGenerator/Generators/AlgorithmDivisionDynamic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ public InnerMap GenerateMapPart(int xStart, int yStart, int widthPart, int heigh
{
var map = new BitArreintjeFastInnerMap(widthPart, heightPart);

//If the maze is out of screen
var theRightEdge = Math.Max(((xStart + widthPart) - width), 0);
var theBottomEdge = Math.Max(((yStart + heightPart) - height), 0);

for (int y = 0; y < heightPart; y++)
{
for (int x = 0; x < widthPart; x++)
Expand All @@ -31,48 +35,48 @@ public InnerMap GenerateMapPart(int xStart, int yStart, int widthPart, int heigh
//Add walls
if (xStart == 0)
{
for (int y = 0; y < heightPart; y++)
for (int y = 0; y < heightPart - theBottomEdge; y++)
{
map[0, y] = false;
}
}

if (yStart == 0)
{
for (int x = 0; x < widthPart; x++)
for (int x = 0; x < widthPart - theRightEdge; x++)
{
map[x, 0] = false;
}
}

if (xStart + widthPart == width)
if (xStart + widthPart >= width)
{
for (int y = 0; y < heightPart; y++)
for (int y = 0; y < heightPart - theBottomEdge; y++)
{
map[widthPart - 1, y] = false;
map[widthPart - 1 - theRightEdge, y] = false;
}

if (NumberIsEven(width))
{
for (int y = 0; y < heightPart; y++)
for (int y = 0; y < heightPart - theBottomEdge; y++)
{
map[widthPart - 2, y] = false;
map[widthPart - 2 - theRightEdge, y] = false;
}
}
}

if (yStart + heightPart == height)
if (yStart + heightPart >= height)
{
for (int x = 0; x < widthPart; x++)
for (int x = 0; x < widthPart - theRightEdge; x++)
{
map[x, heightPart - 1] = false;
map[x, heightPart - 1 - theBottomEdge] = false;
}

if (NumberIsEven(height))
{
for (int x = 0; x < widthPart; x++)
for (int x = 0; x < widthPart - theRightEdge; x++)
{
map[x, heightPart - 2] = false;
map[x, heightPart - 2 - theBottomEdge] = false;
}
}
}
Expand All @@ -90,94 +94,102 @@ public InnerMap GenerateMapPart(int xStart, int yStart, int widthPart, int heigh
{
var curRect = rectangles.Pop();

if (curRect.IntersectsWith(visibleRectangle))
//Console.WriteLine($"X: {curRect.X} Y: {curRect.Y} Width: {curRect.Width} Height: {curRect.Height}");

if (curRect.Width > 3 && curRect.Height > 3)
{
//DrawRectToMap(curRect, map);
var random = new Random(curRect.Seed);

Boolean horizontalSplit = true;
//form.drawRectangle(curRect.X, curRect.Y, curRect.Width, curRect.Height, Brushes.Pink);

if (curRect.Width > 3 && curRect.Height > 3)
if (curRect.Width > curRect.Height)
{
var random = new Random(curRect.Seed);

Boolean horizontalSplit = true;
//form.drawRectangle(curRect.X, curRect.Y, curRect.Width, curRect.Height, Brushes.Pink);

if (curRect.Width > curRect.Height)
horizontalSplit = false;
}
else if (curRect.Width < curRect.Height)
{
horizontalSplit = true;
}
else
{
if (random.Next(2) == 0)
{
horizontalSplit = false;
}
else if (curRect.Width < curRect.Height)
{
horizontalSplit = true;
}
else
{
if (random.Next(2) == 0)
{
horizontalSplit = false;
}
}
}

if (horizontalSplit)
{
int splitnumber = 2 + random.Next((curRect.Height - 2) / 2) * 2;
int opening = 1 + random.Next((curRect.Width) / 2) * 2 + curRect.X;
if (horizontalSplit)
{
int splitnumber = 2 + random.Next((curRect.Height - 2) / 2) * 2;
int opening = 1 + random.Next((curRect.Width) / 2) * 2 + curRect.X;

Rectangle rect1 = new Rectangle(curRect.X, curRect.Y, curRect.Width, splitnumber + 1, random.Next());
Rectangle rect2 = new Rectangle(curRect.X, curRect.Y + splitnumber, curRect.Width, curRect.Height - splitnumber, random.Next());
Rectangle rect1 = new Rectangle(curRect.X, curRect.Y, curRect.Width, splitnumber + 1, random.Next());
Rectangle rect2 = new Rectangle(curRect.X, curRect.Y + splitnumber, curRect.Width, curRect.Height - splitnumber, random.Next());


int xStartDraw = Math.Max(0, curRect.X - xStart);
int xEndDraw = Math.Min(widthPart, curRect.X - xStart + curRect.Width);
int xStartDraw = Math.Max(0, curRect.X - xStart);
int xEndDraw = Math.Min(widthPart, curRect.X - xStart + curRect.Width);

int yPos = curRect.Y + splitnumber - yStart;
int yPos = curRect.Y + splitnumber - yStart;

if (yPos >= 0 && yPos < heightPart - 1)
if (yPos >= 0 && yPos < heightPart - 1)
{
for (int i = xStartDraw; i < xEndDraw; i++)
{
for (int i = xStartDraw; i < xEndDraw; i++)
if (i != opening - xStart)
{
if (i != opening - xStart)
{
map[i, yPos] = false;
}
map[i, yPos] = false;
}
}
}


if (visibleRectangle.IntersectsWith(rect1))
{
rectangles.Push(rect1);
rectangles.Push(rect2);
}
else
if (visibleRectangle.IntersectsWith(rect2))
{
int splitnumber = 2 + random.Next((curRect.Width - 2) / 2) * 2;
int opening = 1 + random.Next((curRect.Height) / 2) * 2 + curRect.Y;
rectangles.Push(rect2);
}
}
else
{
int splitnumber = 2 + random.Next((curRect.Width - 2) / 2) * 2;
int opening = 1 + random.Next((curRect.Height) / 2) * 2 + curRect.Y;

Rectangle rect1 = new Rectangle(curRect.X, curRect.Y, splitnumber + 1, curRect.Height, random.Next());
Rectangle rect2 = new Rectangle(curRect.X + splitnumber, curRect.Y, curRect.Width - splitnumber, curRect.Height, random.Next());
Rectangle rect1 = new Rectangle(curRect.X, curRect.Y, splitnumber + 1, curRect.Height, random.Next());
Rectangle rect2 = new Rectangle(curRect.X + splitnumber, curRect.Y, curRect.Width - splitnumber, curRect.Height, random.Next());


var yStartDraw = Math.Max(0, curRect.Y - yStart);
int yEndDraw = Math.Min(heightPart, curRect.Y - yStart + curRect.Height);
var yStartDraw = Math.Max(0, curRect.Y - yStart);
int yEndDraw = Math.Min(heightPart, curRect.Y - yStart + curRect.Height);

int xPos = curRect.X + splitnumber - xStart;
int xPos = curRect.X + splitnumber - xStart;

if (xPos >= 0 && xPos < widthPart - 1)
if (xPos >= 0 && xPos < widthPart - 1)
{
for (int i = yStartDraw; i < yEndDraw; i++)
{
for (int i = yStartDraw; i < yEndDraw; i++)
if (i != opening - yStart)
{
if (i != opening - yStart)
{
map[xPos, i] = false;
}
map[xPos, i] = false;
}
}
}


if (visibleRectangle.IntersectsWith(rect1))
{
rectangles.Push(rect1);
}
if (visibleRectangle.IntersectsWith(rect2))
{
rectangles.Push(rect2);
}
}


}
}

Expand All @@ -197,20 +209,5 @@ private int MakeUneven(int number)
}
return number;
}

private void DrawRectToMap(Rectangle curRect, BitArreintjeFastInnerMap map)
{
for (int x = curRect.X; x < curRect.Width; x++)
{
map[x, curRect.Y] = false;
map[x, curRect.Y + curRect.Height - 1] = false;
}

for (int y = curRect.Y + 1; y < curRect.Height - 1; y++)
{
map[curRect.X, y] = false;
map[curRect.X + curRect.Width - 1, y] = false;
}
}
}
}
3 changes: 2 additions & 1 deletion src/DeveMazeGenerator/project.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
{
{
"version": "1.0.0-*",

"dependencies": {
"System.Collections": "4.0.11",
"System.ComponentModel.Primitives": "4.1.0",
"System.Console": "4.0.0-beta-23516",
"System.Runtime.Extensions": "4.1.0"
},

Expand Down
45 changes: 34 additions & 11 deletions src/DeveMazeGeneratorConsole/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,47 @@ public static void Main(string[] args)

public static void Test2()
{
int totSize = 32;
int totSize = 1024;

Console.WriteLine($"Tot size: {totSize}");

var alg = new AlgorithmDivisionDynamic(totSize, totSize, 1337);

var partTot = alg.GenerateMapPart(0, 0, totSize, totSize);
SaveMaze("parttot.png", partTot);
//var partTot = alg.GenerateMapPart(0, 0, totSize, totSize);
//SaveMaze("parttot.png", partTot);

int b = 256;

var dir = Directory.CreateDirectory("Images");
var w = new Stopwatch();

var dinges = totSize / b;
if (totSize % b != 0)
{
dinges += 1;
}
for (int y = 0; y < dinges; y++)
{
for (int x = 0; x < dinges; x++)
{
w.Restart();
var part = alg.GenerateMapPart(x * b, y * b, b, b);
w.Stop();
SaveMaze(Path.Combine("Images", $"{x}_{y}.png"), part);
Console.WriteLine($"{x}_{y}.png : {w.Elapsed}");
}
}

int b = totSize / 2;

var part1 = alg.GenerateMapPart(0, 0, b, b);
var part2 = alg.GenerateMapPart(b, 0, b, b);
var part3 = alg.GenerateMapPart(0, b, b, b);
var part4 = alg.GenerateMapPart(b, b, b, b);
var part1 = alg.GenerateMapPart(768, 0, b, b);
//var part2 = alg.GenerateMapPart(b, 0, b, b);
//var part3 = alg.GenerateMapPart(0, b, b, b);
//var part4 = alg.GenerateMapPart(b, b, b, b);

SaveMaze("part1.png", part1);
SaveMaze("part2.png", part2);
SaveMaze("part3.png", part3);
SaveMaze("part4.png", part4);
//SaveMaze("part2.png", part2);
//SaveMaze("part3.png", part3);
//SaveMaze("part4.png", part4);
}

public static void Test1()
Expand Down

0 comments on commit 41d3c5b

Please sign in to comment.