わかりました動的パスシステムを作成しようとしています。これにより、プレーヤーは事前定義されたパスなしでポイント A からポイント B に移動できます。このゲームはすべてテキストベースで、グラフィックはありません。プレーヤーは、上、下、n、e、s、w、sw、se、nw、ne の 10 方向に移動できます。
世界全体の地図はデータベースにあり、データベースの各行には部屋またはノードが含まれ、各部屋/ノードには移動可能な方向があります。部屋はシーケンシャルではないかもしれません。例:
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 は、Map 1 Room 3、Direction_S Map 1 Room 100 などに向かうことを示します...
わかりました、私は提案でコードを作り直しました(ちなみにありがとうございます!)ここに改訂されたコードがあります。遠く離れていても、部屋を見つけるようです!しかし、問題は目的地への最短経路を見つけることです。コレクションをトラバースしようとしましたが、経路が正しく出てきません...
下の画像リンクでは、中央の赤い四角に開始点があり、左上の赤い四角に停止点があります。これは、約 16 室しかない場合に、visitedStartRooms = 103 および VisitedStopRooms = 86 を返します。私の欠けているパズルのピースは、真の最短ルートを得るためにそれらのコレクションの部屋を整理する方法がわからないということです.
これが新しいコードです
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;
}
}
}