;マップ内を移動する(移動できる場所と出来ない場所)
#const tipsize 20 ;マップチップのサイズ
#const movefreq tipsize/4 ;移動時に何ループで行くか(サイズを割りきれるように)
#const movelong tipsize/movefreq;一歩の長さ
#const tipmax 20 ;マップチップの個数
randomize ;乱数初期化
dim mapdate,tipmax,tipmax ;マップデータ
buffer 2,tipsize*tipmax,tipsize*tipmax ;マップ画像用バッファ
repeat tipmax
cnt2=cnt
repeat tipmax
rnd mapdate.cnt.cnt2,2 ;マップデータを1か0をランダムで決定
if mapdate.cnt.cnt2=0 : color ,255 : else : color ,,255
boxf cnt*tipsize,cnt2*tipsize,cnt+1*tipsize,cnt2+1*tipsize
loop
loop
screen 0,tipsize*tipmax,tipsize*tipmax
repeat
rnd jpx,tipmax ;自分のマップチップのマスで数えたx座標
rnd jpy,tipmax ;自分のマップチップのマスで数えたy座標
if mapdate.jpx.jpy=1 : continue ;初期位置が移動不可能な場所ならもう一度
break
loop
jx=jpx*tipsize ;自分の位置の絶対座標x
jy=jpy*tipsize ;自分の位置の絶対座標y
*mainloop ;メインループ
redraw 0
gosub *drawmap
gosub *checkkey
gosub *drawown
redraw
await 1
goto *mainloop
*drawmap ;マップ描画ルーチン
pos 0,0 : gcopy 2,0,0,winx,winy
return
*checkkey ;キー判定ルーチン
if moveflg=0 {
stick key,15,1
if key=1 {
if jpx!0 { ;画面端でなければ
arrp=jpx-1
if mapdate.arrp.jpy=0 { ;移動先が移動可能であれば
jmovex=-movelong ;一回の移動量x
jmovey=0 ;一回の移動量y
moveflg=1 ;移動フラグ
counter=movefreq ;移動する回数
jpx-- ;マップの座標を変更
}
}
}
if key=2 {
if jpy!0 {
arrp=jpy-1
if mapdate.jpx.arrp=0 {
jmovex=0
jmovey=-movelong
moveflg=1
counter=movefreq
jpy--
}
}
}
if key=4 {
if jpx!(tipmax-1) {
arrp=jpx+1
if mapdate.arrp.jpy=0 {
jmovex=movelong
jmovey=0
moveflg=1
counter=movefreq
jpx++
}
}
}
if key=8 {
if jpy!(tipmax-1) {
arrp=jpy+1
if mapdate.jpx.arrp=0 {
jmovex=0
jmovey=movelong
moveflg=1
counter=movefreq
jpy++
}
}
}
}
if moveflg=1 {
jx+jmovex
jy+jmovey
counter-- : if counter=0 : moveflg=0
}
return
*drawown ;自分描画ルーチン
font "",tipsize : color 255 : pos jx,jy : mes "●"
return
|