2013年02月02日

DPC-100プログラム・どっちの音?クイズ

 この記事も含めて、まとめはこちらLink


 先ほどの記事にも書いたように、iPhoneのポケコンアプリ、DPC-100のアップデートによって、サウンドが実装されたので、それを使ったゲームを作ってみた。
 実はこれ、以前からある程度作っていて、アップデートによって実現できるのを待っていたという。

 ゲーム名としては「どっちの音?クイズ」とでも。

20130202-03.jpg20130202-04.jpg

 プログラムを起動したところ。
 まず、左に音符が出て低い音が、次に右に音符が出て高い音が鳴る。

20130202-05.jpg

 次に、真ん中に音符が出て、2つの中間の音が鳴るが、ここでクイズ。
「3回目に鳴った中間の音は、1回目の左と2回目の右、どちらに近い音ですか?」
 これを当てるゲーム。


20130202-06.jpg20130202-07.jpg

 鳴った後で矢印が出るので、iPhone画面の右の方と左の方、いずれかをタップによって選択。
 画面のように、合っていれば○、間違いなら×と出る。
 これを10回続けて正解数を競う。

プログラムリストと解説

どっちの音?クイズ
110 SCHVOLUME(0,15)
120 INT S(2)
130 LV=40
140 SC=0
150 REAL WA
160 LP=0
170 WHILE LP<10
180 STRING BAR=FILLSTR(0,16,' ')
190 S(0)=RANDOM()*(70-LV)+25
200 S(1)=LV+RANDOM()*10
210 S(1)=CLAMP(S(0)+S(1),25,90)
220 CS=(S(1)-S(0))/2
230 HS=RANDOM()*2
240 S(2)=S(0)+CS+CS*7/10*(HS*2-1)
250 LV=CLAMP(LV-5,5,60)
260 FOR I=0 TO 3 STEP 1
270 X=CLAMP(I*14,0,14)/CLAMP(I,1,2)
280 CH=229
290 GOSUB PRSUB
300 SN=S(I)
310 WA=1.0
320 GOSUB SOSUB
330 NEXT
340 X=7
350 CH=239
360 GOSUB PRSUB
370 WHILE TOUCH(-1,0)<1
380 WEND
390 TS=CLAMP((TOUCH(0,0)+430)/375,0,1)
400 X=7
410 CH=237+TS
420 GOSUB PRSUB
430 X=TS*14
440 IF TS==HS GOSUB OK ELSE GOSUB NO
450 WAIT(0.5,0)
460 FREE BAR
470 FREE TS
480 FREE HS
490 FREE CH
500 FREE X
510 LP+=1
520 WEND
530 IF SC==LP THEN PRINTF("PERFECT!!") ELSE PRINTF("SCORE:%d",SC)
540 WAIT(1.0,0)
550 EXIT(0)
560 @OK
570 CH='O'
580 GOSUB PRSUB
590 WA=0.25
600 SN=80
610 GOSUB SOSUB
620 SN=75
630 GOSUB SOSUB
640 SC+=1
650 RETURN
660 @NO
670 CH=232
680 GOSUB PRSUB
690 WA=0.5
700 SN=40
710 GOSUB SOSUB
720 RETURN
730 @SOSUB
740 SCHNOTE(0,SN)
750 SCHSTATE(0,1)
760 WAIT(WA,0)
770 SCHSTATE(0,0)
780 RETURN
790 @PRSUB
800 BAR=SETCHAR(X,CH,BAR)
810 PRINTF("%s",BAR)
820 RETURN

 今回はずいぶん長くなったけど、まず変数、
S(0):低い音の音程
S(1):高い音の音程
S(2):中間の音の音程
CS:低い・高い音の中間の数値
LP:クイズの回数
LV:難易度
HS:正解の方向
TS:タップした方向
SN:サウンドの音程
WA:ウェイト時間
SC:スコア
X:文字表示位置
CH:表示するキャラクター
BAR:表示用
I:ループ用

 サブルーチンは、
OK:正解の処理
NO:不正解の処理
SOSUB:サウンド演奏用
PRSUB:表示用

 サウンドの命令「SCHNOTE」では0〜128の数値が使えるが、自分が聞いて低すぎ・高すぎで不快に感じる音を外した範囲が、25〜90くらいだった。
 その範囲で、S(0)に低い音、S(1)に高い音をランダムに設定する。

 中間の音は、いきなりど真ん中に来るとどっちか分からないので、
「高い・低いの中間から、どちらかに70%寄った数値」になる計算をしている。
 そのため、中間の数値CS、右か左をランダムに決めるHSを設け、240行で計算をしている。
 と共に、回数を重ねるごとに難易度を上げようと、数値LVを設け、だんだん高い・低い音の差が縮むようにした。最後には結構近い音になる。

 音を鳴らすために音程SNと時間WAを設定して、表示はXに座標とCHにキャラクターコードを入れて、それぞれのサブルーチンに飛ばすようにしているが、その中で270行、

270     X=CLAMP(I*14,0,14)/CLAMP(I,1,2)

 これは、3つの音符を表示するX座標の計算だが、Iの数値が「0、1、2」に対してXが「0、14、7」になるようにしたかった。
 普通、数値がバラバラだから配列変数やIF文を使うけど、意地でも論理式でやりたかったという、くだらないこだわり。

 今回は表示とサウンド演奏、計算もかなり多く、結構長くなってしまった。
 おかげで制作中は、計算しきれずにエラーが頻繁に出たので、できるものは処理後に片っ端からFREEで数値をクリアしてメモリを確保している。
 でも以前はアプリが落ちていたものが、メモリ関係のエラーで済むようになったので、かなりデバッグしやすくなったと思う。



タグ:DPC-100 iPhone

posted by 司隆 at 20:57 | Comment(0) | Computer
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。