ES-BASIC #10
(12) ES-BASIC ver.0.1b 向けのプログラム集
- ES-BASICはバージョン0.1bより32bit/64bitの両方に対応しました。
- また書きなおすついでに微妙に仕様が変わったので、今までのプログラムの中にはそのままでは動かないものもあります。
- そういうのを管理するのが面倒なので、ひとまず対応済みのものを全部ここに書くことにします。
(12-1) グラデーション
1000 OPENWIN 256,256
1010 FOR Y=0,255
1020 FOR X=0,255
1030 C=RGBCOL(Y,X,0)
1040 SETPIX X,Y,C
1050 NEXT
1060 NEXT
(12-2) マンデルブロ集合
1010 OPENWIN 512,384
1020 $DI=R07; // R07をプログラム中で使いたいときの慣用句
1030 ALIAS ZX:R01, ZY:R03, XX:R06, YY:R07, CX:R08, CY:R09, N:R10, SN:R11, SX:R12, SY:R13, C:R01
1040 FOR Y=0,383
1050 FOR X=0,511
1060 SN=0
1070 FOR SX=0,3
1080 CX=(X*4+SX)*56+4673536
1090 FOR SY=0,3
1100 CY=(Y*4+SY)*_56-124928
1110 ZX=CX
1120 ZY=CY
1130 FOR N=1,446
1140 XX=ZX*:ZX>>24
1150 YY=ZY*:ZY>>24
1160 IF XX+YY>0X4000000 GOTO SKIP
1170 ZY=ZY*:ZX>>23
1180 ZX=XX+CX-YY
1190 ZY=ZY+CY
1200 NEXT
1210 LABEL SKIP
1220 SN=SN+N
1230 NEXT
1240 NEXT
1250 N=SN>>4; // N=SN/16 (N=0...447)
1260 C=RGBCOL(N,0,0)
1270 IF N>=256 THEN
1280 C=RGBCOL(0,0,0)
1290 IF N<447 THEN
1300 C=RGBCOL(255,N-255,0)
1310 FI
1320 FI
1330 SETPIX X,Y,C
1340 NEXT
1350 LEAPFLUSHWIN 300
1360 NEXT
(12-3) 迷路作成(穴掘り法)
1000 OPENWIN 752,496
1010 CHRBOX 47,31,0,0,1,2; // 画面を緑色(2)の塗りつぶした四角(キャラクタ番号#1)で埋め尽くす
1020 ECHR 1,1,0; // 左上に一つだけ穴をあける(キャラクタ番号#0をおく)
1030 FOR I=0,1000000
1040 X=(RAND%23)*2+1
1050 Y=(RAND%15)*2+1
1060 GETCHR X,Y,C
1070 IF C==0 THEN
1080 DOLOOP; // (X,Y)から掘り進める.
1090 D0=0; D1=0; D2=0; D3=0
1100 IF X<45 THEN GETCHR X+1,Y,C; GETCHR X+2,Y,CC; D0=C*CC; FI; // C==1&&CC==1のときのみD0=1になる
1110 IF X> 1 THEN GETCHR X-1,Y,C; GETCHR X-2,Y,CC; D1=C*CC; FI
1120 IF Y<29 THEN GETCHR X,Y+1,C; GETCHR X,Y+2,CC; D2=C*CC; FI
1130 IF Y> 1 THEN GETCHR X,Y-1,C; GETCHR X,Y-2,CC; D3=C*CC; FI
1140 D=D0+D1+D2+D3
1150 IF D==0 GOTO SKIP; // もう掘り進められない
1160 DD=RAND%D
1170 IF D0!=0 THEN IF DD==0 THEN ECHR X+1,Y,0; X=X+2; FI; DD=DD-1; FI
1180 IF D1!=0 THEN IF DD==0 THEN ECHR X-1,Y,0; X=X-2; FI; DD=DD-1; FI
1190 IF D2!=0 THEN IF DD==0 THEN ECHR X,Y+1,0; Y=Y+2; FI; DD=DD-1; FI
1200 IF D3!=0 THEN IF DD==0 THEN ECHR X,Y-1,0; Y=Y-2; FI; DD=DD-1; FI
1210 ECHR X,Y,0
1220 ENDDO
1230 LABEL SKIP
1240 FI
1250 NEXT
- 乱数で迷路を作っているので、実行するたびに違う迷路が出てきます。
(12-4) キューブ回転
1000 OPENWIN 256,160
1010 ARY INT NEW VERTX[8]; ARY INT VERTX[0...]={ 2,2,2,2,0,0,0,0 }
1020 ARY INT NEW VERTY[8]; ARY INT VERTY[0...]={ 2,2,0,0,2,2,0,0 }
1030 ARY INT NEW VERTZ[8]; ARY INT VERTZ[0...]={ 2,0,2,0,2,0,2,0 }
1040 ARY INT NEW VX[8]; ARY INT NEW VY[8]; ARY INT NEW VZ[8]
1050 ARY INT NEW CENTERZ4[6]
1060 ARY INT NEW SCX[8]; ARY INT NEW SCY[8]
1070 ARY INT NEW BUF0[160]; ARY INT NEW BUF1[160]
1080 ARY INT NEW SQUAR[24]
1090 ARY INT SQUAR[0...]={ 0,4,6,2, 1,3,7,5, 0,2,3,1, 0,1,5,4, 4,5,7,6, 6,7,3,2 }
1100 FOR I=0,7
1110 X=VERTX[I]; VERTX[I]=(X-1)*50
1120 Y=VERTY[I]; VERTY[I]=(Y-1)*50
1130 Z=VERTZ[I]; VERTZ[I]=(Z-1)*50
1140 NEXT
1150 ARY INT NEW COL[6]; ARY INT COL[0...]={ 4,2,6,1,5,3 }
1160 THX=0; THY=0; THZ=0
1170 DOLOOP
1180 THX=(THX+182)&65535
1190 THY=(THY+273)&65535
1200 THZ=(THZ+364)&65535
1210 XP=FF16COS(THX); XA=FF16SIN(THX)
1220 YP=FF16COS(THY); YA=FF16SIN(THY)
1230 ZP=FF16COS(THZ); ZA=FF16SIN(THZ)
1240 FOR I=0,7
1250 S=VERTZ[I]*XP; T=VERTY[I]*XA; ZT=S+T
1260 S=VERTY[I]*XP; T=VERTZ[I]*XA; YT=S-T
1270 S=VERTX[I]*YP; T=YA*:ZT>>16; XT=S+T
1280 S=YP*:ZT>>16; T=VERTX[I]*YA; VZ[I]=S-T
1290 S=ZP*:XT>>16; T=ZA*:YT>>16; VX[I]=S-T
1300 S=ZP*:YT>>16; T=ZA*:XT>>16; VY[I]=S+T
1310 NEXT
1320 L=0; FOR I=0,5
1330 K=SQUAR[L]; S=VZ[K]
1340 K=SQUAR[L+1]; T=VZ[K]; S=S+T
1350 K=SQUAR[L+2]; T=VZ[K]; S=S+T
1360 K=SQUAR[L+3]; T=VZ[K]
1370 CENTERZ4[I]=S+T+0X70000000
1380 L=L+4
1390 NEXT
1400 FILLRECT0 160,160,48,0,0
1410 GOSUB DRAWOBJ
1420 IF EINKEY!=0 THEN END; FI
1430 EWAIT 50
1440 ENDDO
1450 //
1460 LABEL DRAWOBJ
1470 FOR I=0,7
1480 T=(VZ[I]+13107200)>>16; // 400<<16?
1490 T=4915200/T; // 150<<16
1500 S=VX[I]*:T>>16; SCX[I]=(S>>15)+128
1510 S=VY[I]*:T>>16; SCY[I]=(S>>15)+80
1520 NEXT
1530 DOLOOP
1540 MAX=0
1550 FOR K=0,5
1560 T=CENTERZ4[K]
1570 IF MAX<T THEN MAX=T; J=K; FI
1580 NEXT
1590 IF MAX==0 THEN RETURN; FI
1600 I=J*4; CENTERZ4[J]=0
1610 K0=SQUAR[I]
1620 K1=SQUAR[I+1]
1630 K2=SQUAR[I+2]
1640 V0X=VX[K0]; V0Y=VY[K0]
1650 V1X=VX[K1]; V1Y=VY[K1]
1660 V2X=VX[K2]; V2Y=VY[K2]
1670 E0X=V1X-V0X
1680 E0Y=V1Y-V0Y
1690 E1X=V2X-V1X
1700 E1Y=V2Y-V1Y
1710 S=E0X*:E1Y>>16; T=E0Y*:E1X>>16
1720 IF S<=T THEN
1730 GOSUB DRAWPOLY
1740 FI
1750 ENDDO
1760 //
1770 LABEL DRAWPOLY; // obj(j, i:brk)
1780 I1=I+3; K=SQUAR[I1]
1790 P0X=SCX[K]; P0Y=SCY[K]
1800 YMIN=99999; YMAX=0
1810 FOR I=I,I1
1820 K=SQUAR[I]
1830 P1X=SCX[K]; P1Y=SCY[K]
1840 IF YMIN>P1Y THEN YMIN=P1Y; FI
1850 IF YMAX<P1Y THEN YMAX=P1Y; FI
1860 IF P0Y!=P1Y THEN
1870 IF P0Y<P1Y THEN
1880 BUF=BUF0; Y0=P0Y; Y1=P1Y; DX=P1X-P0X; X=P0X
1890 ELSE
1900 BUF=BUF1; Y0=P1Y; Y1=P0Y; DX=P0X-P1X; X=P1X
1910 FI
1920 X=X<<16
1930 DX=DX<<16
1940 T=Y1-Y0; DX=DX/T
1950 IF DX>=0 THEN X=X+0X8000; ELSE X=X-0X8000; FI
1960 FOR Y=Y0,Y1
1970 BUF[Y]=X>>16
1980 X=X+DX
1990 NEXT
2000 FI
2010 P0X=P1X; P0Y=P1Y
2020 NEXT
2030 C=COL[J]
2040 FOR Y=YMIN,YMAX
2050 P0X=BUF0[Y]
2060 P1X=BUF1[Y]
2070 IF P0X<=P1X THEN
2080 FILLRECT0 P1X-P0X+1,1,P0X,Y,C
2090 ELSE
2100 FILLRECT0 P0X-P1X+1,1,P1X,Y,C
2110 FI
2120 NEXT
2130 RETURN
- こんな感じにくるくる回ります。
- このプログラムは、グラフィックウィンドウがアクティブな状態で、何かキーを押すと終了します。
(12-5) メタリックなキューブ回転 (ES-BASIC ver.0.1d以降)
1000 OPENWIN 256,160
1010 ARY INT NEW VERTX[8]; ARY INT VERTX[0...]={ 2,2,2,2,0,0,0,0 }
1020 ARY INT NEW VERTY[8]; ARY INT VERTY[0...]={ 2,2,0,0,2,2,0,0 }
1030 ARY INT NEW VERTZ[8]; ARY INT VERTZ[0...]={ 2,0,2,0,2,0,2,0 }
1040 ARY INT NEW VX[8]; ARY INT NEW VY[8]; ARY INT NEW VZ[8]
1050 ARY INT NEW CENTERZ4[6]
1060 ARY INT NEW SCX[8]; ARY INT NEW SCY[8]
1070 ARY INT NEW BUF0[160]; ARY INT NEW BUF1[160]
1080 ARY INT NEW SQUAR[24]
1090 ARY INT SQUAR[0...]={ 0,4,6,2, 1,3,7,5, 0,2,3,1, 0,1,5,4, 4,5,7,6, 6,7,3,2 }
1100 FOR I=0,7
1110 X=VERTX[I]; VERTX[I]=(X-1)*50
1120 Y=VERTY[I]; VERTY[I]=(Y-1)*50
1130 Z=VERTZ[I]; VERTZ[I]=(Z-1)*50
1140 NEXT
1150 THX=0; THY=0; THZ=0
1160 DOLOOP
1170 THX=(THX+182)&65535
1180 THY=(THY+273)&65535
1190 THZ=(THZ+364)&65535
1200 XP=FF16COS(THX); XA=FF16SIN(THX)
1210 YP=FF16COS(THY); YA=FF16SIN(THY)
1220 ZP=FF16COS(THZ); ZA=FF16SIN(THZ)
1230 FOR I=0,7
1240 S=VERTZ[I]*XP; T=VERTY[I]*XA; ZT=S+T
1250 S=VERTY[I]*XP; T=VERTZ[I]*XA; YT=S-T
1260 S=VERTX[I]*YP; T=YA*:ZT>>16; XT=S+T
1270 S=YP*:ZT>>16; T=VERTX[I]*YA; VZ[I]=S-T
1280 S=ZP*:XT>>16; T=ZA*:YT>>16; VX[I]=S-T
1290 S=ZP*:YT>>16; T=ZA*:XT>>16; VY[I]=S+T
1300 NEXT
1310 L=0; FOR I=0,5
1320 K=SQUAR[L]; S=VZ[K]
1330 K=SQUAR[L+1]; T=VZ[K]; S=S+T
1340 K=SQUAR[L+2]; T=VZ[K]; S=S+T
1350 K=SQUAR[L+3]; T=VZ[K]
1360 CENTERZ4[I]=S+T+0X70000000
1370 L=L+4
1380 NEXT
1390 FILLRECT0 160,160,48,0,0
1400 GOSUB DRAWOBJ
1410 IF EINKEY!=0 THEN END; FI
1420 EWAIT 50
1430 ENDDO
1440 //
1450 LABEL DRAWOBJ
1460 FOR I=0,7
1470 T=(VZ[I]+13107200)>>16; // 400<<16?
1480 T=4915200/T; // 150<<16
1490 S=VX[I]*:T>>16; SCX[I]=(S>>15)+128
1500 S=VY[I]*:T>>16; SCY[I]=(S>>15)+80
1510 NEXT
1520 DOLOOP
1530 MAX=0
1540 FOR K=0,5
1550 T=CENTERZ4[K]
1560 IF MAX<T THEN MAX=T; J=K; FI
1570 NEXT
1580 IF MAX==0 THEN RETURN; FI
1590 I=J*4; CENTERZ4[J]=0
1600 K0=SQUAR[I]
1610 K1=SQUAR[I+1]
1620 K2=SQUAR[I+2]
1630 V0X=VX[K0]; V0Y=VY[K0]
1640 V1X=VX[K1]; V1Y=VY[K1]
1650 V2X=VX[K2]; V2Y=VY[K2]
1660 E0X=V1X-V0X
1670 E0Y=V1Y-V0Y
1680 E1X=V2X-V1X
1690 E1Y=V2Y-V1Y
1700 S=E0X*:E1Y>>16; T=E0Y*:E1X>>16
1710 IF S<=T THEN
1720 V0Z=VZ[K0]; V1Z=VZ[K1]; V2Z=VZ[K2]
1730 E0Z=V1Z-V0Z
1740 E1Z=V2Z-V1Z
1750 S=E0X*:E0X>>16; T=E0Y*:E0Y>>16; S=S+T; T=E0Z*:E0Z>>16; S=S+T
1760 S=FF16SQRT(S); S=0X7FFFFFFF/S; E0X=E0X*:S>>15; E0Y=E0Y*:S>>15
1770 S=E1X*:E1X>>16; T=E1Y*:E1Y>>16; S=S+T; T=E1Z*:E1Z>>16; S=S+T
1780 S=FF16SQRT(S); S=0X7FFFFFFF/S; E1X=E1X*:S>>15; E1Y=E1Y*:S>>15
1790 S=E0Y*:E1X>>16; T=E0X*:E1Y>>16; C=((S-T)*319)>>16
1800 GOSUB DRAWPOLY
1810 FI
1820 ENDDO
1830 //
1840 LABEL DRAWPOLY; // obj(j, c, i:brk)
1850 I1=I+3; K=SQUAR[I1]
1860 P0X=SCX[K]; P0Y=SCY[K]
1870 YMIN=99999; YMAX=0
1880 FOR I=I,I1
1890 K=SQUAR[I]
1900 P1X=SCX[K]; P1Y=SCY[K]
1910 IF YMIN>P1Y THEN YMIN=P1Y; FI
1920 IF YMAX<P1Y THEN YMAX=P1Y; FI
1930 IF P0Y!=P1Y THEN
1940 IF P0Y<P1Y THEN
1950 BUF=BUF0; Y0=P0Y; Y1=P1Y; DX=P1X-P0X; X=P0X
1960 ELSE
1970 BUF=BUF1; Y0=P1Y; Y1=P0Y; DX=P0X-P1X; X=P1X
1980 FI
1990 X=X<<16
2000 DX=DX<<16
2010 T=Y1-Y0; DX=DX/T
2020 IF DX>=0 THEN X=X+0X8000; ELSE X=X-0X8000; FI
2030 FOR Y=Y0,Y1
2040 BUF[Y]=X>>16
2050 X=X+DX
2060 NEXT
2070 FI
2080 P0X=P1X; P0Y=P1Y
2090 NEXT
2100 IF C<256 THEN
2110 C=RGBCOL(C,C,C>>1)
2120 ELSE
2130 C=RGBCOL(255,255,C-128)
2140 FI
2150 FOR Y=YMIN,YMAX
2160 P0X=BUF0[Y]
2170 P1X=BUF1[Y]
2180 IF P0X<=P1X THEN
2190 FILLRECT0 P1X-P0X+1,1,P0X,Y,C
2200 ELSE
2210 FILLRECT0 P0X-P1X+1,1,P1X,Y,C
2220 FI
2230 NEXT
2240 K=SQUAR[I1]; P0X=SCX[K]; P0Y=SCY[K]
2250 FOR I=I1-3,I1
2260 K=SQUAR[I]; P1X=SCX[K]; P1Y=SCY[K]
2270 DRAWLINE0 P0X,P0Y,P1X,P1Y,0
2280 DRAWLINE0 P0X-1,P0Y-1,P1X-1,P1Y-1,0
2290 P0X=P1X; P0Y=P1Y
2300 NEXT
2310 RETURN
(12-6) インベーダゲーム (ES-BASIC ver.0.1d以降)
1000 OPENWIN 324, 228
1010 ARY INT NEW FGHT[384];
1020 ARY INT FGHT[ 0*24...]={0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0}
1030 ARY INT FGHT[ 1*24...]={0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0}
1040 ARY INT FGHT[ 2*24...]={0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0}
1050 ARY INT FGHT[ 3*24...]={0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0}
1060 ARY INT FGHT[ 4*24...]={0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0}
1070 ARY INT FGHT[ 5*24...]={0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0}
1080 ARY INT FGHT[ 6*24...]={0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0}
1090 ARY INT FGHT[ 7*24...]={0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0}
1100 ARY INT FGHT[ 8*24...]={0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0}
1110 ARY INT FGHT[ 9*24...]={0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0}
1120 ARY INT FGHT[10*24...]={0,1,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,1,0}
1130 ARY INT FGHT[11*24...]={0,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,0}
1140 ARY INT FGHT[12*24...]={0,1,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0}
1150 ARY INT FGHT[13*24...]={0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0}
1160 ARY INT FGHT[14*24...]={0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}
1170 ARY INT FGHT[15*24...]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
1180 C=0X00FFFF; FORNE I=0,384; T=FGHT[I]; FGHT[I]=T*C; NEXT
1190 ARY INT NEW INVD[512];
1200 ARY INT INVD[ 0*32...]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
1210 ARY INT INVD[ 1*32...]={0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0}
1220 ARY INT INVD[ 2*32...]={0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0}
1230 ARY INT INVD[ 3*32...]={0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0}
1240 ARY INT INVD[ 4*32...]={0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,1,0}
1250 ARY INT INVD[ 5*32...]={0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,1,0}
1260 ARY INT INVD[ 6*32...]={0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,1,0}
1270 ARY INT INVD[ 7*32...]={0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}
1280 ARY INT INVD[ 8*32...]={0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0}
1290 ARY INT INVD[ 9*32...]={0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0}
1300 ARY INT INVD[10*32...]={0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0}
1310 ARY INT INVD[11*32...]={0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0}
1320 ARY INT INVD[12*32...]={0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0}
1330 ARY INT INVD[13*32...]={0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0}
1340 ARY INT INVD[14*32...]={0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0}
1350 ARY INT INVD[15*32...]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
1360 C=0X00FF00; FORNE I=0,512; T=INVD[I]; INVD[I]=T*C; NEXT
1370 ARY INT NEW INV[6*32]
1380 LABEL RESTART
1390 SCORE=0; PNT=1; MWT0=20; FX=18
1400 LABEL NXTINV
1410 IX=7; IY=1; INVLINE=5
1420 LY=0; LWT=0; MWT=MWT0
1430 IDIR=1; WUNIT=1024
1440 FORNE I=0,6
1450 FORNE J=0,26
1460 T=J%5; INV[I*32+J]=T
1470 NEXT
1480 NEXT
1490 DOLOOP
1500 // 表示
1510 GCLS
1520 GPRINTS 34,2,"SCORE: HIGH:"
1530 GPRINTI 82,2,6,SCORE; GPRINTI 226,2,6,HIGH
1540 BITBLT 24,16,FX*8+2,13*16+2,FGHT
1550 FORNE I=0,6
1560 FORNE J=0,26
1570 T=INV[I*32+J]; IF T==1 THEN
1580 BITBLT 32,16,(IX+J)*8+2,(IY+I)*16+2,INVD
1590 FI
1600 NEXT
1610 NEXT
1620 IF LY!=0 THEN
1630 FILLRECT0 2,14,LX*8+5,LY*16+3,6
1640 FI
1650 ;
1660 // インベーダ全滅判定
1670 DOLOOP
1680 J=0
1690 FORNE I=0,26
1700 T=INV[INVLINE*32+I]
1710 IF T!=0 GOTO SKIP0
1720 NEXT
1730 INVLINE=INVLINE-1
1740 IF INVLINE<0 THEN
1750 T=MWT0/3; MWT0=MWT0-T
1760 EWAIT 1024
1770 GOTO NXTINV
1780 FI
1790 ENDDO
1800 LABEL SKIP0
1810 ;
1820 // wait処理
1830 EWAIT WUNIT
1840 WUNIT=40
1850 LWT=LWT-1
1860 ;
1870 // キー入力
1880 J=0
1890 DOLOOP
1900 I=EINKEY
1910 IF I==0X1024 THEN J=_1; FI
1920 IF I==0X1025 THEN J= 1; FI
1930 IF I==0X1026 THEN I=32; FI
1940 IF I==32 THEN IF LWT<=0 THEN
1950 LWT=15; LX=FX+1; LY=13
1960 FI; FI
1970 ENDDO I>0
1980 ;
1990 // 自機の移動
2000 I=FX+J
2010 IF I>=0 THEN IF I<=37 THEN FX=I; FI; FI
2020 ;
2030 // レーザ移動
2040 IF LY>0 THEN
2050 LY=LY-1
2060 IF LY==0 THEN
2070 PNT=PNT-10
2080 IF PNT<1 THEN PNT=1; FI
2090 FI
2100 FI
2110 ;
2120 // あたり判定
2130 J=LX-IX
2140 K=LY-IY
2150 IF K>=0 THEN IF K<=5 THEN IF J>=0 THEN IF J<=24 THEN
2160 I=INV[K*32+J]
2170 IF I>0 THEN
2180 LY=0; J=J-I
2190 FORNE I=0,6
2200 INV[K*32+J+I]=0
2210 NEXT
2220 SCORE=SCORE+PNT
2230 PNT=PNT+1
2240 IF HIGH<SCORE THEN HIGH=SCORE; FI
2250 FI
2260 FI; FI; FI; FI
2270 ;
2280 // インベーダ移動
2290 IF MWT>0 THEN
2300 MWT=MWT-1
2310 ELSE
2320 MWT=MWT0
2330 IX=IX+IDIR
2340 T=0; IF IX<0 THEN T=1; FI; IF IX>14 THEN T=1; FI; IF T!=0 THEN
2350 IF IY+INVLINE==12 THEN
2360 GPRINTS 122,98,"GAME OVER",4
2370 KWAIT 10
2380 GOTO RESTART
2390 FI
2400 IDIR=IDIR*_1
2410 IY=IY+1
2420 IX=IX+IDIR
2430 FI
2440 FI
2450 ENDDO
こめんと欄