@cramer, post #1
@asman, post #3
@cramer, post #1
; declare variables MAPWIDTH=10 MAPHEIGHT=10 ; create needed arrays Dim WALKABILITY(MAPWIDTH,MAPHEIGHT) Dim OPENLIST(MAPWIDTH*MAPHEIGHT) Dim OPENX(MAPWIDTH*MAPHEIGHT) Dim OPENY(MAPWIDTH*MAPHEIGHT) Dim PARX(MAPWIDTH,MAPHEIGHT) Dim PARY(MAPWIDTH,MAPHEIGHT) Dim FCOST(MAPWIDTH*MAPHEIGHT) Dim GCOST(MAPWIDTH,MAPHEIGHT) Dim HKOST(MAPWIDTH*MAPHEIGHT) Dim PATHLENGTH(1) Dim PATHLOCATION(1) ; declare constants #ONOPENLIST=1 #ONCLOSEDLIST=2 #ONNEITHERLIST=0 #NOTFINISHED=0 #FOUND=1 #NONEXISTENT=2 #WALKABLE=0 #UNWALKABLE=1 ; Main Program WALKABILITY(0,0)=0 : WALKABILITY(0,1)=0 : WALKABILITY(0,2)=0 : WALKABILITY(0,3)=0 WALKABILITY(1,0)=1 : WALKABILITY(1,1)=0 : WALKABILITY(1,2)=0 : WALKABILITY(1,3)=1 WALKABILITY(2,0)=1 : WALKABILITY(2,1)=1 : WALKABILITY(2,2)=0 : WALKABILITY(2,3)=0 PATHFINDERID=1 STRTX=0 STRTY=0 TARGETX=7 TARGETY=9 NODIAGONAL=True JSR FINDPATH Print PATH PATHFINDERID=1 JSR PATHREAD End .FINDPATH Dim LISTARRAY(MAPWIDTH,MAPHEIGHT) PATHLENGTH(PATHFINDERID)=#NOTFINISHED PATHLOCATION(PATHFINDERID)=1 OPENLISTITEMS=1 OPENLIST(1)=1 OPENX(1)=STRTX : OPENY(1)=STRTY GCOST(STRTX,STRTY)=0 Repeat If OPENLISTITEMS<>0 PARXVAL=OPENX(OPENLIST(1)) : PARYVAL=OPENY(OPENLIST(1)) LISTARRAY(PARXVAL,PARYVAL)=#ONCLOSEDLIST OPENLISTITEMS=OPENLISTITEMS-1 OPENLIST(1)=OPENLIST(OPENLISTITEMS+1) V=1 Repeat U=V If 2*U<=OPENLISTITEMS If FCOST(OPENLIST(U))>=FCOST(OPENLIST(2*U)) : V=2*U : EndIf EndIf If 2*U+1<=OPENLISTITEMS If FCOST(OPENLIST(V))>=FCOST(OPENLIST(2*U+1)) : V=2*U+1 : EndIf EndIf If U<>V TEMP=OPENLIST(U) OPENLIST(U)=OPENLIST(V) OPENLIST(V)=TEMP Else Pop Repeat EndIf Until qw=12 For B=PARYVAL-1 To PARYVAL+1 For A=PARXVAL-1 To PARXVAL+1 If A<>-1 AND B<>-1 AND A<>MAPWIDTH AND B<>MAPHEIGHT If LISTARRAY(A,B)<>#ONCLOSEDLIST If WALKABILITY(A,B)=#WALKABLE CORNER=#WALKABLE If A=PARXVAL-1 If B=PARYVAL-1 If NODIAGONAL CORNER=#UNWALKABLE Else If WALKABILITY(PARXVAL-1,PARYVAL)=#UNWALKABLE OR WALKABILITY(PARXVAL,PARYVAL-1)=#NWALKABLE CORNER=#UNWALKABLE EndIf EndIf Else If B=PARYVAL+1 If NODIAGONAL CORNER=#UNWALKABLE Else If WALKABILITY(PARXVAL,PARYVAL+1)=#UNWALKABLE OR WALKABILITY(PARXVAL-1,PARYVAL)=#UNWALKABLE CORNER=#UNWALKABLE EndIf EndIf EndIf Else If A=PARXVAL+1 If B=PARYVAL-1 If NODIAGONAL CORNER=#UNWALKABLE Else If WALKABILITY(PARXVAL,PARYVAL-1)=#UNWALKABLE OR WALKABILITY(PARXVAL+1,PARYVAL)=#UNWALKABLE CORNER=#UNWALKABLE EndIf EndIf Else If B=PARYVAL+1 If NODIAGONAL CORNER=#UNWALKABLE Else If WALKABILITY(PARXVAL+1,PARYVAL)=#UNWALKABLE OR WALKABILITY(PARXVAL,PARYVAL+1)=#UNWALKABLE CORNER=#UNWALKABLE EndIf EndIf EndIf EndIf If CORNER=#WALKABLE If LISTARRAY(A,B)<>#ONOPENLIST SQUARESCHECKED=SQUARESCHECKED+1 M=OPENLISTITEMS+1 OPENLIST(M)=SQUARESCHECKED OPENX(OPENLIST(M))=A : OPENY(OPENLIST(M))=B If Abs(A-PARXVAL)=1 AND Abs(B-PARYVAL)=1 If NODIAGONAL=False AGCOST=14 Else AGCOST=150000 EndIf Else AGCOST=10 EndIf GCOST(A,B)=GCOST(PARXVAL,PARYVAL)+AGCOST HKOST(OPENLIST(M))=10*(Abs(A-TARGETX)+Abs(B-TARGETY)) FCOST(OPENLIST(M))=GCOST(A,B)+HKOST(OPENLIST(M)) PARX(A,B)=PARXVAL : PARY(A,B)=PARYVAL While M<>1 If FCOST(OPENLIST(M))<=FCOST(OPENLIST(M/2)) TEMP=OPENLIST(M/2) ; MOZNA ZAMIENIC NA TEMP=OPENLIST(M LSR 1) OPENLIST(M/2)=OPENLIST(M) OPENLIST(M)=TEMP M=M/2 ; MOZNA ZAMIENIC NA M = M LSR 1 Else Pop Repeat ; CO TO JEST? NIE WIEM EndIf Wend OPENLISTITEMS=OPENLISTITEMS+1 LISTARRAY(A,B)=#ONOPENLIST Else If Abs(A-PARXVAL)=1 AND Abs(B-PARYVAL)=1 If NODIAGONAL=False AGCOST=14 Else AGCOST=150000 EndIf Else AGCOST=10 EndIf TEMPGCOST=GCOST(PARXVAL,PARYVAL)+AGCOST If TEMPGCOST<GCOST(A,B) PARX(A,B)=PARXVAL PARY(A,B)=PARYVAL GCOST(A,B)=TEMPGCOST If LISTARRAY(A,B)=#ONOPENLIST For X=1 To OPENLISTITEMS If OPENX(OPENLIST(X))=A AND OPENY(OPENLIST(X))=B FCOST(OPENLIST(X))=GCOST(A,B)+HKOST(OPENLIST(X)) M=X While M<>1 If FCOST(OPENLIST(M))<FCOST(OPENLIST(M/2)) TEMP=OPENLIST(M/2) ; TEMP = OPENLIST(M LSR 1) OPENLIST(M/2)=OPENLIST(M) ; OPENLIST (M LSR 1) = OPENLIST (M) OPENLIST(M)=TEMP M=M/2 ; M = M LSR 1 Else Pop Repeat EndIf Wend Pop Repeat EndIf Next EndIf EndIf EndIf EndIf EndIf EndIf EndIf Next Next Else PATH=#NONEXISTENT Pop Repeat EndIf If LISTARRAY(TARGETX,TARGETY)=#ONOPENLIST Then PATH=#FOUND Pop Repeat Forever If PATH=#FOUND PATHX=TARGETX : PATHY=TARGETY Repeat TEMPX=PARX(PATHX,PATHY) PATHY=PARY(PATHX,PATHY) PATHX=TEMPX PATHLENGTH(PATHFINDERID)=PATHLENGTH(PATHFINDERID)+1 Until PATHX=STRTX AND PATHY=STRTY Reserve PATHFINDERID,PATHLENGTH(PATHFINDERID)*4+30 ; PATHFINERID.l = AllocMem_ (PATHLENGTH(PATHFINDERID) LSL 2 +30 , 0) ; Reserve As Work PATHFINDERID,PATHLENGTH(PATHFINDERID)*4+30 BANKADDR=Start(PATHFINDERID) PATHX=TARGETX : PATHY=TARGETY CELLPOSITION=PATHLENGTH(PATHFINDERID)*4 ; CELLPOSITION=PATHLENGTH(PATHFINDERID) LSL 2 While NOT(PATHX=STRTX AND PATHY=STRTY) Poke BANKADDR+CELLPOSITION,PATHX Poke BANKADDR+CELLPOSITION+2,PATHY CELLPOSITION=CELLPOSITION-4 TEMPX=PARX(PATHX,PATHY) PATHY=PARY(PATHX,PATHY) PATHX=TEMPX Wend Poke BANKADDR,STRTX Poke BANKADDR+2,STRTY EndIf ; CO DALEJ??? RTS .PATHREAD PATHLOCATION(PATHFINDERID)=1 BANKADDR=Start(PATHFINDERID) While PATHLOCATION(PATHFINDERID)<=PATHLENGTH(PATHFINDERID) A=Peek(BANKADDR+PATHLOCATION(PATHFINDERID)*4) B=Peek(BANKADDR+PATHLOCATION(PATHFINDERID)*4+2) PATHLOCATION(PATHFINDERID)=PATHLOCATION(PATHFINDERID)+1 Print "X:";A;" Y:";B Wend Erase PATHFINDERID RTS
@cramer, post #1
Wywali mi komunikaty o braku END IF po IF
zrezygnowałem z procedur na rzecz etykiet i podprogramów
@diobou, post #7
@cramer, post #10
ZMIENNA.b = 100 Statement ZWIEKSZ_O_1{wskaznik.l} A.b = Peek.b(wskaznik) A = A+1 Poke.b wskaznik,A End Statement ZWIEKSZ_O_1 {&ZMIENNA} NPrint ZMIENNA
@cramer, post #13
@asman, post #16
@cramer, post #8
DO tego sama obsługa procedur (że muszą być na początku kodu itd)
@diobou, post #18
@tukinem, post #15
@tukinem, post #23
@Don_Adan, post #24
@tukinem, post #25
@Don_Adan, post #26
@tukinem, post #27
@Don_Adan, post #28