SHIROのIchigoJam日記

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

無線対戦リーチゲーム

MixJuiceで無線通信するプログラムの応用で、リーチゲーム(ビンゴゲームの一種)を作ってみました。
f:id:shiro0922:20191114135028j:plain
以前にCPU対戦で作ったプログラムの簡易版です。
www.ichigojaman.jp

事前準備

以前の記事で書いたように、事前準備で2セットのIchigoJam+MixJuiceの間で、TCP通信が確立した状態にします。
www.ichigojaman.jp

遊び方

下のプログラムリストにあるプログラムを入力します。サーバー用とクライアント用があります。

  • 起動すると、5×5のマス目に1~25の数字がランダムに表示されます。
  • サーバー側が先手です。どれか消してもいい数字を選んで入力して送信します。自分が言った数字は「--」となり消えます。クライアント側では、サーバーが消した数字は「●●」となります。

  • 次はクライアント側の番です。同様に、どれか消してもいい数字を選んで入力して送信します。
  • 以上を先手・後手でくり返します。
  • 相手が言った数字で「●●」が縦・横・斜めのどれか1列で4個並んだ時は、「リーチ」と宣言して「99」を入力します。その場合、相手はもう一度数字を消さないといけません。
  • 「●●」が縦・横・斜めのどれか1列で5個揃えば「ビンゴ」で勝ちです。「100」を入力して終了します。


★クライアント側を先手にしたい時は、最初にサーバー側で「99」(リーチ)を入力して、クライアントに順番を回してください。

どこの列を捨てて消していくかの判断が難しく、半分は戦略、半分は数字の運です。
リーチルールによる一発大逆転もあり、頭を使いますが楽しいゲームです。

なお、今回は子ども向けに簡単なプログラムにしたので、数字の入力ミスや、リーチ・ビンゴの判断ミスはチェックしていません。
人間の方でちゃんと管理してください。

プログラム

サーバー側プログラム

10 '*REACH-S
20 CLV:UART 0,0:CLS
30 FOR I=0 TO 24:[I]=I+1:NEXT
40 FOR I=1 TO 200
50 A=RND(25):B=RND(25)
60 C=[A]:[A]=[B]:[B]=C
70 NEXT
80 GSB 290
90 INPUT "N(reach:99 win:100)=",N
100 UART 1,0
110 ?CHR$(N+32)
120 UART 0,0
130 IF N=100 ?"WIN":BEEP 10,30:END
140 FOR I=0 TO 24
150 IF [I]=N [I]=0
160 NEXT
170 GSB 290
180 ?"Waiting..."
190 UART 0,1
200 N=INKEY()-32:IF N=-32 CONT
210 UART 0,0
220 IF N=99 ?"REACH":BEEP:GOTO 90
230 IF N=100 ?"LOSE":BEEP 30,30:END
240 FOR I=0 TO 24
250 IF [I]=N [I]=-1
260 NEXT
270 ?N:GSB 290
280 GOTO 90
290 ?:I=0
300 FOR Y=0 TO 4
310 FOR X=0 TO 4
320 IF [I]=0 ?"-- "; ELSE IF [I]=-1 ?"oo "; ELSE ?DEC$([I],2);" ";
330 I=I+1
340 NEXT:?
350 NEXT:?
360 RTN

クライアント側プログラム

10 '*REACH-C
20 CLV:UART 0,0:CLS
30 FOR I=0 TO 24:[I]=I+1:NEXT
40 FOR I=1 TO 200
50 A=RND(25):B=RND(25)
60 C=[A]:[A]=[B]:[B]=C
70 NEXT
80 GSB 290
90 ?"Waiting..."
100 UART 0,1
110 N=INKEY()-32:IF N=-32 CONT
120 UART 0,0
130 IF N=99 ?"REACH":BEEP:GOTO 190
140 IF N=100 ?"LOSE":BEEP 30,30:END
150 FOR I=0 TO 24
160 IF [I]=N [I]=-1
170 NEXT
180 ?N:GSB 290
190 INPUT "N(reach:99 win:100)=",N
200 UART 1,0
210 ?CHR$(N+32)
220 UART 0,0
230 IF N=100 ?"WIN":BEEP 10,30:END
240 FOR I=0 TO 24
250 IF [I]=N [I]=0
260 NEXT
270 GSB 290
280 GOTO 90
290 ?:I=0
300 FOR Y=0 TO 4
310 FOR X=0 TO 4
320 IF [I]=0 ?"-- "; ELSE IF [I]=-1 ?"oo "; ELSE ?DEC$([I],2);" ";
330 I=I+1
340 NEXT:?
350 NEXT:?
360 RTN

サーバーとクライアントのプログラムは、

  • 「手の入力・送信」(サーバー側90~170行・クライアント側190~270行)
  • 「相手の手の受信」(サーバー側180~270行・クライアント側90~180行)

の順番が逆なだけで、基本的に同じプログラムです。
なお、IchigoJam2台でシリアルで通信しているだけなので、MixJuiceが無くても、TX,RXを有線でクロスにつないでも遊べます。
(TX-RX、RX-TX、GND-GND)

コンピュータが無くても、もともとは紙と鉛筆があればできるゲームです。
5×5のます目にランダムに1~25の数字を書いて、互いに数字を言って○×を書けばいいです。
友達とやってみてください。
f:id:shiro0922:20191114230224p:plain

MixJuiceで無線トランシーバー

IchigoJamWi-fiが使える拡張ボード「MixJuice」。
hello002.stores.jp
先日、ファームウェア1.4が公開されて、サーバー機能が追加されました。
それを使って、1対1の無線トランシーバーをやってみました。
f:id:shiro0922:20191110140609j:plain
新学習指導要領で、2021年から中学校技術科のプログラミングが拡充され、「ネットワークを介した双方向のプログラミング」をやることになっています。それをちょっと先取りするイメージで作ってみました。

初期設定

(1)IchigoJam+MixJuiceを2セット用意します。片方がサーバー、もう片方がクライアントになります。

(2)サーバーにするMixJuiceで、ソケットCN4のIO16端子をGND端子とつなげます。これでサーバーモードで起動するようになります。
f:id:shiro0922:20191111181041j:plain

(3)2台を起動します。
(MixJuiceの説明書にも書いてありますが、MixJuiceのCN6にジャンパーを挿して、MixJuice側のmicro USBに電源を挿してください)
クライアント側のIchigoJamで、サーバーへの接続を設定します。

?"MJ APC MJ-XXXXXXXXXXXX"

「XXXXXXXXXXXX」はサーバー側のMixJuiceのMacアドレス12桁です。
一度接続できればその設定が記憶されるので、次回からは電源ONで自動接続するようになります(この手順が不要になります)。
なおサーバー側のIPアドレスは「192.168.20.1」、クライアント側は「192.168.20.100」になります。
(2台目以降のクライアントは「~.101」「~.102」…になる)

通信

再び2台の電源ONの後、クライアント側のIchigoJamで、サーバーとのTCP通信を開始します。

?"MJ TCP 192.168.20.1 20001"

f:id:shiro0922:20191110133022j:plain
「'Connection established.」と表示されれば通信成功で、サーバー側と双方向にTCP通信を開始します。
TX,RX同士をケーブルでつないだ時と基本的に同じで、キー入力してEnterすると、その文字列がそのまま相手方へ送信されます。
2台でキーボードから文字を入力すると、Syntax Errorの嵐になります(笑)
「UART0」を入力すると送信が止まるので、嵐が止まります。
通信をやめる時は、CLOSEコマンドを送ります。

?"MJ TCP CLOSE"

プログラム

同時に双方向で通信すると嵐になるので、文字列を交互に送受信する「トランシーバー」のプログラムを作ってみました。
f:id:shiro0922:20191110140639j:plain

  • サーバー側・クライアント側で、それぞれのプログラムを実行します。
  • 最初はサーバー側が送信する番です。「?」と表示されるので、キーボードで文字列を入力してEnterキーを押してください。クライアント側へ送信されます。クライアント側では、受信した文字列が「>」の後に表示されます。
  • 次はクライアント側の番です。「?」と表示されるので、キーボードで文字列を入力してEnterキーを押してください。サーバー側へ送信されます。
  • 以下、交互に文字列を入力して送信してください。

サーバー側プログラム

10 'TR-SERVER
20 ?:?"?";
30 UART 1,0
40 GSB 100
50 UART 0,1
60 ?:?">";
70 GSB 100
80 BEEP
90 GOTO 20
100 C=INKEY():IF !C CONT
110 ?CHR$(C);
120 IF C!=10 GOTO 100
130 RTN

クライアント側プログラム

10 'TR-CLIENT
20 UART 0,1
30 ?:?">";
40 GSB 100
50 BEEP
60 ?:?"?";
70 UART 1,0
80 GSB 100
90 GOTO 20
100 C=INKEY():IF !C CONT
110 ?CHR$(C);
120 IF C!=10 GOTO 100
130 RTN

サーバー側とクライアント側は、送信処理と受信処理の順番が違うだけです。
サーバー→クライアントの下り方向は、送信した文字列が受信されるまでに3~5秒ほどタイムラグがあります。クライアント→サーバーの上り方向は1秒くらいです。
UDPを使って送信するとタイムラグが小さいのですが、相手方のIPアドレスとポート番号を毎回指定しないといけないので、面倒です。

?"MJ UDP 192.168.20.1 20001 msg"

オーナメント・シリーズ

クリスマスっぽいLED基板を3種類作ってみました。
f:id:shiro0922:20191110180257j:plain
IchigoJam BASIC入りLPC1114が乗っていて、単独で動きます。
10ピンのピンソケットにUSBシリアルをつなげば、プログラムの書き換えができます。
ストラップホールも開いているので、ツリーのオーナメントやキーホルダーなどにいかがでしょうか。

オーナメント・スター

5個のLEDが星形に並んだ基板です。

電源は裏面にボタン電池CR2032が2個あります。

基板データ


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

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

プログラム

5個のLEDがランダムに光ります。

10 @ARUN:VIDEO 0,30
20 OUT RND(32)
30 WAIT 1+RND(4)
40 GOTO 20

この他、LED Star基板と同じプログラムが動かせます。
www.ichigojaman.jp

オーナメント・ハート

10個のLEDがハート形に並んだ基板です。LEDが1個だけ大きい5mm径です。

基板データ


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

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

プログラム

10個のLEDがいろいろなパターンで光ります。

10 @ARUN:VIDEO 0,10
20 CLV:OUT 0:OUT 10,0
30 @LOOP
40 FOR I=1 TO 10
50 OUT I,1
60 WAIT 1
70 NEXT
80 WAIT 2
90 FOR T=1 TO 3
100 OUT 0
110 WAIT 2
120 OUT 1023
130 WAIT 2
140 NEXT
150 FOR I=1 TO 9
160 OUT I,0
170 WAIT 1
180 NEXT
190 FOR I=1 TO 9
200 OUT I,1
210 WAIT 1
220 NEXT
230 FOR I=1 TO 10
240 OUT I,0
250 WAIT 1
260 NEXT
270 GOTO @LOOP

この他、LED Heart基板と同じプログラムが動かせます。
www.ichigojaman.jp

オーナメント・ツリー

11個のLEDがツリー形に並んだ基板です。LEDが1個だけ大きい5mm径です。

基板データ


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

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

プログラム

11個のLEDがいろいろなパターンで光ります。

10 @ARUN:VIDEO 0,10
20 @LOOP
30 FOR I=1 TO 11:OUT I,0:NEXT
40 FOR I=1 TO 11
50 OUT I,1
60 WAIT 1
70 NEXT
80 FOR I=1 TO 11
90 OUT I,0
100 WAIT 1
110 NEXT
120 FOR I=1 TO 10
130 L=0
140 FOR J=1 TO 12
150 L=L<<1+!RND(4)
160 NEXT
170 OUT L
180 WAIT 6
190 NEXT
200 GOTO @LOOP

回路はハート形基板とほぼ同じなので(LEDが1個多い)、同じプログラムが動かせます。