ES-BASIC #15

  • (by K, 2019.11.30)

ブロック崩しゲーム (142行)(コメントのみの行も数えています)

  • これは 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
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     IF I!=0 THEN
2210       DOLOOP; ENDDO EINKEY!=0
2220     FI
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   EWAIT 50
2400   I=EINKEY; IF I==32 THEN END; FI; IF I!=10 GOTO GAMEOVER; // spc:end, enter:replay
2410 ENDDO

こめんと欄


コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-11-30 (土) 17:31:17 (7d)