@Scarabol:
Du hast also eine LinkedList mit Räumen und deren Koordinaten und bei
jedem Raum ist abgespeichert, mit welchem anderen Raum er verbunden ist?
Hier ein Beispielcode, wie du es vielleicht meinst. Ich habe dabei
angenommen, dass jeder Raum mit maximal 4 anderen Räumen verbunden
sein kann.
Code: Alles auswählen
Structure Room
x.l
y.l
*LinkedRoom.Room[4]
EndStructure
Global NewList Room.Room()
Procedure NewRoom(x.l, y.l) ;Erstellt einen neuen Raum
If AddElement(Room())
Room()\x = x
Room()\y = y
ProcedureReturn @Room()
EndIf
ProcedureReturn #False
EndProcedure
Procedure DelRoom(*Room.Room) ;Löscht einen bereits bestehenden Raum
Protected a.l, b.l
;Alle Verbindungen zu anderen Räumen löschen
For a = 0 To 3
If *Room\LinkedRoom[a]
For b = 0 To 3
If *Room\LinkedRoom[a]\LinkedRoom[b] = *Room
*Room\LinkedRoom[a]\LinkedRoom[b] = 0
EndIf
Next
EndIf
Next
;Raum löschen
ChangeCurrentElement(Room(), *Room)
DeleteElement(Room())
ProcedureReturn #True
EndProcedure
Procedure LinkRooms(*Room1.Room, *Room2.Room) ;Verbindet zwei Räume
Protected a.l, empty1.l = -1, empty2.l = -1
For a = 0 To 3
Select *Room1\LinkedRoom[a]
Case *Room2
ProcedureReturn #True ;Räume sind schon verbunden
Case 0
If empty1 = -1 : empty1 = a : EndIf
EndSelect
If *Room2\LinkedRoom[a] = 0
If empty2 = -1 : empty2 = a : EndIf
EndIf
Next
If empty1 >= 0 And empty2 >= 0
*Room1\LinkedRoom[empty1] = *Room2
*Room2\LinkedRoom[empty2] = *Room1
ProcedureReturn #True ;Räume verbunden
EndIf
ProcedureReturn #False ;Keine weitere Verbindung möglich
EndProcedure
Procedure DeLinkRooms(*Room1.Room, *Room2.Room) ;Löst die Verbindung wieder auf
Protected a.l
For a = 0 To 3
If *Room1\LinkedRoom[a] = *Room2
*Room1\LinkedRoom[a] = 0
EndIf
If *Room2\LinkedRoom[a] = *Room1
*Room2\LinkedRoom[a] = 0
EndIf
Next
ProcedureReturn #True
EndProcedure
Structure FindPath
*Room.Room
LinkedRoom.l
EndStructure
Procedure FindPath(*Room1.Room, *Room2.Room, *fRooms.Room())
Protected NewList FP.FindPath(), *FP.FindPath, *LinkedRoom.Room, r.l, ok.l, max.l = -1
AddElement(FP())
FP()\Room = *Room1
FP()\LinkedRoom = 0
*FP = @FP()
r = 0
;CallDebugger
Repeat
;Debug *FP\Room\x
If *FP\LinkedRoom >= 0 And *FP\LinkedRoom <= 3
*LinkedRoom = *FP\Room\LinkedRoom[*FP\LinkedRoom]
If *LinkedRoom
;Debug *LinkedRoom\x
If *LinkedRoom = *Room2 ;ZielRaum wurde gefunden
If max = -1 Or CountList(FP()) < max
max = CountList(FP())
ClearList(*fRooms())
ForEach FP()
AddElement(*fRooms())
*fRooms() = FP()\Room
Next
AddElement(*fRooms())
*fRooms() = *Room2
*FP\LinkedRoom = 3
EndIf
Else
ok = #True
ForEach FP()
If FP()\Room = *LinkedRoom
ok = #False
Break
EndIf
Next
If ok
*FP\LinkedRoom + 1
AddElement(FP())
FP()\Room = *LinkedRoom
FP()\LinkedRoom = -1
*FP = @FP()
r + 1
EndIf
EndIf
EndIf
*FP\LinkedRoom + 1
Else
If r = 0
If max > 0
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
Else
ChangeCurrentElement(FP(), *FP)
DeleteElement(FP())
*FP = @FP()
r - 1
EndIf
EndIf
ForEver
EndProcedure
Dim *Raum.Room(5)
;Wir erstellen 6 Räume und benutzen die x-Koordinate als ID
*Raum(0) = NewRoom(0, 0)
*Raum(1) = NewRoom(1, 0)
*Raum(2) = NewRoom(2, 0)
*Raum(3) = NewRoom(3, 0)
*Raum(4) = NewRoom(4, 0)
*Raum(5) = NewRoom(5, 0)
;Wir verbinden Raum 0 mit 1, 1 mit 2, 2 mit 3, 3 mit 4 und 4 mit 5 sozusagen als Kette,
;außerdem verbinden wir Raum 1 mit 5
LinkRooms(*Raum(0), *Raum(1))
LinkRooms(*Raum(1), *Raum(2))
LinkRooms(*Raum(2), *Raum(3))
LinkRooms(*Raum(3), *Raum(4))
LinkRooms(*Raum(4), *Raum(5))
LinkRooms(*Raum(1), *Raum(5))
NewList *Path.Room()
;Finde den Weg von Raum 0 zu 3
FindPath(*Raum(0), *Raum(3), *Path())
ForEach *Path()
Debug *Path()\x
Next
;Finde den Weg von Raum 0 zu 4
FindPath(*Raum(0), *Raum(3), *Path())
ForEach *Path()
Debug *Path()\x
Next