SHIROのIchigoJam日記

IchigoJamの電子工作とプログラミングをメインに

いちがめ for 1.3

IchigoJam BASICの新バージョン「1.3.0」が公開されました。
変更点については、福野さんのブログ記事にまとめられています。
fukuno.jig.jp

  • 全体の動作が70%高速化。
  • sakura.ioに対応したネットへのデータ入出力命令が追加。
  • LOCATE命令の第3パラメータでカーソルスイッチが付き、「LOCATE x,y,1」で点滅カーソルを表示。

さっそく新機能のカーソルスイッチを使い、以前作ったコマ消去ゲーム「いちがめ」を、IchigoJam BASIC 1.3用にリメイクしました。
全体に高速・軽量になったので、快適に遊べます(^_^)
f:id:shiro0922:20190128215500p:plain

遊び方

  • 起動すると、16×16=256個の数字コマが表示されます。最初のステージ0はコマが1〜3の3種類です。
  • 反転カーソルをカーソルキーで移動して、同じ数字が縦・横に2個以上つながっている所で、スペースキーを押してください。そのコマが消えて、コマが下へ詰まります。縦1列全てのコマが消えた場合は、右側の列が左へ詰まります。
  • (消したコマ数-2)の2乗がスコアに加算されます。(つまりコマ2個だと消しても0点。コマ数が増えると点数が上昇)
  • 残りコマ数がコマ種類数×2以下(最初は6)になるとステージクリアです。次のステージへ行くと、数字コマが1種類増えます。ステージ6(コマ9種類)をクリアすると、コマ3種類に戻ります。
  • 消せるコマが無くなると、自動的にゲームオーバーになります。

プログラム

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

web版はこちら。体感としては、これが前バージョンのIchigoJam実機での速度の感じです。

ボクシング

FacebookのIchigoJam-FANグループで、ボクシングゲームの話題を書いていた方がいたので、そのアイデアをいただき、シンプルなボクシングゲームを作ってみました。

f:id:shiro0922:20190117023002p:plain

f:id:shiro0922:20190117025759p:plain

  • 起動すると、上側に対戦相手、下側に自分が表示され、試合が始まります。
  • 左右のカーソルキーで左右移動(キーを離すと中央に戻る)、スペースキーでパンチを出します。ただし相手と同じ位置にグローブがある時は、パンチが出せません。
  • パンチがヒットすると、相手の体力が1減ります。
  • 相手の体力が0になれば自分の勝ち、自分の体力が0になると相手の勝ちです。スペースキーを押すとリプレイします。

戦略ですが、ただスペースキーを連打していては勝てません。(スペースキー押しっぱなしではパンチが出ないようになっています)
相手のグローブを抑えつつ、隙を見て左右に動いてパンチを入れて、相手の体力を1ポイントずつ削ってください。防御7・攻撃3くらいの気持ちで行くといいです。

プログラム

(1/18)自分・相手のゲームオーバー処理を共通化して容量を削減。空いた容量でジャンプ先をラベルに。パンチ描画にWAITを入れてIchigoJam実機でも見やすくしました。

1 '*Boxing
2 CLV:VIDEO 5:CLS:G=-1
3 H=10:LC 0,5:?H;
4 I=10:LC 0,0:?I
5 @LOOP
6 X=BTN(29)-BTN(28)
7 GSB @MYPR
8 IF !RND(5) Y=RND(2)*(Y=0)-RND(2)*(Y=0)
9 GSB @ENPR
10 IF BTN(32) AND K!=1 GSB @MYPAN
11 K=BTN(32):IF !RND(3) GSB @ENPAN
12 WAIT 5
13 IF !H G=0
14 IF !I G=5
15 IF G<0 GOTO @LOOP
16 @GOVER
17 LC 3,G:?"WIN!";
18 BEEP 30-G*4,60:WAIT 60
19 IF !BTN(32) CONT
20 RUN
21 @MYPR
22 LC 1+X,3
23 ?CHR$(0,232,0,232,0)
24 LC 1+X,4
25 ?CHR$(0,154,236,155,0)
26 RTN
27 @ENPR
28 LC 1+Y,1
29 ?CHR$(0,152,231,153,0)
30 LC 1+Y,2
31 ?CHR$(0,232,0,232,0)
32 RTN
33 @MYPAN
34 IF ABS(X)=ABS(Y) RTN
35 LC 2+X,2
36 ?CHR$(232,232,232)
37 LC 2+X,3
38 ?CHR$(146,0,146)
39 I=I-1:LC 0,0:?I;" "
40 BEEP:WAIT 3
41 LC 2+X,2
42 ?CHR$(0,232,0)
43 LC 2+X,3
44 ?CHR$(232,0,232)
45 RTN
46 @ENPAN
47 IF ABS(X)=ABS(Y) RTN
48 LC 2+Y,2
49 ?CHR$(146,0,146)
50 LC 2+Y,3
51 ?CHR$(232,232,232)
52 H=H-1:LC 0,5:?H;" ";
53 BEEP:WAIT 3
54 LC 2+Y,2
55 ?CHR$(232,0,232)
56 LC 2+Y,3
57 ?CHR$(0,232,0)
58 RTN

Web版はこちら。
Web版は動作が遅いので、12行の「WAIT 5」を「WAIT 2」に変えています。

新・IchigoJam名札

皆さん、明けましておめでとうございます。
2019年もよろしくお願いします。

これまで展示会やイベントなどで首から下げていた「IchigoJam名札」ですが、ハードに持ち歩いたせいか、液晶モニタが映らなくなってしまいました。
ちょっと強化して、新しい名札を作ってみました。

f:id:shiro0922:20190110220329j:plain

秋月電子A基板用アクリルパネルを装着して、IchigoJamや液晶モニタを保護。見た目もカッコよくなりました。
ただ、おかげでIchigoJamの電源スイッチに指が届かなくなり、やむなく別にスライドスイッチを付けました(^_^;)

下半分の基板は、専用プリント基板を起こしました。
今回はEEPROMも搭載して、多数のプログラムを載せられるようになりました(^_^)v

f:id:shiro0922:20190110223249p:plain

f:id:shiro0922:20190110225124p:plain

あとは、今まで作ってきたプログラムを、ジョイスティック&ボタン操作に改造して移植しました。

基板データ

*この基板ガーバーデータは、CC BYライセンスとします。どうぞご利用ください。

(C) 2018 Shiro Saito (https://www.ichigojaman.jp)

メニュープログラム

f:id:shiro0922:20190110223529p:plain
ジョイスティックの操作で、数字を「00」~「99」の範囲で変更します。
Aボタンを押すと、スロット100~199のプログラムを起動します。

1 '*PCN Selecter
2 CLV:VIDEO 1:CLS:OUT1,-1:OUT2,-1
3 LET[0],#0080,#0808,#0FF8,#7FFF,#0220,#0808,#0140,#0000
4 LET[8],#0080,#3E2A,#0140,#223E,#0E38,#2208,#F007,#BE3E
5 LET[16],#17F4,#2214,#1004,#2263,#1FFC,#3E49,#1084,#222A
6 LET[24],#12A4,#221C,#1494,#222A,#2084,#4249,0,0
7 LET[32],0,0,#7191,#087F,#4A51,#0849,#4A19,#0E49
8 LET[40],#7215,#087F,#4213,#0849,#4251,#0849,#4191,#7F7F
9 A=#900:FORY=0TO23:FORX=0TO1:M=#8000
10 FORB=0TO15:D=([Y*2+X]&M)!=0:POKEA,D:M=M>>1:A=A+1:NEXT
11 NEXT:NEXT
12 IF!BTN()CONT
13 BEEP:CLS:WAIT30
14 LET[0],7,5,5,5,7,4,4,4,4,4,7,4,7,1,7,7,4,7,4,7,5,5,7,4,4
15 LET[25],7,1,7,4,7,7,1,7,5,7,7,5,5,4,4,7,5,7,5,7,7,5,7,4,7
16 N=0:GSB26
17 I=(512-ANA(5))/256
18 J=(ANA(6)-512)/256
19 N=N+I+J*10
20 IFN<0N=N+100
21 IFN>99N=N-100
22 GSB26
23 IF!BTN()GOTO17
24 BEEP:CLS:SRNDTICK()
25 LRUNN+100
26 M=N/10:O=12:GSB28
27 M=N%10:O=16:GSB28:RTN
28 FORY=0TO4:D=[M*5+Y]:LCO,10+Y
29 FORX=0TO2:?CHR$(D%2);:D=D/2:NEXT
30 ?CHR$(28,28,28,31);:NEXT:RTN

かわくだり

f:id:shiro0922:20190110223657p:plain
おなじみのかわくだりです。ジョイスティックの左右で自キャラを移動させて、岩を避けながら川を下ります。岩に当たるとゲームオーバーで、下った秒数が左下に表示されます。
Aボタンでリプレイ、Bボタンで名札に戻ります。

10 CLS:CLT:X=16
20 I=(512-ANA(5))/256:X=X+I:X=X&31
30 IF SCR(X,5) GOTO 80
40 LC X,5:?"O"
50 LC RND(32),23:?"*"
60 WAIT 3
70 GOTO 20
80 ?TICK()/60
90 IF BTN() RUN
100 IF IN(1) GOTO 90 ELSE LRUN 0

シューティング

f:id:shiro0922:20190110224034p:plain
上空のUFOを撃ち落とすシューティングゲームです。
ジョイスティックの左右で砲台を移動させて、Aボタンでビームを発射します。
UFOに下まで侵略されるとゲームオーバーです。
Aボタンでリプレイ、Bボタンで名札に戻ります。

10 '*SHOOTING j
20 CLS:CLV:OUT 1,-1
30 LOCATE 0,0
40 ?S
50 X=16:Y=23
60 LOCATE X,Y
70 ?"A";
72 U=RND(31):V=0
74 LOCATE U,V
76 ?CHR$(241);
80 '*GAMELOOP
90 LOCATE X,Y
100 ?" ";
105 K=(512-ANA(5))/256
110 IF K=-1 AND X>0 THEN X=X-1
120 IF K=1 AND X<30 THEN X=X+1
130 LOCATE X,Y
140 ?"A";
142 IF BTN()=1 THEN GOSUB 240
145 GOSUB 160
148 WAIT 3
150 IF V<23 THEN GOTO 80
152 BEEP 30,30
153 LOCATE 0,0:?S
154 LOCATE 12,12
156 ?"GAME OVER!":WAIT 30
158 IF BTN() RUN
159 IF !IN(1) LRUN0 ELSE GOTO 158
160 '*UFO
170 LOCATE U,V
180 ?" ";
190 U=U+RND(3)-1
192 IF U<0 THEN U=0
194 IF U>30 THEN U=30
200 V=V+RND(3)-1
201 IF RND(10)=0 V=V+1
202 IF V<0 THEN V=0
204 IF V>23 THEN V=23
210 LOCATE U,V
220 ?CHR$(241);
230 RETURN
240 '*BEAM
250 B=X
260 FOR C=Y-1 TO V STEP -1
270 LOCATE B,C
280 ?"|";
285 WAIT 2
290 LOCATE B,C
300 ?" ";
310 NEXT
320 IF B<>U THEN RETURN
330 '*HIT
340 BEEP
350 LOCATE U,V
360 ?"*";
362 S=S+10
364 LOCATE 0,0
366 ?S
370 WAIT 20
380 LOCATE U,V
390 ?" ";
395 U=RND(31):V=0
400 RETURN

スキー

f:id:shiro0922:20190110224145p:plain
ジョイスティックの左右で自キャラを移動させて、ポールの間をくぐってください。ポールに当たるとゲームオーバーです。
Aボタンでリプレイ、Bボタンで名札に戻ります。

10 '*SKI*
20 CLS
30 CLV:OUT 1,-1
40 X=15
50 Y=3
60 P=12
70 W=7
80 C=0
90 @GAMELOOP
100 LOCATE X,Y
110 PRINT " "
120 I=(512-ANA(5))/256
130 IF I=-1 AND X>1 THEN X=X-1
140 IF I=1 AND X<30 THEN X=X+1
150 GOSUB @POLE
160 D=SCR(X,Y)
170 LOCATE X,Y
180 PRINT CHR$(250)
190 IF D=95 THEN BEEP:S=S+1
200 LOCATE 0,0
210 PRINT S
220 IF D=124 THEN GOTO @OVER
230 W=7-S/20
240 IF W<3 THEN W=3
250 WAIT 3
260 GOTO @GAMELOOP
270 @OVER
280 LOCATE X,Y
290 PRINT "X"
300 BEEP 30,30
310 @RLOOP
320 IF BTN() RUN
330 IF IN(1) GOTO @RLOOP ELSE LRUN 0
340 @POLE
350 C=C+1
360 IF C<10 THEN LOCATE 0,23:PRINT:RETURN
370 P=P+RND(3)-1
380 IF P<0 THEN P=0
390 IF P+W>30 THEN P=30-W
400 LOCATE P,23
410 PRINT "|";
420 FOR I=1 TO W-2
430 PRINT "_";
440 NEXT
450 PRINT "|"
460 C=0
470 RETURN

ジャンプアクション

f:id:shiro0922:20190110224245p:plain
敵のエイリアン「@」を避けつつ、コイン「$」を取ってください。
ジョイスティックの左右で左右移動、上下ではしごの上り下り、Aボタンでジャンプです。
エイリアンに当たるとゲームオーバーです。
Aボタンでリプレイ、Bボタンで名札に戻ります。

1 CLV:OUT1,-1:OUT2,-1:LET[90],30,6,-1,0,14,1,30,22,-1
2 CLS:FORJ=7TO23STEP8:LC0,J:FORI=0TO30:?CHR$(1);:NEXT:NEXT
3 FORJ=7TO22:LC7,J:?"H":LC23,J:?"H":NEXT:GSB19:X=0:Y=22:J=0
4 K=(512-ANA(5))/256:IFJOR(Y%8=6)U=X-(K=-1)*(X>0)+(K=1)*(X<30)
5 V=Y:IFJGOTO8
6 L=(512-ANA(6))/256:V=Y-(L=-1)*(H=72)+(L=1)*(SCR(X,Y+1)=72)
7 IFBTN()*(H<>72)J=1:G=-3
8 V=V+G*J:G=G+J:LCX,Y:?CHR$(H);:H=SCR(U,V):IFH=36BEEP:S=S+1:GSB19:H=0
9 LCU,V:?CHR$(250);:X=U:Y=V
10 IFH=64M=1
11 IFY%8=6J=0
12 IFRND(40)=0GSB25
13 FORA=0TO15STEP5:IF[A]GSB22
14 IF(![A])*(!RND(20))GSB20
15 NEXT:IF!MGOTO4
16 BEEP30,30:LC11,11:?"GAME OVER":WAIT30
17 IFBTN()RUN
18 IFIN(1)GOTO17 ELSELRUN0
19 LC0,0:?"SCORE ";S:RTN
20 R=RND(3)*3:[A+1]=[90+R]:[A+2]=[91+R]:[A+4]=SCR([A+1],[A+2]):IF[A+4]RTN
21 [A]=1:[A+3]=[92+R]:LC[A+1],[A+2]:?"@";:RTN
22 D=[A+1]+[A+3]:E=[A+2]:LC[A+1],[A+2]:?CHR$([A+4]);:IF(D<0)OR(D>30)[A]=0:RTN
23 [A+4]=SCR(D,E):LCD,E:?"@";:IF[A+4]=250M=1
24 [A+1]=D:[A+2]=E:RTN
25 B=RND(31):C=8*RND(3):IFSCR(B,C)GOTO25
26 LCB,C:?"$":RTN

100mダッシュ

f:id:shiro0922:20190110224337p:plain
Aボタンを連打して100m走ってください。ゴールするとタイムが表示されます。
タイトル画面でBボタンを押すと名札に戻ります。

10 '*100m Dash Event
20 VIDEO 3:CLV
30 @TITLE
40 CLS
50 LC 2,0:?"*100m Dash*"
60 LC 6,3:?"TIME"
70 LC 6,4:?T/60;".";T%60/6;
80 WAIT 120
90 LC 5,7:?"READY?";
100 IF BTN() CONT
110 @SLOOP
120 IF IN(1)=0 LRUN 0
130 IF !BTN() GOTO @SLOOP
140 CLS
150 LC 0,1:?CHR$(251)
160 LC 4,7:?"|";
170 LC 0,0
180 FOR T=3 TO 1 STEP -1
190 ?T;" ";:BEEP:WAIT 60
200 NEXT
210 ?"GO!":BEEP 10,60
220 LC 1,1:CLT
230 FOR R=1 TO 100
240 IF !BTN() CONT
250 IF BTN() CONT
260 ?CHR$(8,46,251);
270 NEXT
280 T=TICK()
290 ?" GOAL!";
300 BEEP 10,60:WAIT 60
310 GOTO @TITLE

ブロックくずし

f:id:shiro0922:20190110224440p:plain
ジョイスティックの左右でパドルを動かして、ボールを打ち返してください。
3回ミスするとゲームオーバーです。
Aボタンでリプレイ、Bボタンで名札に戻ります。

1 '* KBlock j
2 CLV:OUT1,-1
3 B=3:POKE#700,0,127,127,127,127,127,127,0,0,254,254,254,254,254,254,0
4 CLS:X=5:Y=10:D=1:E=1:C=#E9:GSB18:P=15:GSB23
5 LC1,23:?"SCORE ";S;:LC20,23:IFB>1FORI=1TOB-1:?CHR$(C);:NEXT
6 FORJ=0TO21:LC1,J:?CHR$(1):LC30,J:?CHR$(1):NEXT:GSB19
7 U=X+D:V=Y+E:IFV>-1ELSEV=RND(3)/2:E=1:R=0:GOTO7
8 WAIT2:IFSCR(U,V)<>1GOTO13
9 IFU<2BEEP20:D=1:GOTO7
10 IFU>29BEEP20:D=-1:GOTO7
11 BEEP30:E=-1:D=((U-P)>3)*2-1:R=0:IF!LO=0:GSB19
12 GOTO7
13 GSB22:GSB18:IF2<VANDV<7AND!RGSB20
14 X=U:Y=V:GSB18:GSB22:IFY<22GOTO7
15 BEEP30,60:WAIT60:B=B-1:IFB>0O=1:GOTO4
16 IFBTN()RUN
17 IFIN(1)GOTO16 ELSELRUN0
18 A=#900+X+Y*32:POKEA,C^PEEK(A):RTN
19 L=0:FORJ=0TO3:LC2,J+3:FORI=0TO13:A=I+J*14:[A]=[A]*O:?CHR$(#E0*![A],#E1*![A]);:L=L+![A]:NEXT:NEXT:RTN
20 I=(U-2)/2:J=V-3:A=I+J*14:IF[A]RTN
21 BEEP10:[A]=1:LCI*2+2,V:?CHR$(0,0);:R=1:E=-E:S=S+1:LC7,23:?S;:L=L-1:RTN
22 K=(512-ANA(5))/256:Q=P-(K=-1)*(P>1)+(K=1)*(P<25):IFQ=PWAIT1:RTNELSEP=Q
23 LCP-1,22:?CHR$(0,1,1,1,1,1,1,0);:RTN

落ち物パズル

f:id:shiro0922:20190110224611p:plain
上から落ちてくるブロックを左右に動かして、うまく積み重ねてください。横1列が揃うとその列は消えます。
Aボタンを押すと、ブロックが上下反転します。
ブロックが上まで積み上がるとゲームオーバーです。
Aボタンでリプレイ、Bボタンで名札に戻ります。

1 '*Fall j
2 CLV:CLS:OUT1,-1:OUT2,-1
3 FORJ=0TO13:[J]=513:Q=[J]:GSB23:NEXT:[14]=1023:Q=[14]:GSB23
4 LC0,16:?"SCORE 0":T=30
5 G=0:A=RND(15)+1:B=(A&3)*16:C=(A&12)*4:Y=0:IF!CGSB24
6 GSB21:IF(B&[0])OR(C&[1])GOTO18
7 FORK=0TOT:IF!BTN()GOTO9
8 GSB24:GSB21:GOTO13
9 I=(512-ANA(5))/256:IF!IGOTO13
10 D=B<<I:E=C<<I
11 IF(D&[Y])OR(E&[Y+1])GOTO13
12 GSB22:B=D:C=E:GSB21
13 NEXT:V=Y+1:IF(B&[V])OR(C&[V+1])GSB26
14 IF!GGOTO17
15 IFG=2GOTO18
16 IFG=1GOTO5
17 GSB22:Y=V:GSB21:GOTO7
18 BEEP30,30
19 IFBTN()RUN
20 IFIN(1)GOTO19 ELSELRUN0
21 LC0,Y:Q=[Y]|B:GSB23:Q=[Y+1]|C:GSB23:RTN
22 LC0,Y:Q=[Y]:GSB23:Q=[Y+1]:GSB23:RTN
23 FORI=0TO9:?CHR$(Q&1);:Q=Q>>1:NEXT:?:RTN
24 IF!BRTN
25 A=B:B=C:C=A:RTN
26 BEEP30,5:[Y]=[Y]|B:W=Y+1:[W]=[W]|C:P=1
27 IF[W]=1023&&W<14GSB31 ELSEW=Y
28 IF[W]=1023GSB31
29 G=1:IFY<2G=2
30 RTN
31 BEEP:[W]=513:Q=[W]:LC0,W:GSB23
32 S=S+P:LC6,16:?S:T=T-P*2:P=P+2:IFT<0T=0
33 FORZ=WTO1STEP-1:[Z]=[Z-1]:Q=[Z]:LC0,Z:GSB23:NEXT
34 LC0,0:Q=513:GSB23:RTN