穴掘り法による迷路ゲームで、毎回固定の全8フロアです。
右下のマスがゴール。
※そこまでボリュームはないですが、セーブ機能はないため暇なときに遊んでください。
'--------------------------------------------
'@#NAME:SAMPLE GAME NO.1
'--------------------------------------------
'<<[!USE STDLIB]>>
'↑この行のみ、動作に影響しますので省かないでください。ほかのコメント行は省略OK
SETBTREPEAT 16
VAR B,I,R,X,Y
VAR BX,BY
VAR GX,GY
VAR OX,OY
VAR PX,PY
VAR SX,SY
VAR NOW_FLOOR
'********************************************
VAR KR
DEF KRANDOMIZE SEED
KR=SEED
END
DEF KRND() 'クロサワ式乱数
KR=KR XOR &H9630
KR=KR-&H6553 AND &HFFFF
KR=((KR<<2) OR (KR>>14)) AND &HFFFF
RETURN KR
END
DEF SRND(M)
RETURN KRND() MOD M
END
'********************************************
ACLS
SPSET 64,304:SPOFS 64,23*16,13*16
DIM MYSP,WALL,ANIMCNT=0,ANIMCHR=0
DIM MVX,MVY
DIM ANIMX=0,ANIMY=0
RESTORE @CHARACTER
READ MYSP,WALL
FOR NOW_FLOOR=1 TO 8
SX=13:SY=8
GOSUB @MAZE
CLS
?NOW_FLOOR;"F"
PX=16:PY=16
SPSET 0,MYSP
SPOFS 0,PX,PY,-1'実際はZ座標は無視
'BGMは未実装なので略
WHILE !GOALCHK()
VSYNC 1
B=BTRIG()
IF ANIMCNT>0 THEN
SPCHR 0,ANIMCHR
INC ANIMX,MVX:INC ANIMY,MVY
SPOFS 0,ANIMX,ANIMY
DEC ANIMCNT
IF ANIMCNT MOD 4==0 THEN INC ANIMCHR
CONTINUE
ENDIF
IF B==0 || ANIMCHK() THEN CONTINUE
OX=PX:PX=PX+(!(4AND B)-!(8AND B))*16
OY=PY:PY=PY+(!(1AND B)-!(2AND B))*16
IF BGGET(1,PX/16,PY/16) THEN PX=OX:PY=OY
IF BGGET(1,OX/16,PY/16) THEN PX=OX:PY=OY
IF BGGET(1,PX/16,OY/16) THEN PX=OX:PY=OY
IF PX==OX && PY==OY THEN CONTINUE
MVX=SGN(PX-OX):MVY=SGN(PY-OY)
IF B AND 2THEN SPCHR 0,MYSP+4
IF B AND 4THEN SPCHR 0,MYSP+8
IF B AND 8THEN SPCHR 0,MYSP
IF B AND 1THEN SPCHR 0,MYSP+12
IF B AND 15 THEN
ANIMCNT=15
ANIMCHR=SPCHR(0)
ANIMX=OX+MVX:ANIMY=OY+MVY'初回分移動量
SPOFS 0,ANIMX,ANIMY
ENDIF
WEND
'BGM(ジングル)は未実装なので略
NEXT
BGCLR 0:BGCLR 1:SPCLR 64:CLS
?"GAME CLEAR!"
?"THANK YOU FOR YOUR PLAYING!"
END
DEF ANIMCHK()
RETURN ANIMCNT!=0
END
DEF GOALCHK()
RETURN !ANIMCHK() && PX==23*16 && PY==13*16
END
DIM TPX,TPY
@MAZE
KRANDOMIZE 17*NOW_FLOOR+16
DIM T[SX*2,SY*2]
DIM P[0]
BX=SRND(8)*2+5
BY=SRND(5)*2+5
FILL T,1
BGCLR 0:BGCLR 1
WHILE 1
IF GET(BX-2,BY)!=1 && GET(BX+2,BY)!=1 && GET(BX,BY-2)!=1 && GET(BX,BY+2)!=1 THEN
IF MAX(P)<0 THEN BREAK
REPEAT
'乱数生成で次アドレス
I=SRND(LEN(P)/2 OR 0)
UNTIL P[I*2]>=0
BX=P[I*2]
BY=P[I*2+1]
P[I*2]=-1
P[I*2+1]=-1
CONTINUE
ENDIF
R=SRND(4)'ほうこうせってい
IF R==0 THEN GX=-1:GY=0
IF R==1 THEN GX=1:GY=0
IF R==2 THEN GX=0:GY=-1
IF R==3 THEN GX=0:GY=1
IF BX+GX<1||BY+GY<1 THEN CONTINUE
IF BX+GX>SX*2-3||BY+GY>SY*2-3 THEN CONTINUE
'注:二次元配列の添字は式を認識しないので変数に代入する
'また、二次元の添字は 宣言 if 代入のどれか以外では認識しない
TPX=BX+GX*2:TPY=BY+GY*2
IF T[TPX,TPY]==1 THEN
T[BX,BY]=0'移動前のマス
INC BX,GX:INC BY,GY:T[BX,BY]=0'途中のマス
INC BX,GX:INC BY,GY:T[BX,BY]=0'移動完了
PUSH P,BX
PUSH P,BY
ENDIF
WEND
FOR Y=0 TO SY*2-2
FOR X=0 TO SX*2-2
B=T[X,Y]
BGPUT 0,X,Y,103
BGPUT 1,X,Y,B*WALL
NEXT
NEXT
RETURN
@CHARACTER
DATA 756 'MY SPRITE
DATA 107 'WALL BG : 163に変えると木になります
DEF GET(X,Y)
IF X>=0 && X<SX*2-1 && Y>=0 && Y<SY*2-1 THEN
RETURN T[X,Y]
ELSE
RETURN 0
ENDIF
END※THENやANDの前後で詰めているのは、そう書いても動くことを確かめる意図的なものです。
特定のキーワードのみピンポイントで省略されたスペースを補うので、基本的にアルファベットの演算子の前後は空けてください。