;自動移動ルート検索プログラム randomize font"MS ゴシック",16 ;フィールドサイズは15*15 dim field,15,15 ;移動ルート探索用ロボット設定 ;相対座標による指定のため無駄にメモリを取っているが ;この方が勝手がいい maxmem=31*31 dim vfield,31,31 ;足跡用仮想フィールド dim rx,maxmem ;検索ロボX座標 dim ry,maxmem ; 〃 Y座標 dim rd,maxmem ; 移動方向 dim rf,maxmem ; 状態フラグ sdim mh,maxmem,maxmem ;移動履歴(実際には最大移動歩数以上取らなくてよい) ; dim dix,4 dim diy,4 dix.0=0,1,0,-1 diy.0=-1,0,1,0 color 128,128,128 boxf 0,0,272,272 color 255,255,255 boxf 16,16,255,255 color 255,0,0 repeat 48 rnd x,15 rnd y,15 pos x*16+16,y*16+16 mes"*" field.x.y=1 loop repeat -1 rnd x,15 rnd y,15 if field.x.y=0 : break loop color 0,0,255 pos x*16+16,y*16+16 mes"●" color 0,0,0 pos 304,4 mes"X:" pos 304,28 mes"Y:" pos 320,0 input gotox pos 320 input gotoy *main pos 320,48 button"GO!",*move stop ;移動処理 *move clrobj 2 if(gotox<0)|(gotox>14)|(gotoy<0)|(gotoy>14)|((gotox=x)&(gotoy=y)): dialog"移動できません":goto *main if field.gotox.gotoy : dialog"移動できません":goto *main color 255,0,255 pos gotox*16+16,gotoy*16+16 mes "○" ;ロボット初期化 repeat maxmem i=cnt rx.i=0 ry.i=0 rd.i=0 rf.i=0 mh.i="" loop vfield.15.15=-1 robos=1 rx.0=0 ry.0=0 rd.0=0 rf.0=2 newrb=1 goal=0 cannot=0 ;仮想フィールド初期化 repeat 31 i=cnt repeat 31 j=cnt a=x+j-15 b=y+i-15 if(a<0)|(a>14)|(b<0)|(b>14): vfield.j.i=-1 : else : vfield.j.i=-field.a.b loop loop ;検索メイン repeat repeat maxmem if goal : break ;無駄なのでやらない i=cnt if rf.i=0 : break ;未使用 if rf.i=3 : continue ;消滅 if rf.i=1 : rf.i=2:continue ;待機 die=1 xx=rx.i yy=ry.i mhb=mh.i repeat 4 ; color 0,255,255 if goal : break ;無駄なのでやらない j=cnt k=j str k v=xx+dix.j w=yy+diy.j a=v+15 b=w+15 ;移動不能か? if(x+v<0)|(x+v>14)|(y+w<0)|(y+w>14): continue if vfield.a.b!0 : continue ;前進なら移動し、そうでなければ新たにロボットを発生させる if j=rd.i : mh.i=mhb+k:rx.i=v:ry.i=w:vfield.a.b=1:die=0:q=i:goto *judge ;十分なメモリを確保してあるので、絶対あってはならない if newrb=maxmem : dialog"メモリが足りません":goto *main robos++ rx.newrb=v ry.newrb=w rf.newrb=1 rd.newrb=j mh.newrb=mhb+k a=v+15 b=w+15 vfield.a.b=1 q=newrb newrb++ *judge ; pos x+v*16+16,y+w*16+16 ; mes"・" ;目的地にたどり着いたか? if(x+v=gotox)&(y+w=gotoy): goal=1 loop ;前進できなければ消滅 await 0 loop if robos<1 : dialog"移動できません":cannot=1:break ;どうやっても移動できない if goal=1 : break loop if cannot=1 : goto *main strlen l,mh.q repeat l strmid m,mh.q,cnt,1 int m color 255,255,255 boxf x*16+16,y*16+16,x*16+31,y*16+31 x+=dix.m y+=diy.m color 0,0,255 pos x*16+16,y*16+16 mes"●" await 50 loop goto *main