SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

バイオリズム(1.4用)

IchigoJam BASICの新ファームウェア、Ver 1.4が正式リリースされました。
www.b-incorp.com
IchigoJamの公式サイトからファイルをダウンロードできます。
ichigojam.net
β版が公開されていた時に「バイオリズム」のプログラムを作ったのですが、あらためて記事にまとめます。
f:id:shiro0922:20191207192547p:plain
誕生日(年月日)と、現在の年月を入力すると、今月のバイオリズムを描きます。
(P=身体〈23日周期〉、S=感情〈28日周期〉、I=知性〈33日周期〉)
IchigoJamでこんなことができるのも楽しいですね(^_^)

プログラム

1.4の新機能、三角関数と簡易グラフィックを使っています。
コード容量は1Kバイトをほぼ使い切りました。

10 CLS:?"*** Biorhythm ***"
20 CLV
30 ?:?"---Birthday"
40 ?"Year=";:INPUT B
50 ?"Month=";:INPUT C
60 ?"Day=";:INPUT D
70 ?:?"---Now"
80 ?"Year=";:INPUT Y
90 ?"Month=";:INPUT M
100 IF C<=2 B=B-1:C=C+12
110 Z=Y:N=M
120 IF M<=2 Z=Z-1:N=N+12
130 A=365*(Z-B)
140 A=A+Z/4-B/4
150 A=A-Z/100+B/100
160 A=A+Z/400-B/400
170 A=A+306*(N+1)/10-306*(C+1)/10
180 A=A+1-D
190 IF A<0 A=A-21252
200 CLS
210 ?"Biorhythm (";Y;"-";M;")"
220 FOR J=0 TO 62 STEP 2
230 DRAW J,23
240 NEXT
250 Q=-SIN(360*(A%23)/23)/16+23
260 FOR J=1 TO 30
270 P=-SIN(360*(J+A%23)/23)/16+23
280 DRAW J*2-2,Q,J*2,P
290 Q=P
300 NEXT
310 T=-SIN(360*(A%28)/28)/16+23
320 FOR J=1 TO 30
330 S=-SIN(360*(J+A%28)/28)/16+23
340 DRAW J*2-2,T,J*2,S
350 T=S
360 NEXT
370 K=-SIN(360*(A%33)/33)/16+23
380 FOR J=1 TO 30
390 I=-SIN(360*(J+A%33)/33)/16+23
400 DRAW J*2-2,K,J*2,I
410 K=I
420 NEXT
430 LC 31,P/2:?"P";
440 LC 31,S/2:?"S";
450 LC 31,I/2:?"I";
460 LC 0,12:?1
470 LC 9,12:?10
480 LC 19,12:?20
490 LC 29,12:?30
500 LC 0,1

誕生日から現在までの日数は、西暦1年1月1日からの日数を計算するフェアフィールドの公式

365y+[y/4]-[y/100]+[y/400]+[306(m+1)/10]+d-428
(y=年、m=月、d=日。[]は小数点以下切り捨て。ただし1月・2月は前年の13月・14月とする)
を差し引きに変形して計算しています。
ただし、日数(プログラムでは変数A)が32767日(約89歳)を越えると、計算がおかしくなります。プログラム容量が一杯なので、そこまで対策していません。
※対策しました(190行)。これで148歳までのバイオリズムが描けます。
f:id:shiro0922:20191208122411p:plain

シリアル版リーチゲーム

※この記事は「IchigoJam Advent Calendar 2019」に参加しています。

f:id:shiro0922:20191205234532p:plain
以前作った対戦ビンゴゲームのリメイクです。画面表示をシンプルにして、IchigoKamuyなどのシリアルモニタ画面でも遊べるようにしました。もちろん通常の液晶画面でも遊べます。
プログラムも圧縮して、何とか1ファイルに収めました。

(追記)IchigoKamuyとIJUtilitiesのシリアルモニタで遊んでみました。
f:id:shiro0922:20191206230456j:plain

遊び方

  • CPUと対戦するビンゴゲームです。起動すると、5×5の自分のマス目が表示されます。CPU側のマス目は、対戦中は見られません。
  • 自分のマス目の数字を1手ずつ入力して、「--」にして消していきます。逆にCPUが選んだ数字は、自分のマス目では「●●」になります。
  • 「●●」が縦・横・斜めのどこか1列で4個揃ったら「リーチ」です。その場合は、相手はもう1回数字を消さないといけません。
  • 「●●」が縦・横・斜めのどこか1列で5個揃ったら「ビンゴ」で、そのプレイヤーの勝ちです。CPU側のマス目も表示されて終了します。
  • 消せない数字を入力すると再入力になります。また、リーチやビンゴは自動で判定されます。

f:id:shiro0922:20191205235406p:plain
容量が足りないのでCPU思考ルーチンはシンプルですが、かなり強いです。本気でかかってください。
(作者の私も、必死にプレイして勝率は五分五分です)

プログラム

1 CLV:CLS:FORG=0TO25STEP25
2 FORI=0TO24:[G+I]=I+1:NEXT
3 FORI=1TO200:A=RND(25):B=RND(25):C=[G+A]:[G+A]=[G+B]:[G+B]=C
4 NEXT:NEXT:G=0:GSB16
5 G=0:INPUT"N=?",N:GSB29:IF[A]<1CONT
6 [A]=0:GSB16
7 G=25:GSB29:[G+A]=-1:GSB19:IFQEND
8 IFRGOTO5
9 G=25:T=1:B=-1:W=20:FORA=0TO24:U=A%5:V=A/5
10 F=0:IF[G+A]>0GSB19:IFF<WW=F:B=A
11 NEXT:N=[G+B]:[G+B]=0:?"CPU=";N:T=0
12 G=0:GSB29:[A]=-1:GSB16
13 GSB19:IFQEND
14 IFRGOTO9
15 GOTO5
16 ?:I=G:FORY=0TO4:FORX=0TO4
17 IF![I]?"--";ELSEIF[I]=-1?CHR$(233,233);ELSE?DEC$([I],2);
18 ?" ";:I=I+1:NEXT:?:NEXT:?:RTN
19 R=0:Q=0:E=1:S=0:Y=V:FORX=0TO4:GSB33:NEXT:GSB24
20 E=1:S=0:X=U:FORY=0TO4:GSB33:NEXT:GSB24
21 IFU=VGSB31:GSB24
22 IFU+V=4GSB32:GSB24
23 RTN
24 F=F+S*E:IFS<4||Q||TRTN
25 BEEP:IF!G?"YOU ";ELSE?"CPU ";
26 IFS=5?"WIN!":?"(CPU)";:G=25:GSB16:Q=1:RTN
27 IF!R?"REACH!":R=1:WAIT60
28 RTN
29 FORI=0TO24:D=[G+I]:IFD=NU=I%5:V=I/5
30 NEXT:A=U+V*5:RTN
31 E=1:S=0:FORX=0TO4:Y=X:GSB33:NEXT:RTN
32 E=1:S=0:FORY=0TO4:X=4-Y:GSB33:NEXT:RTN
33 D=[G+X+Y*5]:IF!DE=0
34 S=S+(D=-1):RTN

リーチが複数重なった時に、おかしな表示になることがあります。が、もうコード容量が1Kバイト目一杯なので、これ以上直せません(^_^;)
リーチやビンゴのチェックルーチンを、CPUの思考でも共用しています。おかげでプログラムが1ファイルに収まりました。

web版

IchigoJam web版はこちら。
実行速度が遅いので、起動直後やCPUの手番で10秒くらい待たされます。

かんたん人数カウンター

※この記事は、「IchigoJam Advent Calendar 2019」に参加しています。

以前に、赤外線人感センサーを使って「人数カウンター」を作りました。
www.ichigojaman.jp
www.ichigojaman.jp
今回は別のセンサーを使って、IchigoJamに挿すだけで簡単に作れる人数カウンターです。

使ったセンサーはこちら。

このセンサーを、IchigoJamのピンソケットCN4に挿します。

センサー側 IchigoJam
GND(-) GND
Vout OUT1
VCC(+) OUT2

プログラム

  • 起動すると、カウントが始まります。赤外線センサーが人間を検知すると、LEDが点灯してカウントされます。
  • カウントは1時間ごとに区切られて、その時間帯の人数、開始からのトータルの人数が表示されます。
10 @ARUN:'*Counter*
20 CLV:CLS:OUT 1,-1:OUT 2,1
30 ?"=== COUNT START ===":?
40 H=0:CLT
50 GSB @PRTCOUNT
60 @TIMELOOP
70 I=IN(5):LED I
80 IF I=1 AND J=0 THEN GSB @COUNT
90 J=I
100 IF TICK()>3609 THEN CLT:M=M+1
110 IF M<60 THEN GOTO @TIMELOOP
120 '*HOUR PASS
130 BEEP:M=0:H=H+1
140 IF H>23 THEN H=0
150 C=0
160 ?:GSB @PRTCOUNT
170 GOTO @TIMELOOP
180 @COUNT
190 C=C+1:T=T+1
200 GSB @PRTCOUNT
210 RTN
220 @PRTCOUNT
230 ?"Hour=";H;"  Count=";C;"  Total=";T
240 ?CHR$(30);
250 RTN

例えばイベント会場などで朝の9時からカウントしたい場合は、40行の「H=0」を「H=9」に変えて、9時ジャストに起動すれば、実際の時刻と合います。
赤外線センサーは、デフォルトでは一度検知してONになると、3秒間ほど保持してからOFFになります。それが最短時間なので、家族や団体などで一度にたくさん人が通るとうまくカウントできません。
なお、センサーにVR(可変抵抗)が付いていて、ドライバーで回してON時間を調整できるのですが、そのままにしていじらない方がいいです。下手に回すと壊れてカウントできなくなります。私はそれで失敗して、センサーを1個ダメにしました(^_^;)