ES-BASIC #10

  • (by K, 2019.11.15)

(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
  • http://k.osask.jp/files/esb20190827a.png

(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
  • http://k.osask.jp/files/esb20190827b.png

(12-3) 迷路作成(穴掘り法)

1000 OPENWIN 752,496
1010 CHRBOX 47,31,0,0,1,2
1020 ECHR 1,1,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)>>1; FI; // C+CC==2のときのみD0=1になる
1110       IF X> 1 THEN GETCHR X-1,Y,C; GETCHR X-2,Y,CC; D1=(C+CC)>>1; FI
1120       IF Y<29 THEN GETCHR X,Y+1,C; GETCHR X,Y+2,CC; D2=(C+CC)>>1; FI
1130       IF Y> 1 THEN GETCHR X,Y-1,C; GETCHR X,Y-2,CC; D3=(C+CC)>>1; 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
http://essen.osask.jp/download/esb20191120a.png   http://essen.osask.jp/download/esb20191120b.png
  • 乱数で迷路を作っているので、実行するたびに違う迷路が出てきます。

(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   FILLRECT 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
http://essen.osask.jp/download/esb20191120c.png   http://essen.osask.jp/download/esb20191120d.png   http://essen.osask.jp/download/esb20191120e.png
  • こんな感じにくるくる回ります。
  • このプログラムは、グラフィックウィンドウがアクティブな状態で、何かキーを押すと終了します。

こめんと欄


コメントお名前NameLink

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