Seite 1 von 1

Suchpfad in Vierrichtungen

Verfasst: 25.01.2008 17:33
von Xaby

Code: Alles auswählen

Global=XGrenze=10
Global=YGrenze=10

Globla Dim CB.s(XGrenze, YGrenze)
;0 Reihen werden nicht berücksichtig

; Angenommen wir setzen Buchstaben-Hindernisse
CB(4,4)="X"
CB(7,5)="M"

;/ a, b soll die Position sein an der gestartet wird
;/ Unser Spieler kann waagerecht und senkrecht gehen, bis ein Hindernis auftaucht. Alle Möglichen Felder, die er betreten kann, sollen in dem String S$ gespeichert werden



Procedure.s Suchpfad(a,b)
  Protected jx, S$
  S$=""
  
  ;/ Wiederholender Teil
  jx=1
  While jx<(XGrenze-1)
    If (a+jx)<XGrenze
      If CB(a+jx,b+0)=" " 
        S$+Str(1*jx)+",0;"
      Else 
        Break
      EndIf 
    EndIf 
    jx+1
  Wend 
  S$+Str(1*jx)+",0;"
  ;/
  
  jx=1
  
  While jx<(XGrenze-1)
    If (a-jx)>0
      If CB(a-jx,b+0)=" " 
        S$+Str(-1*jx)+",0;"
      Else 
        Break
      EndIf 
    EndIf 
    jx+1
  Wend
  
  S$+Str(-1*jx)+",0;"
  
  jx=1
  
  While jx<(YGrenze-1)
    If (b-jx)>0
      If CB(a,b-jx)=" " 
        S$+"0,"+Str(-1*jx)+";"
      Else 
        Break
      EndIf 
    EndIf 
    jx+1
  Wend
  
  S$+"0,"+Str(-1*jx)+";"
  
  jx=1
  
  While jx<(YGrenze-1)
    If (b+jx)<YGrenze
      If CB(a,b+jx)=" " 
        S$+"0,"+Str(1*jx)+";"
      Else 
        Break
      EndIf 
    EndIf 
    jx+1
  Wend
  
  S$+"0,"+Str(1*jx)+";"
  
  
  ProcedureReturn S$
EndProcedure
a, b soll die Position sein an der gestartet wird

Unser Spieler kann waagerecht und senkrecht gehen, bis ein Hindernis auftaucht. Alle Möglichen Felder, die er betreten kann, sollen in dem String S$ gespeichert werden

Nun meine Frage, wie kann man die Überprüfung zusammenfassen, dass man den wiederholenden Teil nicht viermal schreiben muss?

Dank euch. :allright:

Verfasst: 25.01.2008 21:40
von STARGÅTE
Du machst dir n Außere Schleife die so läuft :

For n = 0 to 270 Step 90

und erhälst dann dein x bzw y mit :
x = cos(w*#PI/180)
y = sin(w*#PI/180)

dann baust, du nur in deine eine Schleife beide x,y Version in eine zusammen fassen und fertig

EDIT: ich versuche es mal umzuschreiben, dauert kurz....

Habe deine 2 X Varianten zu einer zusammengefasst:
For w = 0 To 1
  ;/ Wiederholender Teil 
  Wechsel = Int(Cos(w*#PI))
  jx=1 
  While jx<(XGrenze-1) 
    If (a+jx*Wechsel)*Wechsel < Wechsel*XGrenze/2+XGrenze/2
      If CB(a+jx*Wechsel,b+0)=" " 
        S$+Str(Wechsel*jx)+",0;" 
      Else 
        Break 
      EndIf 
    EndIf 
    jx+1 
  Wend 
  S$+Str(Wechsel*jx)+",0;" 
  ;/ 
 Next
EDIT2:
Da der Code irgendwie verbug ist ... musst du erst mal alles richtig machen.
Der Hintergrund von Sin/Cos ist das
1. immer einer der beiden 0 ist und somit sein "Anhang" nicht in die berechnung fällt.
2. Anderer Seits immer zwischen 1 und -1 schwankt sodass du zweimal die X und zweimal die Y Variante in eine Schmeißen kannst, die dann jedoch komplexer ist