1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IchigoJam + Ichigo-ice で読み上げ機能つきビンゴマシン

Posted at

年末年始にかけて、パーティーなどをやる人も居るかもしれない。
パーティーといえば、やっぱりビンゴゲームが定番かな。

ということで、IchigoJam を用いてビンゴマシンを作ってみた。
今回は、Ichigo-ice と連携して出た数字を自動で読み上げる。

※IchigoJamはjig.jpの登録商標です。

プログラム

10 ' ヨミアゲ ビンゴ
20 A=#2E
30 COPY#8A0,"karappo/dayo.",13:[86]=[86]|#0D00:COPY#8B4,"<NUMK VAL=",10:[96]=#0D3E
40 CLS:FORI=0TO74:LOCATEI%10*3+3,I/10:?"・":[I]=I:NEXT:N=75:S=0
50 K=INKEY():IFK=0WAIT1:GOTO50
60 IFK=32:S=S+1:IFS>4GOTO20ELSEGOTO50
70 S=0:IFK<>10GOTO50
80 FORI=24TO40:DRAW16,I,47,I,0:NEXT:DRAW16,30,16,43:DRAW16,43,47,43:FORI=0TO11:DRAW28+SIN(I*30)/25,31+COS(I*30)/25,28+SIN(I*30+30)/25,31+COS(I*30+30)/25:NEXT
90 FORI=0TO12:DRAW28,31,28+SIN(I*30-30)/42,31+COS(I*30-30)/42,0:DRAW28,31,28+SIN(I*30)/42,31+COS(I*30)/42:WAIT3:NEXT
100 IFN<1IFAA=A*!I2CW(A,#8A0,14):GOTO50ELSEGOTO50
110 LOCATE21,20:?CHR$(#8F):WAIT60:C=RND(N):V=[C]+1:N=N-1:[C]=[N]:F=(#180+V/10*8)*(V>9):G=#180+V%10*8:IFV>9[95]=V/10+V%10<<8+#3030:ELSE[95]=V+#2030
120 FORI=18TO43:DRAW16,I,47,I,0:NEXT
130 IFAA=A*!I2CW(A,#8B4,14)
140 FORI=0TO7:LOCATE8,12+I:P=PEEK(F+I):FORJ=0TO7:?CHR$(P>>(7-J)&1*#8F);:NEXT:NEXT:FORI=0TO7:LOCATE12+4*(V>9),12+I:P=PEEK(G+I):FORJ=0TO7:?CHR$(P>>(7-J)&1*#8F);:NEXT:NEXT
150 LOCATE(V-1)%10*3+2,(V-1)/10:?DEC$(V,2)
160 GOTO50

操作方法

キー 役割
Enter 次の抽選を行う
スペース 5回連続で押すことで、状態をリセットする

実行結果例

起動。

起動直後

Enter キーを押すと、抽選器が回転する演出が入り…
しかし実機だと丸のつもりの図形が汚いなあ…

抽選演出

抽選器から玉が出て…

玉が出た

選ばれた数字が表示されるとともに、読み上げられる。

数字の表示

再び Enter キーを押すと、次の数字の抽選を開始する。

次の数字の抽選

選ばれた数字は、画面上部に表示される。

選ばれた数字が増えてきた

解説

タイトル

10 ' ヨミアゲ ビンゴ

慣例に沿って、最初の行にタイトルを入れている。

画面と状態の初期化

40 CLS:FORI=0TO74:LOCATEI%10*3+3,I/10:?"・":[I]=I:NEXT:N=75:S=0

画面をクリアし、出た数字を描画するエリアに「・」を描画する。
ついでに、[0][74] で管理している残りの玉の状態を初期化する。
また、残りの玉の数 N を 75 に、スペースキーを押した回数 S を 0 に初期化する。

キー入力の受け付け

50 K=INKEY():IFK=0WAIT1:GOTO50
60 IFK=32:S=S+1:IFS>4GOTO20ELSEGOTO50
70 S=0:IFK<>10GOTO50

キー入力を受け付ける。
スペースキーが押されたら、回数をカウントし、5回になったら状態をリセットする。
スペースキー以外が押されたら、スペースキーが押された回数を0に戻す。
エンターキーが押されたら次の処理に進むが、それ以外のキーが押されたときはキー入力の受付に戻る。

抽選器の描画

80 FORI=24TO40:DRAW16,I,47,I,0:NEXT:
   DRAW16,30,16,43:DRAW16,43,47,43:
   FORI=0TO11:
     DRAW28+SIN(I*30)/25,31+COS(I*30)/25,28+SIN(I*30+30)/25,31+COS(I*30+30)/25:
   NEXT
90 FORI=0TO12:
     DRAW28,31,28+SIN(I*30-30)/42,31+COS(I*30-30)/42,0:
     DRAW28,31,28+SIN(I*30)/42,31+COS(I*30)/42:
     WAIT3:
   NEXT
110 LOCATE21,20:?CHR$(#8F):WAIT60:

まず、数字が描かれる領域を黒く塗りつぶす。
抽選器の左と下の枠を描画する。
三角関数を用いて円を描画する。
ハンドルのアニメーションを行う。前に描いたハンドルの位置を黒く塗った後、今のハンドルの位置を描画する。
最後に、抽選器から出た玉を描画する。

抽選の実行

(110) C=RND(N):V=[C]+1:N=N-1:[C]=[N]:
      F=(#180+V/10*8)*(V>9):G=#180+V%10*8:
      IFV>9[95]=V/10+V%10<<8+#3030:ELSE[95]=V+#2030

残っている玉からどれを出すか C をランダムに選ぶ。
選んだ玉 V を出す。
残っている玉の数 N を減らし、出した玉の場所に最後の玉を入れる。
出た数字の十の位のキャラクターパターンのアドレスを F に、一の位のキャラクターパターンのアドレスを G に格納する。ただし、出た数字が一桁の場合、十の位は空白とする。
出た数字を読み上げ用の表現にして、[95] に格納する。

数字の描画

120 FORI=18TO43:DRAW16,I,47,I,0:NEXT
140 FORI=0TO7:
      LOCATE8,12+I:P=PEEK(F+I):FORJ=0TO7:?CHR$(P>>(7-J)&1*#8F);:NEXT:
    NEXT:
    FORI=0TO7:
      LOCATE12+4*(V>9),12+I:P=PEEK(G+I):FORJ=0TO7:?CHR$(P>>(7-J)&1*#8F);:NEXT:
    NEXT
150 LOCATE(V-1)%10*3+2,(V-1)/10:?DEC$(V,2)
160 GOTO50

抽選器の絵の領域を黒く塗りつぶす。
F および G に格納したアドレスを用いて、出た数字の十の位と一の位をそれぞれ描画する。
出た数字が一桁の場合は、一の位を真ん中に描画する。
最後に、出た数字を画面上部に描画し、キー入力の受け付けに戻る。

数字の読み上げ

20 A=#2E
30 COPY#8A0,"karappo/dayo.",13:[86]=[86]|#0D00:COPY#8B4,"<NUMK VAL=",10:[96]=#0D3E
100 IFN<1IFAA=A*!I2CW(A,#8A0,14):GOTO50ELSEGOTO50
130 IFAA=A*!I2CW(A,#8B4,14)

まず、Ichigo-ice の 7bit I2C アドレスを A に格納する。読み上げ機能を無効にする場合は、A を 0 にする。
読み上げ用の記号列を、配列の玉で使わない部分に格納する。ここで終端の CR も含めておく。
抽選後、I2C アドレスが有効であれば、読み上げ用の記号列を送信する。このとき、送信に失敗した場合はアドレスを 0 に設定し、以降の読み上げを無効にする。

他のビンゴマシン

IchigoJam を用いたビンゴマシンは他にもいくつか公開されているが、数字の読み上げ機能を持つものは見つけられなかった。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?