首先讓我爲大小道歉我會盡量設法準確地建立Prim算法是怎麼說在維基百科上的我摸索出之後保持這種儘可能小C#迷宮代我自己的實現Prim算法的Bug
我的迷宮沒有建立起來。 所以我試圖做同樣的想法,以適應我的迷宮,但我看到一個奇怪的錯誤,
當我的遊戲開始它只是無法正常建立我的迷宮,我無法弄清楚,爲什麼 這是偶爾發生的
其他時候,它完美的作品, 所以我有一個public Dictionary<int, Dictionary<int, MazeCellState>> maze
該持有迷宮,當它開始迷宮是一切的籬笆,然後我着手建造像這樣
private static void buildPath()
{
List<KeyValuePair<Misc.Cord, Misc.Cord>> ends = new List<KeyValuePair<Misc.Cord, Misc.Cord>>();
ends.Add(new KeyValuePair<Misc.Cord, Misc.Cord>(new Misc.Cord() { X = 0, Y = 0 }, new Misc.Cord() { X = 0, Y = 0 }));
Misc.Cord currentPos = null;
while (ends.Count > 0)
{
int posKey = rand.Next(0, ends.Count);
Misc.Cord lastPos = ends[posKey].Key;
currentPos = ends[posKey].Value;
maze[currentPos.X][currentPos.Y] = MazeCellState.Path;
int currentCount = 0;
MovingState moveTo1 = (MovingState)rand.Next(0, 4);
MovingState moveTo2 = (MovingState)rand.Next(0, 4);
while (moveTo1.Equals(moveTo2))
{
moveTo1 = (MovingState)rand.Next(0, 4);
moveTo2 = (MovingState)rand.Next(0, 4);
}
// check left
if (currentPos.X - 2 > 0 && maze[currentPos.X - 2][currentPos.Y] != MazeCellState.Path && currentCount < 2 && (moveTo1 == MovingState.Left || moveTo2 == MovingState.Left))
{
if(!lastPos.Equals(new Misc.Cord() { X = currentPos.X - 2, Y = currentPos.Y }))
{
ends.Add(new KeyValuePair<Misc.Cord, Misc.Cord>(currentPos, new Misc.Cord() { X = currentPos.X - 2, Y = currentPos.Y }));
maze[currentPos.X - 1][currentPos.Y] = MazeCellState.Path;
currentCount++;
}
}
// check right
if (currentPos.X + 2 < maze.Count && maze[currentPos.X + 2][currentPos.Y] != MazeCellState.Path && currentCount < 2 && (moveTo1 == MovingState.Right || moveTo2 == MovingState.Right))
{
if (!lastPos.Equals(new Misc.Cord() { X = currentPos.X + 2, Y = currentPos.Y }))
{
ends.Add(new KeyValuePair<Misc.Cord, Misc.Cord>(currentPos, new Misc.Cord() { X = currentPos.X + 2, Y = currentPos.Y }));
maze[currentPos.X + 1][currentPos.Y] = MazeCellState.Path;
currentCount++;
}
}
// check Up
if (currentPos.Y - 2 > 0 && maze[currentPos.X][currentPos.Y - 2] != MazeCellState.Path && currentCount < 2 && (moveTo1 == MovingState.Up || moveTo2 == MovingState.Up))
{
if(!lastPos.Equals(new Misc.Cord() { X = currentPos.X, Y = currentPos.Y - 2}))
{
ends.Add(new KeyValuePair<Misc.Cord, Misc.Cord>(currentPos, new Misc.Cord() { X = currentPos.X, Y = currentPos.Y - 2 }));
maze[currentPos.X][currentPos.Y - 1] = MazeCellState.Path;
currentCount++;
}
}
// check Down
if (currentPos.Y + 2 < maze[0].Count && maze[currentPos.X][currentPos.Y + 2] != MazeCellState.Path && currentCount < 2 && (moveTo1 == MovingState.Down || moveTo2 == MovingState.Down))
{
if(!lastPos.Equals(new Misc.Cord() { X = currentPos.X, Y = currentPos.Y + 2}))
{
ends.Add(new KeyValuePair<Misc.Cord, Misc.Cord>(currentPos, new Misc.Cord() { X = currentPos.X, Y = currentPos.Y + 2 }));
maze[currentPos.X][currentPos.Y + 1] = MazeCellState.Path;
currentCount++;
}
}
ends.RemoveAt(posKey);
ends = reorderList(ends);
}
maze[0][1] = MazeCellState.Path;
}
路徑
我不知道爲什麼有時我上面結了圖片,我的理論是,它最終的向上回致力於它的自我
一些快速的筆記,MazeCellState只能是在這一點上2個選項之一,路徑或對衝基金和reorderList將重新索引任何類型的迷宮大小的列表從屏幕分辨率計算方法爲,每個單元爲64×64 PX,
GraphicsDevice.Viewport.Width * 5/64,
GraphicsDevice.Viewport.Height * 5/64
好吧,我很抱歉,但你的第三段失去了我這可能是我的閱讀障礙,但你有關於數字的?一個較低,但你沒有說任何關於從0設置數字,以及如何在x數組中包含一個包含0的y數組,但你沒有說任何關於更改數字的任何內容,並且你有牆在什麼數字系統中的牆壁是否爲0?也是通過你的探索,整個頂行將是一個道路有點讓這個迷宮有點容易觀看視頻在這裏http://en.wikipedia.org/wiki/Prim's_algorithm –
哦另一個音符我只是把一個黑客掃描迷宮,如果少於5條路徑存在重新做迷宮建設,因爲這是一年前現在不能相信你拿起這個很好知道帕斯卡被用於某種形式我甚至不認爲你可以得到Turbo的編譯器。認爲它死於Windows XP 哦,最後這是一個代碼幫助網站你給了什麼是很多的網站給甚至一個代碼的報價將很好地顯示你的意思,但是在TP建設是非常不同的多線程C#應用程序 –
正如我在第二段中所說的「用零連續編號的單元格編號」。這些是您在第3段中使用的數字。 – cliffordheath