Types Problem, NEW/ For Each funktioniert nicht
Übersicht

judosBetreff: Types Problem, NEW/ For Each funktioniert nicht |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group