CPUがRISC-Vに換わったIchigoJamの新世代バージョン「IchigoJam R」β版が出荷開始!
IchigoJam 組み立て済完成品 R | Programming Club Network
福野さんのブログ記事はこちら。
IchigoJam BASIC 1.5β1、USBキーボード対応 RISC-V版 IchigoJam Rβ 出荷スタート!
何と言っても「旧バージョンに比べて10倍速い」という動作速度がどんなものか、気になります。
「見せてもらおうか、10倍の速度とやらを!」(笑)
いろいろなプログラムを動かしてみた動画はこちら。
課題1:円描画
三角関数を使って円を描いて塗りつぶします。
IchigoJam Sだと5~6秒、Rでは1秒くらいです。
10 CLV:CLS 20 FOR T=0 TO 359 30 X=COS(T)/12 40 Y=SIN(T)/12 50 DRAW X+32,Y+24 60 NEXT 70 FOR T=0 TO 359 80 X=COS(T)/12 90 Y=SIN(T)/12 100 DRAW 32,24,X+32,Y+24 110 NEXT
課題2:ライフゲーム
有名な生物シミュレーション。ライフ(■)が増えたり減ったりします。
生死のルールは、自分の上下左右斜めの8箇所にあるライフが
- 0~1個…死ぬ
- 2個…そのまま
- 3個…新しく生まれる
- 4~8個…死ぬ
これを全てのドットで計算するので、時間がかかります。
IchigoJam Sだと1世代進むのに約90秒、Rでは10秒くらいです。
1 '*LIFE PC 2 CLV 3 '@RESTART 4 FORZ=50TO97:[Z]=(RND(256)<<8)+RND(256):NEXT:BEEP:GSB27 5 '@LOOP 6 L=0:K=0 7 FORY=0TO23:FORX=0TO31:C=0 8 FORE=-1TO1:FORD=-1TO1 9 U=(X+D)&31 10 V=Y+E:V=V+24*((V<0)-(V>23)) 11 Z=V*2+U/16:M=1<<(U%16) 12 B=[Z]&M:C=C+(B<>0) 13 NEXT:NEXT 14 Z=Y*2+X/16:M=1<<(X%16) 15 B=[Z]&M 16 IFBB=1:C=C-1 17 Q=0 18 IFC=2Q=B 19 IFC=3Q=1 20 IFQ[Z+50]=[Z+50]|M 21 IFB<>QK=1 22 L=L+Q 23 NEXT:NEXT 24 GSB27 25 IFL>0&&K>0GOTO5 26 GOTO3 27 '@PRTLIFE 28 CLS:A=#900 29 FORZ=50TO97:D=[Z]:[Z-50]=D:[Z]=0:FORX=0TO15 30 B=D&1:POKEA,B 31 A=A+1:D=D>>1 32 NEXT:NEXT:RTN
課題3:3Dかわくだり
おなじみのかわくだりゲームが、3Dっぽい視点で遊べます。
105行のWAITは、IchigoJam Sでは「WAIT 0」、Rでは「WAIT 4」にしてください。
Sだとゲームとしてはかなり遅いですが、RではWAIT 4を入れてちょうどいいです。
10 '*Kawakudari 3D 20 CLV:CLS:CLT:X=16:Y=22 30 LC 0,5:FOR I=0 TO 31:?CHR$(140);:NEXT 40 FOR R=0 TO 15 50 LC 15-R,R+6:?CHR$(134) 60 LC 16+R,R+6:?CHR$(137) 70 NEXT 80 IF X=[16] GOTO 190 90 X=X-BTN(28)+BTN(29) 100 LC X,Y:?"O"; 105 WAIT 0 110 [0]=RND(32) 120 COPY #821,#81F,-32 130 FOR R=1 TO 16 140 A=#9D0+R*31:B=R*2:S=[R]*B/32 150 POKE A,0:COPY A+1,A,B-1 160 POKE A+S,42 170 NEXT 180 GOTO 80 190 BEEP 30,30 200 LC X,Y:?"X"; 210 LC 0,0:?TICK()/60
課題4:いちがめ
同じコマ(数字)が2個以上隣り合っている所でスペースキーを押すと、コマが消えて点数が入ります。消えた部分は詰められます。ある程度以上コマを消すとその面はクリアで、次の面ではコマの種類が増えます。
IchigoJam Sだとコマを消す処理でちょっと待たされますが、Rではさくさく動いて快適に遊べます。
1 '*Ichigame for 1.3 2 CLV:LET[91],-1,0,1,0,0,-1,0,1:J=15 3 CLS:L=256:W=J:M=S%7+3:P=0:Q=J 4 FORY=0TOJ:FORX=0TOJ:?RND(M)+1;:NEXT:?:NEXT:GSB10 5 LCP,Q,1:K=INKEY()*2-60:IFABS(K)>4GOTO5 6 IFK=4GSB11:IFL<=M*2BEEP10,30:WAIT99:S=S+1:GOTO3 7 X=P+[K+95]:Y=Q+[K+96]:IFSCR(X,Y)P=X:Q=Y 8 IF!GGOTO5 9 BEEP30,30:LC0,19:END 10 LC0,18:?"Stage:";S;" Score:";T;" Last:";L;" ":RTN 11 U=P:V=Q:N=SCR(U,V):C=0:[C]=U+V*16:H=1:GSB26:IF!CRTN 12 BEEP:B=0 13 B=B+1:U=[B]&15:V=[B]/16:GSB26:IFB<CGOTO13 14 I=C-2:T=T+I*I:L=L-C:GSB10 15 FORB=0TOC:X=[B]&15:FORY=JTO0STEP-1 16 IFSCR(X,Y)=42FORZ=YTO0STEP-1:POKE#900+X+Z*32,SCR(X,Z-1):NEXT:Y=Y+1 17 NEXT:NEXT:IF!LRTN 18 FORX=WTO0STEP-1 19 IFSCR(X,J)ELSEFORY=JTO0STEP-1:LCX,Y:FORZ=XTOW:?CHR$(SCR(Z+1,Y));:NEXT:NEXT:W=W-1 20 NEXT:C=0:H=0 21 FORU=0TOW:FORV=JTO0STEP-1 22 N=SCR(U,V):IF!NGOTO24 23 GSB26:IFCU=W:V=0 24 NEXT:NEXT:IF!CG=1 25 P=0:Q=15:RTN 26 FORD=91TO97STEP2:X=U+[D]:Y=V+[D+1] 27 IFSCR(X,Y)=NC=C+1:[C]=X+Y*16:IFHLCX,Y:?"*" 28 NEXT:RTN
課題5:3D迷路
プログラムはこちらの記事を参照してください。3ファイル使います。
なんちゃって3D迷路 - SHIROのIchigoJam日記
IchigoJam Sだと「がんばって迷路を描いてるな」という感じですが、Rではさくさく移動できて、迷路探索に集中できます。
課題6:横シューティングゲーム
以前に作って、IchigoJam Sではあまりに遅くてお蔵入りしたプログラム。アプリ版やラズパイ版では普通に遊べます。
動画の字幕にも書きましたが、ビームを発射すると、動かしながらビームの数×敵の数だけの当たり判定を毎回するので、全体の動きがかなり遅くなります。プログラムをちょっと見直した方がいいかもしれません。1kバイト目一杯で、これ以上増やせないのですが…
1 '*H Shooting 2 CLV:CLS:?"SCORE 0":X=0:Y=12 3 FORE=14TO22STEP4:GSB8:FORB=3TO9STEP3:IF[B]GSB12 4 NEXT:B=(E-10)/4*3:IF![B]&&BTN(32)GSB11 5 IF[E]GSB15 ELSEIF!RND(30)GSB14 6 NEXT:IF!MGOTO3 7 BEEP30,30:LCX,Y:?"*";:LC7,12:?"GAME OVER":CLK:END 8 U=X-BTN(28)*(X>0)+BTN(29)*(X<30):V=Y-BTN(30)*(Y>1)+BTN(31)*(Y<22) 9 LCX,Y:?CHR$(0);:X=U:Y=V:IFSCR(X,Y)=237M=1:RTN 10 LCX,Y:?CHR$(243);:RTN 11 [B]=1:[B+1]=X+1:[B+2]=Y:LC[B+1],[B+2]:?"-";:RTN 12 C=[B+1]:D=[B+2]:LCC,D:?CHR$(0);:C=C+1:[B+1]=C:IFC>30[B]=0:RTN 13 LCC,D:?"-";:GSB19:RTN 14 [E]=1:[E+1]=30:[E+2]=RND(22)+1:[E+3]=RND(2)*2-1:LC[E+1],[E+2]:?CHR$(237);:RTN 15 F=[E+1]:G=[E+2]:LCF,G:?CHR$(0);:F=F-1:IFF<0[E]=0:RTN 16 G=G+[E+3]:IFG<1ORG>22[E+3]=-[E+3]:CONT 17 [E+1]=F:[E+2]=G:IFX=F&&Y=GM=1:RTN 18 LCF,G:?CHR$(237);:GSB19:RTN 19 K=0:FORI=14TO22STEP4:FORJ=3TO9STEP3:IF[I]&&[J]&&[I+1]=[J+1]&&[I+2]=[J+2]K=I:L=J 20 NEXT:NEXT:IF!KRTN 21 [K]=0:[L]=0:LC[K+1],[K+2]:?"*";:BEEP:S=S+1:LC6,0:?S:LC[K+1],[K+2]:?CHR$(0);:RTN