年末年始にかけて、パーティーなどをやる人も居るかもしれない。
パーティーといえば、やっぱりビンゴゲームが定番かな。
ということで、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
- OneFiveCrowd で実行 (非公式、高速、高品質な描画)
- IchigoJam web で実行 (公式、低速)
操作方法
キー | 役割 |
---|---|
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 を用いたビンゴマシンは他にもいくつか公開されているが、数字の読み上げ機能を持つものは見つけられなかった。