// Project: AStarLearning // Created: 2017-09-03 // show all errors SetErrorMode(2) // set window properties SetWindowTitle( "AStarLearning" ) SetWindowSize(1920,1080,0 ) SetWindowAllowResize( 1 ) // allow the user to resize the window // set display properties SetVirtualResolution( 400, 400 ) // doesn't have to match the window SetOrientationAllowed( 1, 1, 1, 1 ) // allow both portrait and landscape on mobile devices SetSyncRate( 60, 0 ) // 30fps instead of 60 to save battery SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders UseNewDefaultFonts( 1 ) // since version 2.0.22 we can use nicer default fonts grid=LoadSprite("grid.png") tilemain=CreateSprite(0) SetSpriteSize(tilemain,32,32) SetSpriteDepth(tilemain,9) SetSpriteColor(tilemain,7,188,248,0) SetSpriteShape(tilemain,2) SetSpriteVisible(tilemain,0) //tile types Type tileset tiletype as integer tilespr as integer tileid as string tiletext as integer tileparent xdist as float ydist as float tileF tileG tileH Ftext Gtext Htext endtype dim tiles[99] as tileset global r global c global x global y //label for open and close list -Unused OpenListLabel=CreateText("Open List") SetTextSize(OpenListLabel,24) SetTextPosition(OpenListLabel,440,0) ClosedListLabel=CreateText("Closed List") SetTextSize(ClosedListLabel,24) SetTextPosition(ClosedListLabel,440,240) global numtileset=0 dim taken[9,9] _resort: sync() numtileset=0 for a = 0 to 9 for b = 0 to 9 taken[a,b] = 0 next b next a //loading all tiles,create label based on ID For r=0 to 9 x=0 y=32*r for c=0 to 9 if GetSpriteExists(tiles[numtileset].tilespr) = 0 tiles[numtileset].tilespr=CloneSprite(tilemain) endif SetSpriteGroup(tiles[numtileset].tilespr,3) SetSpriteVisible(tiles[numtileset].tilespr,1) SetSpriteOffset(tiles[numtileset].tilespr,16,16) SetSpriteShape(tiles[numtileset].tilespr,2) repeat dx = random2(0,9) dy = random2(0,9) if GetRawKeyReleased(27) = 1 then end until taken[dx,dy] = 0 taken[dx,dy] = 1 SetSpritePosition(tiles[numtileset].tilespr,GetSpriteX(grid)+(dx*32),GetSpriteY(grid)+(dy*32)) //set id tiles[numtileset].tileid=str(numtileset) //create text tiles[numtileset].tiletext=CreateText(tiles[numtileset].tileid) //change id to string value SetTextAlignment(tiles[numtileset].tiletext,1) SetTextPosition(tiles[numtileset].tiletext,GetSpriteXByOffset(tiles[numtileset].tilespr),GetSpriteYByOffset(tiles[numtileset].tilespr)) SetTextSize(tiles[numtileset].tiletext,6) CREATEOSTACLES: if random2(1,10) > 8 //if numtileset=5 or numtileset=15 or numtileset=25 or numtileset=35 or numtileset=45 or numtileset=55 or numtileset=46 or numtileset=47 or numtileset=48 or numtileset=58 or numtileset=67//and numtileset=25 and numtileset=35 and numtileset=45 //or numtileset=37 or numtileset=47 or numtileset=57 tiles[numtileset].tiletype=1 SetSpriteColor(tiles[numtileset].tilespr,255,0,0,255) else tiles[numtileset].tiletype=0 SetSpriteColor(tiles[numtileset].tilespr,0,255,255,255) endif //for the next column x=x+32 numtileset=numtileset+1 next Next resrt = 0 tile = GetSpriteHitGroup(3,48,176) for a = 1 to numtileset-1 if tiles[a].tilespr = tile if tiles[a].tiletype=1 resrt = 1 exit endif endif next a if resrt = 0 tile = GetSpriteHitGroup(3,304,48) for a = 1 to numtileset-1 if tiles[a].tilespr = tile if tiles[a].tiletype=1 resrt = 1 exit endif endif next a endif if resrt = 1 then goto _resort //start point global Source if GetSpriteExists(Source) = 0 Source=LoadSprite("start.png") endif SetSpriteDepth(Source,0) SetSpriteSize(Source,32,32) //SetSpriteColor(Source,32,253,3,255) SetSpritePosition(Source,32,160) SetSpriteOffset(Source,16,16) //end point global Dest if GetSpriteExists(Dest) = 0 Dest=LoadSprite("end.png") endif SetSpriteDepth(Dest,0) SetSpriteSize(Dest,32,32) SetSpriteColor(Dest,253,179,3,255) SetSpritePosition(Dest,288,32) global currentnode global startnode global finalnode global tracenode dim openlist[] dim closedlist[] dim distancelist[] dim shortestpath[] global copythis getH() //get H value tiles to dest when map load //determine starting,current and final node for i=0 to 99 distx#=abs(GetSpriteXByOffset(Source)-GetSpriteXByOffset(tiles[i].tilespr)) disty#=abs(GetSpriteYByOffset(Source)-GetSpriteYByOffset(tiles[i].tilespr)) if distx#<3 and disty#<3 currentnode=i startnode=i index=closedlist.find(i) if index=-1 closedlist.insertsorted(i) endif tiles[i].tileparent=i endif distx#=abs(GetSpriteXByOffset(Dest)-GetSpriteXByOffset(tiles[i].tilespr)) disty#=abs(GetSpriteYByOffset(Dest)-GetSpriteYByOffset(tiles[i].tilespr)) if distx#<3 and disty#<3 finalnode=i tracenode=i shortestpath.insert(finalnode) endif next global index global index1 repeat Print("click to find path") sync() until GetPointerReleased() repeat sync() until GetPointerReleased() = 0 do if GetPointerReleased() then goto _resort if currentnode<>finalnode distancelist.length=-1 For i=0 to 99 //i equall tiles id indexopenlist=openlist.find(i) indexclosedlist=closedlist.find(i) if tiles[i].tiletype=1 or i=currentnode or indexclosedlist<>-1 //unpassable/not current node/not in closedlist continue endif //To up if SpriteRayCastSingle(tiles[i].tilespr,GetSpriteXByOffset(tiles[currentnode].tilespr),GetSpriteYByOffset(tiles[currentnode].tilespr),getSpriteXByOffset(tiles[currentnode].tilespr),GetSpriteYByOffset(tiles[currentnode].tilespr)-17)=1 if indexopenlist=-1 and indexclosedlist=-1//if picked tile is not on list //Add to open list and parent to current node tiles[i].tileparent=currentnode index=openlist.find(i) openlist.insertsorted(i) SetSpriteColor(tiles[i].tilespr,7,188,248,255) tiles[i].tileG=10+tiles[currentnode].tileG if GetTextExists(tiles[i].Gtext) = 0 tiles[i].Gtext=CreateText(str(tiles[i].tileG)) endif SetTextString(tiles[i].Gtext,str(tiles[i].tileG)) SetTextSize(tiles[i].Gtext,8) SetTextAlignment(tiles[i].Gtext,2) SetTextPosition(tiles[i].Gtext,GetSpriteXByOffset(tiles[i].tilespr)-8,GetSpriteYByOffset(tiles[i].tilespr)+8) tiles[i].tileF=tiles[i].tileG+tiles[i].tileH if GetTextExists(tiles[i].Ftext) = 0 tiles[i].Ftext=CreateText(str(tiles[i].tileF)) endif SetTextString(tiles[i].Ftext,str(tiles[i].tileF)) SetTextSize(tiles[i].Ftext,8) SetTextAlignment(tiles[i].Ftext,2) SetTextPosition(tiles[i].Ftext,GetSpriteXByOffset(tiles[i].tilespr)-6,GetSpriteYByOffset(tiles[i].tilespr)-12) continue elseif indexopenlist<>-1 and indexclosedlist<>-1 if tiles[currentnode].tileG+10-1 and indexclosedlist<>-1 if tiles[currentnode].tileG+10-1 and indexclosedlist<>-1 if tiles[currentnode].tileG+10-1 and indexclosedlist<>-1 if tiles[currentnode].tileG+10