マップ内を移動する2



マップはやはり決まった形をしている方がいいのですが、面倒なのでランダムにします。
ランダムだとほとんど移動できないかもしれませんが、これはあくまでサンプルなので大目に見てください。
※マップを作成するなら拙作「Map Arranger」を使ってみてください(宣伝)
前回よりは見た感じマップらしくなっていると思います。

;マップ内を移動する(移動できる場所と出来ない場所)

#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

ランダムじゃあ運ですよね。運が悪いとまわりが全部囲まれちゃって動けない!!なんて事にもなってしまうでしょうね。 まあそれはこのサンプルの場合なので通常はこうならないように作るべきです。
では変更点を挙げますと、まず初期設定部分はほとんど変更されています。screen命令の前まではマップを作成し、マップ用のバッファにマップを描いています。
そして自分を初期位置設定はランダムになっていて、移動可能場所でなければもう一度というようになっています。
次に*drawmapサブルーチン、これはわずか一行なんですが、初期設定で作成したマップをコピーするようになっています。 いちいちマップチップ一個ずつ描画しているのではかなり速度に支障があるのでこういう一度にコピーするタイプの方が高速になります。
あと*checkkeyサブルーチンでは、判定に移動先が移動可能であるかどうかを判定するのを付け足しています。arrpという変数は、配列指定の中に計算式を用いる事ができないので、 一時的に計算後の数値を格納しています。
作ってみて思ったのですが、ランダムにするんじゃなかったと後悔しております。斜め移動でも出来れば何とかなりますが、必ず移動できない場所は生まれてくるので、やめたほうがいいです。
以前こんな感じのに斜め移動を付けて、HPとか時間制限とかも付けて中学校の文化祭に展示(実際にはそのとき何を作れば思いつかなかったので更に前に作ったもの)したんですが、ダメだったなーと思います。
せめて普通の迷路だったら良かったかも。


前へ 戻る 次へ