|
画面表示を変えてみました。
3マス先までを表示
PUBLIC NUMERIC XSIZE,YSIZE,XS(4),YS(4),LOC,HELP,LT,FL,XX,YY,TI,TY,MX,MY,LL
LET XSIZE=700
LET YSIZE=700
CALL GINIT(XSIZE,YSIZE)
LET M=40
LET N=40
LET HELP=3
LET LOC=2
LET XA=XSIZE/2-175
LET XB=XSIZE/2+175
LET YA=50
LET YB=400
DIM MAP(0 TO 2*M,0 TO 2*N)
FOR I=1 TO 4
READ XS(I),YS(I)
NEXT I
DATA 0,-1
DATA -1,0
DATA 0,1
DATA 1,0
CALL MAKEMAZE(MAP,M,N)
IF MAP(1,1)<>0 OR MAP(2*M-1,2*N-1)<>0 THEN STOP
LET TY=INT(TIME)
DO
LOOP WHILE TY=INT(TIME)
LET TY=INT(TIME)
LET XX=1
LET YY=1
IF MAP(1,2)=0 THEN LET R=3
IF MAP(2,1)=0 THEN LET R=4
DO
SET VIEWPORT XA/XSIZE,XB/XSIZE,(YSIZE-YB)/YSIZE,(YSIZE-YA)/YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
CALL BOXFULL(0,0,XSIZE,YSIZE,0)
CALL 壁
FOR I=0 TO 3 !'MAPデータ走査,画面表示(3マス先まで)
SELECT CASE R
CASE 1
IF YY-I-1>=0 THEN LET P0=MAP(XX,YY-1-I) ELSE LET P0=7
IF XX-1>=0 AND YY-I>=0 THEN LET L0=MAP(XX-1,YY-I) ELSE LET L0=7
IF XX+1<=2*M AND YY-I>=0 THEN LET R0=MAP(XX+1,YY-I) ELSE LET R0=7
CASE 2
IF XX-I-1>=0 THEN LET P0=MAP(XX-I-1,YY) ELSE LET P0=7
IF YY+1<=2*N AND XX-I>=0 THEN LET L0=MAP(XX-I,YY+1) ELSE LET L0=7
IF YY-1>=0 AND XX-I>=0 THEN LET R0=MAP(XX-I,YY-1) ELSE LET R0=7
CASE 3
IF YY+I+1<=2*N THEN LET P0=MAP(XX,YY+I+1) ELSE LET P0=7
IF XX+1<=2*M AND YY+I<=2*N THEN LET L0=MAP(XX+1,YY+I) ELSE LET L0=7
IF XX-1>=0 AND YY+I<=2*N THEN LET R0=MAP(XX-1,YY+I) ELSE LET R0=7
CASE 4
IF XX+I+1<=2*M THEN LET P0=MAP(XX+I+1,YY) ELSE LET P0=7
IF XX+I<=2*M AND YY-1>=0 THEN LET L0=MAP(XX+I,YY-1) ELSE LET L0=7
IF XX+I<=2*M AND YY+1<=2*N THEN LET R0=MAP(XX+I,YY+1) ELSE LET R0=7
END SELECT
IF P0<>7 AND L0<>7 THEN CALL 左折路(I)
IF P0<>7 AND R0<>7 THEN CALL 右折路(I)
IF P0=7 AND L0<>7 AND R0<>7 THEN
CALL T字路(I)
EXIT FOR
ELSEIF P0=7 AND L0<>7 AND R0=7 THEN
CALL 左曲がり(I)
EXIT FOR
ELSEIF P0=7 AND R0<>7 AND L0=7 THEN
CALL 右曲がり(I)
EXIT FOR
ELSEIF P0=7 AND L0=7 AND R0=7 THEN
CALL 行き止まり(I)
EXIT FOR
END IF
NEXT I
CALL BOX(0,0,XSIZE,YSIZE,2)
SET VIEWPORT 0,1,0,1
SET WINDOW 0,XSIZE-1,YSIZE-1,0
CALL DISPLOC
IF LOC=0 AND FM=0 THEN
CALL BOXFULL(0,YSIZE-150,150,YSIZE,0)
LET FM=1
END IF
CALL DISPTIME
IF XX=2*M-1 AND YY=2*N-1 THEN !'ゴール到達
SET TEXT HEIGHT 70
SET TEXT COLOR 6
SET TEXT JUSTIFY "LEFT","TOP"
PLOT TEXT ,AT 20,50:"Congratulations"
STOP
END IF
CALL BOXFULL(0,250,160,350,0)
SET TEXT JUSTIFY "LEFT","TOP"
SET TEXT HEIGHT 20
SET TEXT COLOR 7
PLOT TEXT ,AT 0,250:"MAP 残 "&STR$(HELP)
PLOT TEXT ,AT 0,280:"位置 残 "&STR$(LOC)
LET S$=GETKEY$(XSIZE/2,YSIZE-150,100)
IF S$<>"" THEN WAIT DELAY .1
IF S$="4" THEN LET R=R+1
IF S$="6" THEN LET R=R-1
IF S$="2" THEN LET R=R+2
IF R>4 THEN LET R=R-4
IF R<1 THEN LET R=R+4
IF S$="8" AND MAP(XX+XS(R),YY+YS(R))<>7 THEN
LET XX=XX+XS(R)
LET YY=YY+YS(R)
END IF
IF S$="M" AND HELP>0 THEN !'MAP表示
CALL DISPLAYMAP(MAP,M,N,XX,YY)
LET TT=INT(TIME)
DO
LOOP WHILE TT=INT(TIME)
LET TT=INT(TIME)
DO
MOUSE POLL DMX,DMY,LEFT,RIGHT
LOOP UNTIL INT(TIME)-TT>=HELP*4 OR LEFT=1 OR RIGHT=1 !'クリックするか、時間待ち
CLEAR
LET HELP=HELP-1
END IF
IF S$="L" THEN
LET LT=INT(TIME)
LET FL=0
LET LOC=LOC-1
END IF
IF XX<0 THEN LET XX=0
IF YY<0 THEN LET YY=0
IF XX>2*M THEN LET XX=2*M
IF YY>2*N THEN LET YY=2*N
LET MAP(XX,YY)=2 !'足跡を残す(赤色)
LOOP
END
EXTERNAL SUB 壁
LET XM=XSIZE/2
LET YM=YSIZE/2
PLOT LINES:0,0;XM-20,YM-20
PLOT LINES:0,YSIZE;XM-20,YM+20
PLOT LINES:XSIZE,0;XM+20,YM-20
PLOT LINES:XSIZE,YSIZE;XM+20,YM+20
PLOT LINES:XM-20,YM-20;XM-20,YM+20
PLOT LINES:XM+20,YM-20;XM+20,YM+20
END SUB
EXTERNAL SUB 行き止まり(N)
IF N=0 THEN
CALL BOXFULL(0,0,XSIZE,YSIZE,0)
PLOT LINES:0,0;20,20
PLOT LINES:XSIZE,0;XSIZE-20,20
PLOT LINES:XSIZE,YSIZE;XSIZE-20,YSIZE-20
PLOT LINES:0,YSIZE;20,YSIZE-20
PLOT LINES:20,20;XSIZE-20,20;XSIZE-20,YSIZE-20;20,YSIZE-20;20,20
ELSE
LET L=80*N
LET SIZE=-L/8+340/8
CALL BOXFULL(L,0,XSIZE-L,YSIZE,0)
PLOT LINES:L,L;XSIZE-L,L
PLOT LINES:L,YSIZE-L;XSIZE-L,YSIZE-L
PLOT LINES:L,L;L,YSIZE-L
PLOT LINES:XSIZE-L,L;XSIZE-L,YSIZE-L
END IF
END SUB
EXTERNAL SUB T字路(N)
LET L=80*N
LET SIZE=-L/8+340/8
CALL BOXFULL(L,0,XSIZE-L,YSIZE,0)
PLOT LINES:L,L+SIZE;XSIZE-L,L+SIZE
PLOT LINES:L,YSIZE-L-SIZE;XSIZE-L,YSIZE-L-SIZE
PLOT LINES:L,L;L,YSIZE-L
PLOT LINES:XSIZE-L,L;XSIZE-L,YSIZE-L
END SUB
EXTERNAL SUB 右曲がり(N)
LET R=XSIZE-N*80
LET SIZE=R/8-260/8
CALL BOXFULL(R,0,XSIZE-R+SIZE,YSIZE,0)
PLOT LINES:R,R-SIZE;XSIZE-R+SIZE,R-SIZE
PLOT LINES:R,YSIZE-R+SIZE;XSIZE-R+SIZE,YSIZE-R+SIZE
PLOT LINES:R,R;R,YSIZE-R
PLOT LINES:XSIZE-R+SIZE,YSIZE-R+SIZE;XSIZE-R+SIZE,R-SIZE
END SUB
EXTERNAL SUB 左曲がり(N)
LET L=N*80
LET SIZE=-L/8+340/8
CALL BOXFULL(L,0,XSIZE-L-SIZE,YSIZE,0)
PLOT LINES:L,L+SIZE;XSIZE-L-SIZE,L+SIZE
PLOT LINES:L,YSIZE-L-SIZE;XSIZE-L-SIZE,YSIZE-L-SIZE
PLOT LINES:L,L;L,YSIZE-L
PLOT LINES:XSIZE-L-SIZE,YSIZE-L-SIZE;XSIZE-L-SIZE,L+SIZE
END SUB
EXTERNAL SUB 左折路(N)
LET L=N*80
LET SIZE=-L/8+340/8
CALL BOXFULL(L,0,L+SIZE,YSIZE,0)
PLOT LINES:L,L;L,YSIZE-L
PLOT LINES:L,L+SIZE;L+SIZE,L+SIZE
PLOT LINES:L,YSIZE-L-SIZE;L+SIZE,YSIZE-L-SIZE
PLOT LINES:L+SIZE,L+SIZE;L+SIZE,YSIZE-L-SIZE
END SUB
EXTERNAL SUB 右折路(N)
LET R=XSIZE-N*80
LET SIZE=R/8-260/8
CALL BOXFULL(R,0,R-SIZE,YSIZE,0)
PLOT LINES:R,R;R,YSIZE-R
PLOT LINES:R,R-SIZE;R-SIZE,R-SIZE
PLOT LINES:R,YSIZE-R+SIZE;R-SIZE,YSIZE-R+SIZE
PLOT LINES:R-SIZE,YSIZE-R+SIZE;R-SIZE,R-SIZE
END SUB
EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
SET COLOR MIX(0) 0,0,0
SET COLOR MIX(1) 0,0,1
SET COLOR MIX(2) 1,0,0
SET COLOR MIX(3) 1,0,1
SET COLOR MIX(4) 0,1,0
SET COLOR MIX(5) 0,1,1
SET COLOR MIX(6) 1,1,0
SET COLOR MIX(7) 1,1,1
CLEAR
SET LINE COLOR 7
SET AREA COLOR 0
END SUB
EXTERNAL SUB BOXFULL(X1,Y1,X2,Y2,C)
SET AREA COLOR C
PLOT AREA:X1,Y1;X2,Y1;X2,Y2;X1,Y2;X1,Y1
END SUB
EXTERNAL SUB LINE(XS,YS,XE,YE,C)
SET COLOR C
PLOT LINES
PLOT LINES:XS,YS;XE,YE
END SUB
EXTERNAL SUB BOX(XS,YS,XE,YE,C)
CALL LINE(XS,YS,XE,YS,C)
CALL LINE(XE,YS,XE,YE,C)
CALL LINE(XE,YE,XS,YE,C)
CALL LINE(XS,YE,XS,YS,C)
END SUB
EXTERNAL SUB MAKEMAZE(MAP(,),M,N) !'迷路作成
RANDOMIZE
MAT MAP=ZER
LET S=(M-1)*(N-1)
FOR I=0 TO 2*M
LET MAP(I,0)=7
LET MAP(I,2*N)=7
NEXT I
FOR I=0 TO 2*N
LET MAP(0,I)=7
LET MAP(2*M,I)=7
NEXT I
DO
DO
LET X=INT(RND*(M+1))
LET Y=INT(RND*(N+1))
LET X0=X*2
LET Y0=Y*2
LOOP WHILE MAP(X0,Y0)=0
LET R=INT(RND*4)+1
LET XN=X0+XS(R)*2
LET YN=Y0+YS(R)*2
IF XN>0 AND XN<2*M AND YN>0 AND YN<2*N AND MAP(XN,YN)=0 THEN
IF X0=XN THEN
FOR K=Y0 TO YN STEP SGN(YN-Y0)
LET MAP(X0,K)=7
NEXT K
ELSE
FOR K=X0 TO XN STEP SGN(XN-X0)
LET MAP(K,Y0)=7
NEXT K
END IF
LET X0=XN
LET Y0=YN
LET S=S-1
END IF
LOOP WHILE S>0
END SUB
EXTERNAL SUB DISPLAYMAP(MAP(,),M,N,XX,YY)
SET VIEWPORT 0,1,0,1
SET WINDOW 0,XSIZE-1,YSIZE-1,0
CLEAR
FOR I=0 TO 2*N
FOR J=0 TO 2*M
LET C=MAP(J,I)
IF J=XX AND I=YY THEN LET C=4
IF J=2*M-1 AND I=2*N-1 THEN LET C=6
CALL BOXFULL(J*XSIZE/(2*M+1),I*YSIZE/(2*N+1),(J+1)*XSIZE/(2*M+1),(I+1)*YSIZE/(2*N+1),C)
NEXT J
NEXT I
END SUB
EXTERNAL FUNCTION AREA3(X1,Y1,X2,Y2,X3,Y3,PX,PY)
LET T=TRIANGLE(X1,Y1,X2,Y2,X3,Y3)
LET A=TRIANGLE(X1,Y1,X2,Y2,PX,PY)
LET B=TRIANGLE(X2,Y2,X3,Y3,PX,PY)
LET C=TRIANGLE(X1,Y1,X3,Y3,PX,PY)
IF A+B+C=T THEN LET AREA3=-1 ELSE LET AREA3=0
END FUNCTION
EXTERNAL FUNCTION AREA4(X1,Y1,X2,Y2,X3,Y3,X4,Y4,PX,PY)
LET A=AREA3(X1,Y1,X2,Y2,X3,Y3,PX,PY)
IF A<>0 THEN
LET AREA4=-1
EXIT FUNCTION
END IF
LET B=AREA3(X1,Y1,X4,Y4,X3,Y3,PX,PY)
IF B<>0 THEN LET AREA4=-1 ELSE LET AREA4=0
END FUNCTION
EXTERNAL FUNCTION TRIANGLE(X1,Y1,X2,Y2,X3,Y3)
LET TRIANGLE=ABS(X1*Y2+X2*Y3+X3*Y1-X2*Y1-X3*Y2-Y3*X1)/2
END FUNCTION
EXTERNAL FUNCTION GETKEY$(X,Y,SIZE)
SET AREA COLOR 4
SET TEXT COLOR 7
PLOT AREA:X,Y-SIZE;X-SIZE,Y;X,Y+SIZE;X+SIZE,Y
IF HELP>0 THEN PLOT AREA:XSIZE-150,YSIZE-150;XSIZE,YSIZE-150;XSIZE,YSIZE;XSIZE-150,YSIZE
IF LOC>0 THEN PLOT AREA:0,YSIZE-150;150,YSIZE-150;150,YSIZE;0,YSIZE
CALL LINE(X-SIZE/2,Y-SIZE/2,X+SIZE/2,Y+SIZE/2,7)
CALL LINE(X+SIZE/2,Y-SIZE/2,X-SIZE/2,Y+SIZE/2,7)
SET TEXT JUSTIFY "CENTER","HALF"
SET TEXT HEIGHT SIZE/3
LET X1=X-SIZE/2
LET Y1=Y-SIZE/2
LET X2=X1
LET Y2=Y+SIZE/2
LET X3=X+SIZE/2
LET Y3=Y2
LET X4=X3
LET Y4=Y1
PLOT TEXT ,AT X,Y-SIZE/2: "前"
PLOT TEXT ,AT X-SIZE/2,Y: "左"
PLOT TEXT ,AT X+SIZE/2,Y: "右"
PLOT TEXT ,AT X,Y+SIZE/2: "後"
IF HELP>0 THEN PLOT TEXT ,AT XSIZE-75,YSIZE-75:"MAP"
IF LOC>0 THEN
SET TEXT JUSTIFY "LEFT","HALF"
SET TEXT HEIGHT SIZE/4
PLOT TEXT ,AT 0,YSIZE-75:"現在位置"
END IF
SET AREA COLOR 2
SET TEXT JUSTIFY "CENTER","HALF"
LET GETKEY$=""
DO
MOUSE POLL X0,Y0,LEFT,RIGHT
LOOP WHILE LEFT=1 OR RIGHT=1
DO
CALL DISPTIME
CALL DISPLOC
MOUSE POLL X0,Y0,LEFT,RIGHT
LOOP UNTIL LEFT=1 OR RIGHT=1
IF AREA4(X,Y-SIZE,X1,Y1,X,Y,X4,Y4,X0,Y0)<>0 AND LEFT=1 THEN
PLOT AREA :X,Y-SIZE;X1,Y1;X,Y;X4,Y4
PLOT TEXT ,AT X,Y-SIZE/2: "前"
LET GETKEY$="8"
END IF
IF AREA4(X1,Y1,X-SIZE,Y,X2,Y2,X,Y,X0,Y0)<>0 AND LEFT=1 THEN
PLOT AREA :X1,Y1;X-SIZE,Y;X2,Y2;X,Y
PLOT TEXT ,AT X-SIZE/2,Y: "左"
LET GETKEY$="4"
END IF
IF AREA4(X,Y,X2,Y2,X,Y+SIZE,X3,Y3,X0,Y0)<>0 AND LEFT=1 THEN
PLOT AREA :X,Y;X2,Y2;X,Y+SIZE;X3,Y3
PLOT TEXT ,AT X,Y+SIZE/2: "後"
LET GETKEY$="2"
END IF
IF AREA4(X4,Y4,X,Y,X3,Y3,X+SIZE,Y,X0,Y0)<>0 AND LEFT=1 THEN
PLOT AREA :X4,Y4;X,Y;X3,Y3;X+SIZE,Y
PLOT TEXT ,AT X+SIZE/2,Y: "右"
LET GETKEY$="6"
END IF
IF HELP>0 AND AREA4(XSIZE-150,YSIZE-150,XSIZE,YSIZE-150,XSIZE,YSIZE,XSIZE-150,YSIZE,X0,Y0)<>0 AND LEFT=1 THEN
PLOT AREA :XSIZE-150,YSIZE-150;XSIZE,YSIZE-150;XSIZE,YSIZE;XSIZE-150,YSIZE
PLOT TEXT ,AT XSIZE-75,YSIZE-75:"MAP"
LET GETKEY$="M"
END IF
IF LOC>0 AND AREA4(0,YSIZE-150,150,YSIZE-150,150,YSIZE,0,YSIZE,X0,Y0)<>0 AND LEFT=1 THEN
PLOT AREA :0,YSIZE-150;150,YSIZE-150;150,YSIZE;0,YSIZE
SET TEXT JUSTIFY "LEFT","HALF"
PLOT TEXT ,AT 0,YSIZE-75:"現在位置"
LET GETKEY$="L"
END IF
END FUNCTION
EXTERNAL SUB DISPTIME
IF INT(TIME)<>TI THEN
LET TI=INT(TIME)
CALL BOXFULL(XSIZE-150,200,XSIZE,300,0)
SET TEXT COLOR 7
SET TEXT HEIGHT 20
SET TEXT JUSTIFY "LEFT","TOP"
PLOT TEXT ,AT XSIZE-150,200:"経過時間"
PLOT TEXT ,AT XSIZE-100,240:STR$(INT(TIME-TY))&"s"
END IF
END SUB
EXTERNAL SUB DISPLOC
IF INT(TIME)-LT<55 THEN LET C=7 ELSE LET C=2
IF LOC>0 AND INT(TIME)-LT<60 AND (MX<>XX OR MY<>YY OR INT(TIME)-LT<>LL) THEN
SET TEXT COLOR C
SET TEXT HEIGHT 20
SET TEXT JUSTIFY "LEFT","TOP"
CALL BOXFULL(XSIZE-150,40,XSIZE,120,0)
PLOT TEXT ,AT XSIZE-150,40:"現在位置"
PLOT TEXT ,AT XSIZE-120,80:"("&STR$(XX)&","&STR$(YY)&")"
LET MX=XX
LET MY=YY
LET LL=INT(TIME)-LT
END IF
IF INT(TIME)-LT>60 AND FL=0 THEN
CALL BOXFULL(XSIZE-150,0,XSIZE,120,0)
LET FL=1
END IF
END SUB
|
|