好吧我正在嘗試製作一個動態路徑系統,以便玩家可以從點A移動到點B而無需預定義路徑。注意這個遊戲是所有基於文本的沒有圖形。玩家可以在10個方向上移動:上,下,n,e,s,w,sw,se,nw和ne。尋路問題
整個世界的地圖都在一個數據庫中,數據庫的每一行都包含一個房間或一個節點,每個房間/節點都有它能夠前進的方向。房間可能不是連續的。一個例子:
Map Number, Room Number, Direction_N, Direction_S, Direction_E, Direction_W, etc.
1 1 1/3 1/100 1/1381 1/101
的Direction_N表示它進入地圖3室1,Direction_S地圖1個100室,等...
好吧,我重新設計搭配建議代碼(感謝你們的方式!)這裏是修改代碼。它似乎現在找到房間,甚至很遠的距離!但現在的問題是找到到目的地的最短路徑,我嘗試遍歷集合,但路徑不是正確的...
在下面的圖像鏈接,我有中心的紅色方塊的起點和停止指向左上角的紅色方塊。當它只有大約16個房間時,它返回visitedStartRooms = 103和visitedStopRooms = 86。 Quess我缺失的難題是我不知道如何理清這些集合中的房間以獲得真正的最短路線。
這是新代碼
public void findRoute(ROOM_INFO startRoom, ROOM_INFO destinationRoom)
{
Dictionary<ROOM_INFO, bool> visitedStartRooms = new Dictionary<ROOM_INFO, bool>();
Dictionary<ROOM_INFO, bool> visitedStopRooms = new Dictionary<ROOM_INFO, bool>();
List<string> directions = new List<string>();
startQueue.Enqueue(startRoom); // Queue up the initial room
destinationQueue.Enqueue(destinationRoom);
visitedStartRooms.Add(startRoom, true);// say we have been there, done that
visitedStopRooms.Add(destinationRoom, true);
string direction = "";
bool foundRoom = false;
while (startQueue.Count != 0 || destinationQueue.Count != 0)
{
ROOM_INFO currentStartRoom = startQueue.Dequeue(); // remove room from queue to check out.
ROOM_INFO currentDestinationRoom = destinationQueue.Dequeue();
ROOM_INFO startNextRoom = new ROOM_INFO();
ROOM_INFO stopNextRoom = new ROOM_INFO();
if (currentStartRoom.Equals(destinationRoom))
{
break;
}
else
{
// Start from destination and work to Start Point.
foreach (string exit in currentDestinationRoom.exitData)
{
stopNextRoom = extractMapRoom(exit); // get adjacent room
if (stopNextRoom.Equals(startRoom))
{
visitedStopRooms.Add(stopNextRoom, true);
foundRoom = true;
break;
}
if (stopNextRoom.mapNumber != 0 && stopNextRoom.roomNumber != 0)
{
if (!visitedStopRooms.ContainsKey(stopNextRoom))
{
if (visitedStartRooms.ContainsKey(stopNextRoom))
{
foundRoom = true;
}
else
{
destinationQueue.Enqueue(stopNextRoom);
visitedStopRooms.Add(stopNextRoom, true);
}
}
}
}
if (foundRoom)
{
break;
}
}
// start from the start and work way to destination point
foreach (string exit in currentStartRoom.exitData)
{
startNextRoom = extractMapRoom(exit); // get adjacent room
if (startNextRoom.Equals(destinationRoom))
{
visitedStartRooms.Add(startNextRoom, true);
foundRoom = true;
break;
}
if (startNextRoom.mapNumber != 0 && startNextRoom.roomNumber != 0)
{
if (!visitedStartRooms.ContainsKey(startNextRoom))
{
if (visitedStopRooms.ContainsKey(startNextRoom))
{
foundRoom = true;
break;
}
else
{
startQueue.Enqueue(startNextRoom);
visitedStartRooms.Add(startNextRoom, true);
}
}
}
}
if (foundRoom)
{
break;
}
}
}
算法中的一個問題是您使用隊列來查看您是否訪問了房間。但是,如果你訪問過一個已經出隊的房間,你會認爲你還沒有訪問它,所以你將花費大量的時間重新搜索已經遍歷的路徑。這可能是爲什麼性能在較長距離上如此迅速降低的原因。 – hatchet