ES-BASIC #15
ブロック崩しゲーム (140行)(コメントのみの行も数えています)
- これは ES-BASIC ver.0.1d以降でしか動きません。
- ver.0.1cまでにはバグがあってGPRINTS命令がうまく動かないのです。
- パッドはカーソルキーで動かします。左右に動くのはもちろんですが、上下にも動きます。
- これでボールをブロックと壁の隙間に閉じ込めることができて、それが成功するとかなり気持ちがいいです!
- 100点ごとにパッドが短くなります(=徐々に難しくなります)。
1000 OPENWIN 640,480
1010 ARY INT NEW COL[6]; ARY INT COL[0...]={0XBF0000,0XBFBF00,0X00BF00,0X00BFBF,0X0000BF,0XBF00BF}
1020 ARY INT NEW C[40*30]; // index=y*40+x
1025 ALIAS FILLRECT:FILLRECT0
1030 DOLOOP
1040 ML=10
1050 SCORE=0
1060 LABEL RELOAD
1070 BLOCKS=0
1080 FILLRECT 640,480,0,0,0
1090 BX=19; BY=20; VX=1; VY=_1; MX=15; MY=29
1100 I1=40*30; FORNE I=0,I1
1110 C[I]=0
1120 NEXT
1130 FORNE I=0,40
1140 C[1*40+I]=1
1150 NEXT
1160 FILLRECT 640,16,0,16,7
1170 FORNE J=2,30
1180 C[J*40+ 0]=1
1190 C[J*40+39]=1
1200 NEXT
1210 FILLRECT 16,448, 0,32,7
1220 FILLRECT 16,448,624,32,7
1230 //
1240 FORNE I=0,6
1250 I4=I+4
1260 T=COL[I]; FILLRECT 608-128,16,16+64,I4*16,T+0X1000000
1270 FORNE J=5,34,2
1280 C[I4*40+J+0]=8-I
1290 C[I4*40+J+1]=8-I
1300 FILLRECT 32, 1,J*16 ,I4*16+15,0
1310 FILLRECT 1,16,J*16+31,I4*16 ,0
1320 FILLRECT 32, 1,J*16 ,I4*16 ,7
1330 FILLRECT 1,16,J*16 ,I4*16 ,7
1340 BLOCKS=BLOCKS+1
1350 NEXT
1360 NEXT
1370 FILLOVAL 16,16,BX*16,BY*16,7
1380 FILLRECT ML*16,16,MX*16,MY*16,7
1390 EWAIT 500
1400 //
1410 PH=1; DOLOOP
1420 PH=PH^1
1430 S100=SCORE/100
1440 IF HIGH<SCORE THEN HIGH=SCORE; FI
1450 //
1460 FILLRECT 640,16,0,0,0
1470 GPRINTS 160,0,"SCORE: HIGH:",7,0
1480 GPRINTI 6*8+160,0,5,SCORE
1490 GPRINTI 21*8+160,0,5,HIGH
1500 //
1510 // ball
1520 IF PH!=0 GOTO SKIP
1530 FILLRECT 16,16,BX*16,BY*16,0
1540 C[BY*40+BX]=0
1550 T=0
1560 S=C[BY*40+BX+VX]; IF S==2 THEN T=1; FI
1570 S=C[(BY+VY)*40+BX]; IF S==2 THEN T=1; FI
1580 S=C[(BY+VY)*40+BX+VX]; IF S==2 THEN T=1; FI
1590 IF T!=0 THEN SCORE=SCORE+29-BY; FI
1600 T=C[BY*40+BX+VX];IF T>=3 THEN
1610 I=BX+VX; J=BY
1620 T=C[J*40+I]; SCORE=SCORE+T-2
1630 IF (I&1)==0 THEN I=I-1; FI
1640 FILLRECT 32,16,I*16,J*16,0
1650 VX=VX*_1
1660 C[J*40+I]=0;
1670 C[J*40+I+1]=0
1680 BLOCKS=BLOCKS-1
1690 FI
1700 T=C[(BY+VY)*40+BX];IF T>=3 THEN
1710 I=BX; J=BY+VY
1720 T=C[J*40+I]; SCORE=SCORE+T-2
1730 IF (I&1)==0 THEN I=I-1; FI
1740 FILLRECT 32,16,I*16,J*16,0
1750 VY=VY*_1
1760 C[J*40+I]=0;
1770 C[J*40+I+1]=0
1780 BLOCKS=BLOCKS-1
1790 FI
1800 T=C[(BY+VY)*40+BX+VX];IF T>=3 THEN
1810 I=BX+VX; J=BY+VY
1820 T=C[J*40+I]; SCORE=SCORE+T-2
1830 IF (I&1)==0 THEN I=I-1; FI
1840 FILLRECT 32,16,I*16,J*16,0
1850 VX=VX*_1; VY=VY*_1
1860 C[J*40+I]=0;
1870 C[J*40+I+1]=0
1880 BLOCKS=BLOCKS-1
1890 FI
1900 T=C[BY*40+BX+VX]; IF T!=0 THEN VX=VX*_1; FI
1910 T=C[(BY+VY)*40+BX]; IF T!=0 THEN VY=VY*_1; FI
1920 T=C[(BY+VY)*40+BX+VX]; IF T!=0 THEN VX=VX*_1; VY=VY*_1; FI
1930 T=C[(BY+VY)*40+BX+VX]; IF T==0 THEN
1940 BX=BX+VX
1950 BY=BY+VY
1960 FI
1970 FILLOVAL 16,16,BX*16,BY*16,7
1980 C[BY*40+BX]=1
1990 IF BY>=29 GOTO GAMEOVER
2000 T=SCORE/100; IF T!=S100 THEN IF ML>4 THEN
2010 FILLRECT ML*16,16,MX*16,MY*16,0
2020 FORNE I=0,ML
2030 C[MY*40+MX+I]=0
2040 NEXT
2050 ML=ML-1
2060 FI; FI
2070 //
2080 LABEL SKIP
2090 // pad
2100 FILLRECT ML*16,16,MX*16,MY*16,0
2110 FORNE I=0,ML
2120 C[MY*40+MX+I]=0
2130 NEXT
2140 J=0; K=0
2150 I=EINKEY
2160 IF I==0X1024 THEN J=_1; FI; // left
2170 IF I==0X1025 THEN J= 1; FI; // right
2180 IF I==0X1026 THEN K=_1; FI; // up
2190 IF I==0X1027 THEN IF MY<=28 THEN K=1; FI; FI; // down
2200 CLRKEYBUF
2230 D=0
2240 FORNE I=0,ML
2250 T=C[(MY+K)*40+MX+J+I]; D=D+T
2260 NEXT
2270 IF D==0 THEN
2280 MX=MX+J
2290 MY=MY+K
2300 FI
2310 FILLRECT ML*16,16,MX*16,MY*16,7
2320 FORNE I=0,ML
2330 C[MY*40+MX+I]=2
2340 NEXT
2350 EWAIT 50
2360 IF BLOCKS==0 GOTO RELOAD
2370 ENDDO
2380 LABEL GAMEOVER
2390 KWAIT 10
2400 ENDDO
こめんと欄