SHIROのIchigoJam日記

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

シリアル版リーチゲーム

※この記事は「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個ダメにしました(^_^;)

ふき消しろうそく

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

福野さんがブログで、安いマイクモジュールで音を検知してLEDを光らせていました。
fukuno.jig.jp
そのアイデアをいただいて、息で吹き消すLEDろうそくを簡単に作ってみました。
2本立てて動かした動画はこちら。

【IchigoJam】ふき消しろうそく


基板から上に数cm立っているので、ちょっとろうそくっぽいです(^_^)
クリスマスケーキよりお誕生日ケーキに似合いそうです。

作り方

(1)マイクモジュール裏側のジャンパーJ1を、はんだでつなげます。

(2)マイクモジュールのVCC端子・OUT端子に単芯線、GND端子にLEDの-(カソード)線をはんだ付けします。

(3)線を切りそろえて、IchigoJamのCN4ソケットに挿します。

マイクモジュール側 IchigoJamのCN4
LED+ OUT1
LED-/GND GND
OUT IN2
VCC VCC


(4)これでハードは完成です

プログラム

福野さんのブログのプログラムを、ほぼそのまま使わせていただきました。
ろうそくを息で吹くと、フッと消えて、しばらくすると元どおりに点灯します。

10 '*CANDLE
20 OUT 1,1
30 A=ANA(2)
40 B=ANA(2):C=B-A:A=B
50 IF ABS(C)<5 GOTO 30
60 WAIT 30:OUT 1,0
70 WAIT 60:GOTO 20

応用編・ろうそく2本

もう1本ろうそくを作って、2本とも息で消えるようにしました。

2本目のろうそくは以下のように接続しています。

マイクモジュール側 IchigoJamのCN4
LED+ LED
LED-/GND OUT4
OUT OUT3
VCC OUT2

LED端子で光らせているので、オンボードのLEDも一緒に光ります。

プログラムは以下のとおりです。
2本のろうそくで別々にタイミングを取っているので、息を吹きながら口を横に動かすと、2本が時間差で消灯・点灯します。

10 '*CANDLE 2
20 CLT:OUT 2,1:OUT 3,-1
30 D=-60:H=-60
40 A=ANA(2)
50 B=ANA(2):C=B-A:A=B
60 E=ANA(7)
70 F=ANA(7):G=F-E:E=F
80 T=TICK()
90 IF T-D>60 IF ABS(C)<5 OUT 1,1 ELSE OUT 1,0:D=T
100 IF T-H>60 IF ABS(G)<5 LED 1 ELSE LED 0:H=T
110 GOTO 40