Deep First Search Algorithmus - Fehler in der Programmierung

Für allgemeine Fragen zur Programmierung mit PureBasic.
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Deep First Search Algorithmus - Fehler in der Programmierung

Beitrag von TheCreepyProgramer »

Hallo,

ich programmiere im Moment an einer PureBasic-Umsetzung des Deep First Search-Algorithmuses (http://en.wikipedia.org/wiki/Maze_gener ... rst_search). Allerdings hänge ich im Moment an der Umsetzung. Denn immer wenn ich den Algorithmus starte, dann "generiert" er mir lediglich eine gerade Linie. Allerdings finde ich den Fehler, weshalb, nicht.

Code: Alles auswählen

Structure MazeCells
  visited.b
  isWall.b
EndStructure 
Structure Param
  startX.l
  startY.l
EndStructure
Global NewMap Maze.MazeCells()
NewMap MazeBackup.MazeCells()
#MazeWidth = 25
#MazeHeight = 19
;+++++++++++++++++++++++++++++++
;+ Deep First Search Algorithm +
;+++++++++++++++++++++++++++++++
Procedure DeepFirstSearch(*Params.Param)
  Protected curX, curY
  curX = *Params\startX
  curY = *Params\startY
  Repeat
    If curX < 1 Or curY < 1 Or curX >= #MazeWidth Or curY >= #MazeHeight
      ProcedureReturn 0
    EndIf
    If curX % 2 = 0 Or curY % 2 = 0
      ProcedureReturn 0
    EndIf
    Debug "x: " : Debug curX
    Debug "y: " : Debug curY
    Repeat
      success.b = 0
      direction = Random(3) ; anscheinend kommt hier immer die Zahl 3 aus, da der Weg von links nach rechts führt.
      Select direction
        Case 0 ; oben
          If curX = 1 Or Maze(Str(curX)+"|"+Str(curY - 2))\visited = 1
            Continue
          ElseIf curY >= 3
            Maze(Str(curX)+"|"+Str(curY - 1))\isWall = 0
            Maze()\visited = 1
            Maze(Str(curX)+"|"+Str(curY - 2))\isWall = 0
            Maze()\visited = 1
            nextX = curX
            nextY = curY - 2
            success = 1
          EndIf
        Case 1 ; links
          If curY = 1 Or Maze(Str(curX - 2)+"|"+Str(curY))\visited = 1
            Continue 
          ElseIf curX >= 3
            Maze(Str(curX - 1)+"|"+Str(curY))\isWall = 0
            Maze()\visited = 1
            Maze(Str(curX - 2)+"|"+Str(curY))\isWall = 0
            Maze()\visited = 1
            nextX = curX - 2
            nextY = curY
            success = 1
          EndIf 
        Case 2 ; unten
          If curY = #MazeHeight - 1 Or Maze(Str(curX)+"|"+Str(curY + 2))\visited = 1
            Continue
          ElseIf curY > #MazeHeight - 3           
            Maze(Str(curX)+"|"+Str(curY + 1))\isWall = 0
            Maze()\visited = 1
            Maze(Str(curX)+"|"+Str(curY + 2))\isWall = 0
            Maze()\visited = 1
            nextX = curX
            nextY = curY + 2
            success = 1
          EndIf
        Case 3 ; rechts
          If curY = #MazeWidth - 1 Or Maze(Str(curX + 2)+"|"+Str(curY))\visited = 1
            Continue
          ElseIf curX <= #MazeWidth - 3      
            Maze(Str(curX + 1)+"|"+Str(curY))\isWall = 0
            Maze()\visited = 1
            Maze(Str(curX + 2)+"|"+Str(curY))\isWall = 0
            Maze()\visited = 1
            nextX = curX + 2
            nextY = curY
            success = 1
          EndIf
      EndSelect
    Until success = 1
    curX = nextX
    curY = nextY
  Until curY >= #MazeHeight Or curX >= #MazeWidth
  ProcedureReturn 1
EndProcedure
;+++++++++++++++++++++++++
;+ Main code starts here +
;+++++++++++++++++++++++++
;{
OpenConsole()
PrintN("Initialising DirectX...")
If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("MazeAlgorithm", "Could not initialize DirectX!")
  End
EndIf

PrintN("Filling maze...")

For i = 0 To #MazeHeight - 1
  For j = 0 To #MazeWidth - 1
    Maze(Str(j)+"|"+Str(i))\visited = 0
    Maze()\isWall = 1
  Next
Next
PrintN("Open screen...")
screen = OpenScreen(1920, 1080, 32, "MazeAlgorithm", #PB_Screen_SmartSynchronization, 60)
If screen
  
  Repeat
    
    ExamineKeyboard()
    ClearScreen(#Black)
    
    If StartDrawing(ScreenOutput())
      DrawText(#MazeWidth * 31 + 10, 5, "Keys:")
      DrawText(#MazeWidth * 31 + 10, 35, "D: Deep First Search-Algorithm")
      Line(0, #MazeHeight * 31 + 1, #MazeWidth * 31 + 1, 1, #White)
      Line(#MazeWidth * 31 + 1, 0, 1, #MazeHeight * 31 + 1, #White)
      StopDrawing()
    EndIf
    
    If KeyboardReleased(#PB_Key_D)
      startTime = ElapsedMilliseconds()
      *Params.Param = AllocateMemory(SizeOf(Param))
      *Params\startX = 1
      *Params\startY = 1
      PrintN("Generating maze with deep first search alogrithm....")
      CopyMap(Maze(), MazeBackup())
      thread = CreateThread(@DeepFirstSearch(), *Params)
;       If thread = 0
;         PrintN("Generated maze in " + Str(ElapsedMilliseconds() - startTime) + " seconds")
;       EndIf
    EndIf
    
    ;+++++++++++
    ;+ Rendern +
    ;+++++++++++
    If IsScreenActive()
      If StartDrawing(ScreenOutput())
        If IsThread(thread)
          ForEach MazeBackup()
            If MazeBackup()\isWall = 0
              Box(Val(StringField(MapKey(MazeBackup()), 1, "|")) * 31, Val(StringField(MapKey(MazeBackup()), 2, "|")) * 31, 31, 31, #White)
            EndIf
          Next
        Else
          ForEach Maze()
            If Maze()\isWall = 0
              Box(Val(StringField(MapKey(Maze()), 1, "|")) * 31, Val(StringField(MapKey(Maze()), 2, "|")) * 31, 31, 31, #White)
            EndIf
          Next
        EndIf
        StopDrawing()
      EndIf
      
      FlipBuffers()
    EndIf
    
  Until KeyboardPushed(#PB_Key_LeftControl) And KeyboardPushed(#PB_Key_Q)
  CloseScreen()
  PrintN("Finished!")
  PrintN("Press any key...")
EndIf
While Inkey() = "" : Wend
;}
Ich wäre sehr dankbar, wenn mir jemand sagen könnte, wo mein Fehler ist.

TheCreepyProgramer
Bild
Dark
Beiträge: 93
Registriert: 24.08.2007 20:36
Kontaktdaten:

Re: Deep First Search Algorithmus - Fehler in der Programmie

Beitrag von Dark »

Hallo,

ich habe mir den Algorithmus selber mal angeschaut und gesehen das bei dir noch einige Bestandteile fehlten. Bei dir gibt es zum Beispiel keine Rekursion, Stack oder ähnliches. Ich habe daher mal eine eigene Implementierung geschrieben, die nicht 100% mit dem Algorithmus übereinstimmt, da ich die Elemente vom Stack, welche die selbe Rekursionstufe haben, nicht zufällig auswähle (außer dem ersten Element). Da das Labyrinth sich aber in der Zwischenzeit schon mit sehr hoher Wahrscheinlichkeit weiter verändert hat, gibt es einen indirekten Zufall.

So nun zu meiner Implementierung: Der Algorithmus geht jedes Feld ab und zieht eigentlich Verbindungen zwischen den Feldern. Also der Algorithmus erzeugt eigentlich einen Graphen aus Linien, für meinen Fall passt das aber nicht, daher verwende ich einen Trick: Ich überspringe jedes 2. Feld um die "Linien" dazwischen zeichnen zu können.
Als Stack verwende ich eine Liste, da ich das ganze ohne Rekursion implementieren wollte.

Der Code macht nun folgendes:
  • Am Anfang wähle ein zufälliges Feld
  • überprüfe für das aktuelle Feld ob es schon besucht wurde.
  • Nein:
    entferne die Wand, setze Visited und ziehe eine Linie vom letzten zum aktuellen Feld.
    Danach füge alle verfügbaren Nachbarfelder auf den Stack hinzu und verschiebe den "Stackpointer" auf ein zufälliges eben hinzugefügtes Element (falls es keins gab, wird der "Stackpointer" auch nicht verschoben)
  • Ja: tue nichts
  • Überprüfe ob noch Elemente auf dem Stack sind, falls nicht, breche ab
  • Setze das aktuelle Feld auf das momentan aktuelle des Stacks, lösche es heraus und setze den Stackpointer wieder auf das letze Element (sonst würde im nächsten Durchlauf, die neuen Elemte dazwischen eingefügt und dann weiß ich nicht ob der Algorithmus noch funktionieren würde, da die Rekursionsstufen vermischt würden)
So, nun aber zum Code:

Code: Alles auswählen

EnableExplicit

Structure Field
  NoWall.a
  Visited.a
EndStructure

Structure Maze
  Width.i
  Height.i
  Fields.Field[0]
EndStructure

Structure StackElement
  OldX.i
  OldY.i
  NewX.i
  NewY.i
EndStructure

Macro MazeXY(Maze, X, Y)
  Maze\Fields[Maze\Width * (Y) + (X)]
EndMacro

Macro MazeInsie(Maze, X, Y)
  ((X) > 0 And (Y) > 0 And (X) < Maze\Width - 1 And (Y) < Maze\Height - 1)  
EndMacro

Macro CheckAndAdd(Maze, Stack, Counter, CurX, CurY, CheckX, CheckY)
  If MazeInsie(Maze, (CheckX), (CheckY)) And MazeXY(Maze, (CheckX), (CheckY))\Visited = #False
    Counter + 1
    AddElement(Stack())
    Stack()\NewX = CheckX
    Stack()\NewY = CheckY
    Stack()\OldX = CurX
    Stack()\OldY = CurY
  EndIf
EndMacro

Declare RenderMaze(*Maze.Maze, CanvasID)

Procedure CreateMaze(Width, Height, ShowCreation, UpdateCanvas)
  
  Protected *NewMaze.Maze = AllocateMemory(SizeOf(Maze) + SizeOf(Field) * Width * Height)

  If *NewMaze
    
    *NewMaze\Width  = Width
    *NewMaze\Height = Height
    
    NewList Stack.StackElement()
    
    Protected NextX.i = Random((Width-2)  / 2) * 2 + 1
    Protected NextY.i = Random((Height-2) / 2) * 2 + 1
    Protected OldX.i = -1, OldY.i = -1
    
    Repeat
      
      If MazeXY(*NewMaze, NextX, NextY)\Visited = #False 
        
        If OldX <> -1 And OldY <> -1
          MazeXY(*NewMaze, NextX - (NextX - OldX) / 2, NextY - (NextY - OldY) / 2)\NoWall = #True 
        EndIf
      
        MazeXY(*NewMaze, NextX, NextY)\Visited = #True
        MazeXY(*NewMaze, NextX, NextY)\NoWall  = #True
        
        Protected MaxField.i = 0
        CheckAndAdd(*NewMaze, Stack, MaxField, NextX, NextY, NextX-2, NextY)      
        CheckAndAdd(*NewMaze, Stack, MaxField, NextX, NextY, NextX,   NextY-2)   
        CheckAndAdd(*NewMaze, Stack, MaxField, NextX, NextY, NextX+2, NextY)   
        CheckAndAdd(*NewMaze, Stack, MaxField, NextX, NextY, NextX,   NextY+2)   
        
        If MaxField > 0
          Protected i.i, Rand.i = Random(MaxField-1)
          For i = 1 To Rand
            PreviousElement(Stack())
          Next
        EndIf
        
        If ShowCreation : RenderMaze(*NewMaze, UpdateCanvas) : Delay(75) : WindowEvent() : EndIf

      EndIf
            
      If ListSize(Stack()) = 0
        Break
      EndIf        
      
      NextX = Stack()\NewX : NextY = Stack()\NewY     
      OldX  = Stack()\OldX : OldY  = Stack()\OldY
            
      DeleteElement(Stack())
      LastElement(Stack())
      
    ForEver
    
    ProcedureReturn *NewMaze
  EndIf
  
  ProcedureReturn 0
  
EndProcedure


Procedure RenderMaze(*Maze.Maze, CanvasID)
  
  If *Maze

    StartDrawing(CanvasOutput(CanvasID))
    
      Protected X.i, Y.i
      For y = 0 To *Maze\Height - 1
        For x = 0 To *Maze\Width - 1
          If MazeXY(*Maze, x, y)\NoWall 
            Box(5*x, 5*y, 5, 5, RGB(255,255,255))
          Else
            Box(5*x, 5*y, 5, 5, RGB(0,0,0))  
          EndIf
        Next
      Next    
      
    EndIf  
    
  StopDrawing()
  
EndProcedure

If OpenWindow(0, 0, 0, 400, 240, "MazeGen", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  TextGadget(    1, 5,    5, 40,  20, "Width:")
  StringGadget(  2, 45,   5, 50,  20, "")
  TextGadget(    3, 100,  5, 40,  20, "Height:")
  StringGadget(  4, 145,  5, 50,  20, "")
  CheckBoxGadget(5, 200,  5, 100, 20, "Show generation")
  ButtonGadget(  6, 305,  5, 90,  20, "Generate")
  CanvasGadget(  7, 5,   30, 1,    1)
  
  Define Event.i
  
  Repeat
    
    Event.i = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
      
      If EventGadget() = 6
        
        Define Width.i  = Val(GetGadgetText(2))
        Define Height.i = Val(GetGadgetText(4))
        
        If Width > 0 And Height > 0
          
          If Width * 5 + 10 > 400
            ResizeWindow(0, #PB_Ignore, #PB_Ignore, Width * 5 + 10,  Height * 5 + 35)  
          Else
            ResizeWindow(0, #PB_Ignore, #PB_Ignore, #PB_Ignore, Height * 5 + 35)  
          EndIf
          
          ResizeGadget(7, #PB_Ignore, #PB_Ignore, Width * 5, Height * 5)
            
          Define *Maze = CreateMaze(Width, Height, GetGadgetState(5), 7)
          
          If *Maze
            
            RenderMaze(*Maze, 7)
            
            FreeMemory(*Maze)
          EndIf
        EndIf
        
      EndIf
      
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf
Edit: Da war noch ein kleiner Bug drinne: For ... to Random(..) ist keine gute Idee, da PB dann bei jedem Durchlauf einen neuen Wert generiert. Daher wird der Wert jetzt nur einmal vorher generiert.

PS: Dadurch das es nicht den richtigen Stack verwendet, kann man auch sehr große Labyrinthe erzeugen wie z.B. http://dl.dropbox.com/u/61413222/maze.png. Der Code kann theoretisch noch viel größere erzeugen, aber die Bitmap von einem 2048x2048 Labyrinth mit 5 Pixeln pro Feld ist schon ~700MB groß.

Mfg,
Dark
Zuletzt geändert von Dark am 02.03.2012 18:02, insgesamt 1-mal geändert.
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: Deep First Search Algorithmus - Fehler in der Programmie

Beitrag von TheCreepyProgramer »

Ich habe meine Code auch noch mal überarbeitet, und er funktioniert auch einigermaßen, nur dass der Algorithmus sich aufhängt, wenn ich nicht noch einen Zähler parallel laufen lasse, der nach der Breite*Höhe*2ten Wiederholung abbricht.
MazeAlgorithm.pbi:

Code: Alles auswählen

Procedure FindUnvisitedCell()
  Protected counter = 0
  ForEach Cells()
    If Cells() = 0
      counter + 1
    EndIf
  Next
  ProcedureReturn counter
EndProcedure

Procedure CountUnvisitedNeighbours(x, y)
  Protected result
  If FindMapElement(Cells(), Str(x + 2) + "|" + Str(y))
    If Cells(Str(x + 2) + "|" + Str(y)) = 0
      result + 1
    EndIf
  EndIf
  If FindMapElement(Cells(), Str(x - 2) + "|" + Str(y))
    If Cells(Str(x - 2) + "|" + Str(y)) = 0
      result + 1
    EndIf
  EndIf
  If FindMapElement(Cells(), Str(x) + "|" + Str(y + 2))
    If Cells(Str(x) + "|" + Str(y + 2)) = 0
      result + 1
    EndIf
  EndIf
  If FindMapElement(Cells(), Str(x) + "|" + Str(y - 2))
    If Cells(Str(x) + "|" + Str(y - 2)) = 0
      result + 1
    EndIf
  EndIf
  ProcedureReturn result
EndProcedure

Procedure SaveAsTextFile(file.s, Map Bitmap.MazeCells(), mazeWidth, mazeHeight)
  Protected counter = 0, fileNo
  fileNo = CreateFile(#PB_Any, file)
  If fileNo
    ForEach Bitmap()
      WriteByte(fileNo, Bitmap()\isWall)
      If counter = mazeWidth
        counter = 0
        WriteLong(fileNo, #LF$)
      EndIf
    Next
    CloseFile(fileNo)
  EndIf
EndProcedure
MazeAlgorithm.pb:

Code: Alles auswählen

EnableExplicit
Structure MazeCells
  visited.b
  isWall.b
EndStructure 
Structure Param
  startX.l
  startY.l
EndStructure
Global NewMap Maze.MazeCells()
Global NewMap Cells()
#MazeWidth = 26
rk#MazeHeight = 20
XIncludeFile "MazeAlgorithm.pbi"
;++++++++++
;+ Macros +
;++++++++++
Macro MapElementKey(Pointer)
  PeekS(PeekI(Pointer-SizeOf(Integer)))
EndMacro

Macro ChangeCurrentMapElement(Map, Pointer)
  FindMapElement(Map, MapElementKey(Pointer))
EndMacro
;+++++++++++++++++++++++++++++++
;+ Deep First Search Algorithm +
;+++++++++++++++++++++++++++++++
Procedure DeepFirstSearch(*Params.Param)
  Protected x, y, i, j, success.b, success_find.b, neighbour, *Pointer, counter = 0
  For i = 0 To #MazeHeight + 1
    For j = 0 To #MazeWidth + 1
      If j % 2 <> 0 And i % 2 <> 0
        Cells(Str(j)+"|"+Str(i)) = 0
      EndIf
    Next
  Next
  x = *Params\startX
  y = *Params\startY
  While FindUnvisitedCell() > 0 And counter < MapSize(Cells()) * 2
    If CountUnvisitedNeighbours(x, y) <> 0
      Debug x
      Debug y
      Debug "----"
      Repeat
        success = 0
        neighbour = Random(3)
        Select neighbour
          Case 0
            If FindMapElement(Cells(), Str(x)+"|"+Str(y - 2))
              If Maze(Str(x)+"|"+Str(y - 2))\visited = 0
                Cells(Str(x)+"|"+Str(y - 2)) = 1
                Maze(Str(x)+"|"+Str(y - 2))\isWall = 0
                Maze()\visited = 1
                Maze(Str(x)+"|"+Str(y - 1))\isWall = 0
                Maze()\visited = 1
                success = 1
                y - 2
              EndIf
            EndIf
          Case 1
            If FindMapElement(Cells(), Str(x - 2)+"|"+Str(y))
              If Maze(Str(x - 2)+"|"+Str(y))\visited = 0
                Cells(Str(x - 2)+"|"+Str(y)) = 1
                Maze(Str(x - 2)+"|"+Str(y))\isWall = 0
                Maze()\visited = 1
                Maze(Str(x - 1)+"|"+Str(y))\isWall = 0
                Maze()\visited = 1
                success = 1
                x - 2
              EndIf
            EndIf
          Case 2
            If FindMapElement(Cells(), Str(x)+"|"+Str(y + 2))
              If Maze(Str(x)+"|"+Str(y + 2))\visited = 0
                Cells(Str(x)+"|"+Str(y + 2)) = 1
                Maze(Str(x)+"|"+Str(y + 2))\isWall = 0
                Maze()\visited = 1
                Maze(Str(x)+"|"+Str(y + 1))\isWall = 0
                Maze()\visited = 1
                success = 1
                y + 2
              EndIf
            EndIf
          Case 3
            If FindMapElement(Cells(), Str(x + 2)+"|"+Str(y))
              If Maze(Str(x + 2)+"|"+Str(y))\visited = 0
                Cells(Str(x + 2)+"|"+Str(y)) = 1
                Maze(Str(x + 2)+"|"+Str(y))\isWall = 0
                Maze()\visited = 1
                Maze(Str(x + 1)+"|"+Str(y))\isWall = 0
                Maze()\visited = 1
                success = 1
                x + 2
              EndIf
            EndIf
        EndSelect
      Until success = 1
    Else
      Repeat
        success_find = 0
        ResetMap(Cells())
        For i = 0 To Random(MapSize(Cells())) - 1
          *Pointer = NextMapElement(Cells())
        Next
        FindMapElement(Cells(), MapElementKey(*Pointer))
        x = Val(StringField(MapKey(Cells()), 1, "|"))
        y = Val(StringField(MapKey(Cells()), 2, "|"))
        If Cells() = 0
          success_find = 1
        EndIf
      Until success_find = 0
    EndIf 
    counter + 1
  Wend
  Debug "Algorithm ended!"
  ProcedureReturn 1
EndProcedure
;+++++++++++++++++++++++++
;+ Main code starts here +
;+++++++++++++++++++++++++
;{
;*Console.ScreenConsole = NewObject CONSOLE($FFFF88)
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("MazeAlgorithm", "Could not initialize DirectX!")
  End
EndIf

Define i.l, j.l, thread
For i = 0 To #MazeHeight - 1
  For j = 0 To #MazeWidth - 1
    Maze(Str(j)+"|"+Str(i))\visited = 0
    Maze()\isWall = 1
  Next
Next

Define screen, *Params.Param
screen = OpenScreen(1920, 1080, 32, "MazeAlgorithm", #PB_Screen_SmartSynchronization, 60)
If screen
  
  Repeat
    
    ExamineKeyboard()
    ClearScreen(#Black)
      
    If StartDrawing(ScreenOutput())
      ;*Console\Draw(#MazeWidth * 31 + 10, 65, 200, 50)
      DrawText(#MazeWidth * 31 + 10, 5, "Keys:")
      DrawText(#MazeWidth * 31 + 10, 35, "D: Deep First Search-Algorithm")
      Line(0, #MazeHeight * 31 + 1, #MazeWidth * 31 + 1, 1, #White)
      ;Line(#MazeWidth * 31 + 1, 0, 1, #MazeHeight * 31 + 1, #White)
      StopDrawing()
    EndIf
    
    If KeyboardReleased(#PB_Key_D)
      ;startTime = ElapsedMilliseconds()
      *Params.Param = AllocateMemory(SizeOf(Param))
      *Params\startX = 1
      *Params\startY = 1
      For i = 0 To #MazeHeight - 1
        For j = 0 To #MazeWidth - 1
          Maze(Str(j)+"|"+Str(i))\visited = 0
          Maze()\isWall = 1
        Next
      Next
      Debug "Thread started!"
      DeepFirstSearch(*Params)
    EndIf
    If KeyboardReleased(#PB_Key_S)
      SaveAsTextFile("level.lvl", Maze(), #MazeWidth, #MazeHeight)
    EndIf
    
    ;+++++++++++
    ;+ Rendern +
    ;+++++++++++
    If IsScreenActive()
      ReleaseMouse(0)
      ;If IsThread(thread) = 0
        If StartDrawing(ScreenOutput())
          ForEach Maze()
            If Maze()\isWall = 0
              Box(Val(StringField(MapKey(Maze()), 1, "|")) * 31, Val(StringField(MapKey(Maze()), 2, "|")) * 31, 31, 31, #White)
            EndIf
          Next
          StopDrawing()
        EndIf
      ;EndIf
      FlipBuffers()
    Else
      ReleaseMouse(1)
    EndIf
    
  Until KeyboardPushed(#PB_Key_LeftControl) And KeyboardPushed(#PB_Key_Q)
  CloseScreen()
EndIf
;}
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Deep First Search Algorithmus - Fehler in der Programmie

Beitrag von Nino »

Ich habe jetzt keine Lust mir die obigen Codes anzusehen, aber allein schon wegen des Thread-Titels poste ich mal einen Link zu einer Erklärung des eigenlichen Verfahrens der Tiefensuche (depth-first search). Das kann man ja noch für viele andere Zecke gebrauchen, nicht nur für Labyrinthe. Wenn man das Prinzip aber verstanden hat, kann man es auch für Labyrinthe benutzen. ;-)
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Re: Deep First Search Algorithmus - Fehler in der Programmie

Beitrag von Christian H »

Ohne viele Worte: http://rosettacode.org/wiki/Maze#PureBasic

Gruß Christian
Antworten