Types Problem, NEW/ For Each funktioniert nicht

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

judos

Betreff: Types Problem, NEW/ For Each funktioniert nicht

BeitragMi, Apr 16, 2008 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

Habe mal begonnen mich mit den Types von BB vertraut zu machen.
Dachte zum testen wäre eine Path-finding variante mit Types ganz gut.
Naja das Problem ist jetzt halt folgendes: Wenn mehr als eine Möglichkeit besteht von einem Punkt in Richtung des Ziels zu kommen, dann wird ein neuer Weg erstellt und die einzelnen Schritte kopiert.
Dieser Teil des Programmes wäre wohl dazu am wichtigsten.

Code: [AUSKLAPPEN]

      weg2=New bsearch_wege
         weg2\ebene=weg\ebene         ;Für später wichtig
         weg2\suche=-1                         ;behandeln des Weges erst ab nächstem durchgang
         weg2\length=weg\length         ;um den kürzesten Weg zu finden
         
         weg\schritt=First bsearch_schritte
         For k=1 To weg\steps-1            ;Anzahl Schritte minus den letzten, welcher anders sein soll
            weg2\schritt=New bsearch_schritte
            weg2\schritt\x=weg\schritt\x     ;Jeder Schritt hinzufügen
            weg2\schritt\y=weg\schritt\y
            weg\schritt=After weg\schritt
         Next
         weg2\schritt = New bsearch_schritte    ;Letzter Schritt welcher vom ursprünglichen Weg abweicht hinzufügen
         weg2\schritt\x=rx[i]
         weg2\schritt\y=ry[i]
         wege(rx[i],ry[i])=1

         weg2\length=weg\length+Sqr(2)^rv[i]     ;Länge, Aktuelle position setzen
         weg2\aktx=rx[i]
         weg2\akty=ry[i]

Da das ganze schon in einer For ... Each Schleife läuft, dachte ich, ich müsse für den neuen Weg eine neue Container Variable nehmen (weg2), aber am schluss scheint es nicht zu funktionieren, da der neue Weg nicht erstellt wird oder erfasst werden kann...

Kann mir jemand weiter helfen oder zumindest sagen wo das Programm im Bezug auf Types komisch ist? Very Happy


mfg judos



Hier noch der ganze Code, damit ihrs ausprobieren und testen könnt:

Der Weg wird Rechteckig gesucht, also nur Wege die im Rechteck das aus dem Start und Zielpunkt festgelegt wird, können gefunden werden. (Später werde ich es dann noch entsprechend erweitern damit Hindernisse noch zu entsprechenden umwegen führen...)
Infos zur Wegsuche: Tiles=Quadrate, 8-Richtungen sind möglich
Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Dim land(79,59)
Dim wege(79,59)
For i=0 To 79
   For j=0 To 59
      land(i,j)=1     ;land=1 heisst land ist begehbar
   Next
Next
Global timer=CreateTimer(40)
Global fps,fpsm,fpst$




Global weg.bsearch_wege          ;Types für Wege
Global weg2.bsearch_wege
Type bsearch_wege
   Field ebene
   Field suche
   Field length#
   Field steps
   Field aktx
   Field akty
   Field schritt.bsearch_schritte
End Type

Type bsearch_schritte               ;Type für die einzelnen Schritte eines Weges
   Field x
   Field y
End Type




Repeat                               ;Main Programm
Cls


draw_karte()                  ;Zeichnet karte
draw_weg()                  ;zeichnet gefundene Wege
klick()                             ;Mit der Maus die Karte verändern
fps()
WaitTimer timer
Flip
Until KeyHit(1)
End



Function bsearch(x1,y1,x2,y2,ebene=1,map_size_x=79,map_size_y=59)
Delete Each bsearch_wege
Delete Each bsearch_schritte

weg.bsearch_wege=New bsearch_wege        ;Erster Weg beginnen
weg\ebene=ebene
weg\suche=1
weg\steps=1
weg\length#=0

weg\schritt=New bsearch_schritte
weg\schritt\x=x1
weg\schritt\y=y1

weg\aktx=x1
weg\akty=y1

Local rx[7]
Local ry[7]
Local rp[7]
Local rv[7]


For i=0 To map_size_x
   For j=0 To map_size_y
      wege(i,j)=0         ;Damit sich Wege nicht überschneiden können
   Next
Next
wege(x1,y1)=1                          ;1 heisst dieser Punkt wurde schon von einem Weg betreten


Repeat

For weg= Each bsearch_wege
If weg\ebene=ebene And weg\suche=1 Then       ;Für jeden Weg der am suchen ist

max=0
For i=0 To 7                                                          ;Für jede der 8 Richtungen
   rp[i]=0
   x=Int(Cos(i*360/8))
   y=Int(Sin(i*360/8))
   rx[i]=weg\aktx+x
   ry[i]=weg\akty+y
   
   If rx[i]>=0 And rx[i]<=map_size_x And ry[i]>=0 And ry[i]<=map_size_y Then   ;Prüfen ob auf Karte
      sx=Sgn(x2-weg\aktx)
      sy=Sgn(y2-weg\akty)
      
      If (sx=0 And x=0) Or (sx=1 And (x=1 Or x=0)) Or (sx=-1 And (x=-1 Or x=0)) Then  ;Prüfen ob dies Richtung Ziel geht
      If (sy=0 And y=0) Or (sy=1 And (y=1 Or y=0)) Or (sy=-1 And (y=-1 Or y=0)) Then
      
      
         platz= land( rx[i],ry[i] )
         frei=1
         
         If platz=frei And wege(rx[i],ry[i])=0 Then   ;Prüfen ob Land begehbar ist
            rp[i]=1
            rv[i]=(i) Mod 2
            If rv[i]>max Then max=rv[i]
         EndIf
      EndIf
      EndIf
   EndIf
Next

j=0
For i=0 To 7
   DebugLog "Richtung "+i
   If rp[i]=1 Then                                          ;Für jede Richtung die möglich ist alter Weg fortsetzen oder...
      If j=0 Then
         DebugLog "Alter Weg..."
         weg\schritt=New bsearch_schritte
         weg\schritt\x=rx[i]
         weg\schritt\y=ry[i]
         wege(rx[i],ry[i])=1
         weg\length=weg\length+Sqr(2)^rv[i]
         weg\aktx=rx[i]
         weg\akty=ry[i]
         weg\steps=weg\steps+1
      Else                                                            ;Neuer Weg erstellen...
         DebugLog "Neuer Weg..."
         weg2=New bsearch_wege
         weg2\ebene=weg\ebene
         weg2\suche=-1
         weg2\length=weg\length
         anz=0
         
         weg\schritt=First bsearch_schritte
         For k=1 To weg\steps-1
            weg2\schritt=New bsearch_schritte
            weg2\schritt\x=weg\schritt\x
            weg2\schritt\y=weg\schritt\y
            weg\schritt=After weg\schritt
         Next
         weg2\schritt = New bsearch_schritte
         weg2\schritt\x=rx[i]
         weg2\schritt\y=ry[i]
         wege(rx[i],ry[i])=1

         weg2\length=weg\length+Sqr(2)^rv[i]
         weg2\aktx=rx[i]
         weg2\akty=ry[i]
      EndIf
      j=j+1
   EndIf
Next

If weg\aktx=x2 And weg\akty=y2 Or weg\length>280 Then weg\suche=0

EndIf
Next

ex=0
ex2=0
For weg2=Each bsearch_wege
   If weg2\ebene=ebene Then ex2=ex2+1
   weg2\suche=Abs(weg2\suche)
   If weg2\suche<>0 And weg2\ebene=ebene Then ex=ex+1:Exit
Next
Delay 2000
DebugLog "Anzahl Wege:"+ex2+", davon noch suchend:"+ex

If ex=0 Then Exit
Forever

End Function







Function fps()
fps=fps+1
If fpst$<>CurrentTime$() Then
   fpsm=fps
   fps=0
   fpst$=CurrentTime$()
   bsearch(0,0,79,59)
EndIf
Color 255,255,255
Text 10,30,"fps:"+fpsm
End Function




Function draw_weg()
anz=0
For weg=Each bsearch_wege
   anz=anz+1
   For weg\schritt = Each bsearch_schritte
      Color 0,0,255
      Rect weg\schritt\x*10+2,weg\schritt\y*10+2,6,6
   Next
Next
Color 255,255,255
Text 10,10,anz
End Function




Function klick()
x=MouseX()/10
If x>=0 And x<=79 Then
   y=MouseY()/10
   If y>=0 And y<=59 Then
      If MouseDown(1) Then land(x,y)=1
      If MouseDown(2) Then land(x,y)=0
   EndIf
EndIf
End Function


Function draw_karte()
For i=0 To 79
   For j=0 To 59
      If land(i,j)=0 Then Color 150,0,0
      If land(i,j)=1 Then Color 0,150,0
      Rect i*10,j*10,9,9,1
;      Color 0,0,0
;      Rect i*10,j*10,11,11,0
   Next
Next
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group