Skip to content

Commit 5d637e9

Browse files
committed
四种迷宫生成算法
1 parent 8466ef7 commit 5d637e9

File tree

6 files changed

+64
-58
lines changed

6 files changed

+64
-58
lines changed

Assets/Scripts/02-mazeGeneration/Algorithm/DFS.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ public class DFS:GenerateMazeAlgoritnm
1515
private static int count = 0;
1616

1717
//记录上一个区域
18-
private static Stack<WallArea> _queue = new Stack<WallArea>();
18+
private static Stack<WallArea> _stack= new Stack<WallArea>();
1919

2020
public static MazeWall Generate(MazeWall wall)
2121
{
2222
mazeWall = wall;
2323
count = 0;
24-
_queue.Clear();
24+
_stack.Clear();
2525

2626
//封闭全部墙壁
2727
mazeWall.ClosedAllWall();
@@ -31,16 +31,16 @@ public static MazeWall Generate(MazeWall wall)
3131
//随机选择一个开始区域
3232
WallArea fistArea = RandChooseBeginArea();
3333
++count;
34-
_queue.Push(fistArea);
34+
_stack.Push(fistArea);
3535

3636
WallArea? curArea = fistArea;
3737
while (count < maxCount)
3838
{
3939
if (null == curArea)
4040
{
4141
//退回上一个区域
42-
_queue.Pop();
43-
curArea = _queue.Peek();
42+
_stack.Pop();
43+
curArea = _stack.Peek();
4444
continue;
4545
}
4646
curArea = CheckNearby((WallArea)curArea);
@@ -56,7 +56,7 @@ public static MazeWall Generate(MazeWall wall)
5656

5757

5858
/// <summary>
59-
/// 检测附近区域是否访问过
59+
/// 检测附近区域是否访问过,并随机选择其中一个附件区域打通
6060
/// </summary>
6161
private static WallArea? CheckNearby(WallArea area)
6262
{
@@ -69,7 +69,7 @@ public static MazeWall Generate(MazeWall wall)
6969
++count;
7070
WallArea newarea = nerabyAreas[Random.Range(0, nerabyAreas.Count - 1)];
7171
mazeWall.OpenArea(area, newarea);
72-
_queue.Push(newarea);
72+
_stack.Push(newarea);
7373

7474
return newarea;
7575
}

Assets/Scripts/02-mazeGeneration/Algorithm/GenerateMazeAlgoritnm.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ protected static WallArea RandChooseBeginArea()
1919

2020
return new WallArea(RandomRowIndex, RandomColIndex);
2121
}
22-
2322
protected static List<WallArea> GetNearbyArea(WallArea area)
2423
{
2524
//获得未访问的邻接区域
2625
List<WallArea> nerabyAreas = new List<WallArea>();
26+
2727
if (area.rowLength > 0)
2828
if (!mazeWall[area.rowLength - 1, area.colLength])
2929
nerabyAreas.Add(new WallArea(area.rowLength - 1, area.colLength));

Assets/Scripts/02-mazeGeneration/Algorithm/Prim.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class Prim:GenerateMazeAlgoritnm
1212

1313
public static MazeWall Generate(MazeWall wall)
1414
{
15+
mazeWall = wall;
1516
walls.Clear();
1617

1718
//封闭全部墙壁
@@ -27,21 +28,18 @@ public static MazeWall Generate(MazeWall wall)
2728
var _wall = walls[randomIndex];
2829
if(checkWall(_wall))
2930
{
30-
31-
if(checkArea(_wall.Key))
31+
mazeWall.OpenArea(_wall.Key, _wall.Value);
32+
if (checkArea(_wall.Key))
3233
{
3334
AddNerabyWall(_wall.Key);
3435
}
3536
if (checkArea(_wall.Key))
3637
{
3738
AddNerabyWall(_wall.Value);
3839
}
39-
mazeWall.OpenArea(_wall.Key, _wall.Value);
40-
}
41-
else
42-
{
43-
walls.RemoveAt(randomIndex);
40+
4441
}
42+
walls.Remove(_wall);
4543
}
4644

4745
//随机选择迷宫起点终点
@@ -59,9 +57,13 @@ private static void AddNerabyWall(WallArea area)
5957
{
6058
List<WallArea> areas = GetNearbyArea(area);
6159
for (int i = 0; i < areas.Count; ++i)
62-
walls.Add(new KeyValuePair<WallArea, WallArea>(
63-
area, areas[i]
64-
));
60+
walls.Add
61+
(
62+
new KeyValuePair<WallArea, WallArea>
63+
(
64+
area, areas[i]
65+
)
66+
);
6567
}
6668

6769

Assets/Scripts/02-mazeGeneration/Algorithm/RecursiveSegmentation.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
using System.Collections.Generic;
2-
using System.Linq;
3-
using System.Text;
42
using UnityEngine;
53

64
namespace LinHoweMazeGenerate
@@ -11,7 +9,7 @@ namespace LinHoweMazeGenerate
119
public class RecursiveSegmentation
1210
{
1311
private static MazeWall mazeWall;
14-
12+
1513
public static MazeWall Generate(MazeWall wall)
1614
{
1715
mazeWall = wall;
@@ -70,8 +68,9 @@ private static void RecursiveDivision(
7068
int randomRow = UnityEngine.Random.Range(rowstart + 1, rowend);
7169
int randomCol = UnityEngine.Random.Range(colstart + 1, colend);
7270

71+
7372
//随机找到四个分界线上四个洞
74-
List< KeyValuePair<WallArea,WallArea>> FourHoles = new List<KeyValuePair<WallArea, WallArea>>();
73+
List<KeyValuePair<WallArea,WallArea>> FourHoles = new List<KeyValuePair<WallArea, WallArea>>();
7574
int index = Random.Range(colstart, randomCol);
7675
FourHoles.Add(new KeyValuePair<WallArea, WallArea>(
7776
new WallArea(randomRow - 1,index),

Assets/Scripts/02-mazeGeneration/DataStructure/MazeWall.cs

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -119,51 +119,56 @@ public void OpenArea(WallArea area1, WallArea area2)
119119
new distroyWall(wall.col, area1.colLength, Mathf.Max(area1.rowLength, area2.rowLength)));
120120
}
121121
}
122-
122+
123123
/// <summary>
124124
/// 打通起点终点的边界墙,起点终点随机
125125
/// </summary>
126126
public void RandomOpenStartAndPoint()
127127
{
128-
if(Random.Range(0,2)>1)
129-
if(Random.Range(0,2)<1)
128+
var arr = new[]
129+
{
130+
new
130131
{
131-
int index = Random.Range(0, RowLength - 1);
132-
while(!row[index,0])
133-
index = Random.Range(0, RowLength - 1);
134-
row[index, 0] = false;
135-
NotificationCenter<distroyWall>.Get().DispatchEvent("distroyWall",
136-
new distroyWall(wall.row,index,0));
137-
138-
}
139-
else
132+
indexMax = RowLength - 1,
133+
rightIndex = 0,
134+
wall = wall.row,
135+
wallarr = this.row,
136+
},
137+
new
140138
{
141-
int index = Random.Range(0, RowLength - 1);
142-
while (!row[index, RowLength])
143-
index = Random.Range(0, RowLength - 1);
144-
row[index, ColLength] = false;
145-
NotificationCenter<distroyWall>.Get().DispatchEvent("distroyWall",
146-
new distroyWall(wall.row, index, ColLength));
147-
}
148-
else
149-
if (Random.Range(0, 2) < 1)
139+
indexMax = RowLength - 1,
140+
rightIndex = ColLength,
141+
wall = wall.row,
142+
wallarr = this.row,
143+
},
144+
new
150145
{
151-
int index = Random.Range(0, ColLength - 1);
152-
while (!row[index, 0])
153-
index = Random.Range(0, ColLength - 1);
154-
col[index, 0] = false;
155-
NotificationCenter<distroyWall>.Get().DispatchEvent("distroyWall",
156-
new distroyWall(wall.col, index, 0));
157-
}
158-
else
146+
indexMax = ColLength - 1,
147+
rightIndex = 0,
148+
wall = wall.col,
149+
wallarr = this.col,
150+
},
151+
new
159152
{
160-
int index = Random.Range(0, ColLength - 1);
161-
while (!row[index, RowLength])
162-
index = Random.Range(0, ColLength - 1);
163-
col[index, RowLength] = false;
164-
NotificationCenter<distroyWall>.Get().DispatchEvent("distroyWall",
165-
new distroyWall(wall.col, index, RowLength));
153+
indexMax = ColLength - 1,
154+
rightIndex = RowLength,
155+
wall = wall.col,
156+
wallarr = this.col,
157+
},
158+
};
159+
160+
int r = Random.Range(0, 3);
161+
var choose = arr[r];
162+
int index = Random.Range(0, choose.indexMax);
163+
while (!choose.wallarr[index, choose.rightIndex])
164+
{
165+
index = Random.Range(0, choose.indexMax);
166166
}
167+
168+
choose.wallarr[index, choose.rightIndex] = false;
169+
NotificationCenter<distroyWall>.Get().DispatchEvent("distroyWall",
170+
new distroyWall(choose.wall, index, choose.rightIndex));
171+
167172

168173
}
169174
}

Assets/Scripts/Common/DataStructure/UnionFindSet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public bool Union(int a, int b)
3030

3131
}
3232

33-
int root(int a)
33+
private int root(int a)
3434
{
3535
if (parents[a] == a)
3636
return a;

0 commit comments

Comments
 (0)