フラッシュ暗算(進化)


前回はフラッシュ暗算ゲームの基本部分のみを作成しました。
今回は前回のものに手を加えていき、よりゲームらしくしてみましょう。

まずは、解答時間に制限を設けてみる処理から追加してみます。
例えば、解答タイム10秒以内という処理を組み込む場合、
ボタンを押して解答する仕組みであったため、
ボタンでジャンプした後の処理を終えて戻ってきた時、カウントダウンを再開する形になります。
既に回答し終えているのにカウントダウンが再開されるのは不恰好ですから、
判定処理を終えた後はループを直ちに抜けるようにしなければなりません。
また、ループ中にボタンが押される時の処理はソレで良いとして、
時間切れになった時でも「時間切れ」として判定を行い結果を表示する必要がありますので、
ループの後でも判定処理を入れる必要があります。
もし、単純に判定処理をループ後にも追加する形にすると、
ループ中にボタンを押されている場合、判定処理を2回することになりますので、
無駄が生じないように「既にボタンを押しているなら再判定しないよう制御する」必要があります。
ココではボタンが押されていようが、時間切れになっていようが一度しか判定しない形にしました。

 1
 2
 3
 4
 5
6
*game_main
	gosub *game_init
	gosub *game_draw
	gosub *game_answer
	gosub *game_judge // 正誤判定および結果表示はこのタイミングで行う
	stop
 1
 2
 3
*click_button
	click = 1 // ボタンクリックフラグON
	return
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
*game_answer
	color 255, 255, 255 : boxf : color
	font msmincho, 15
	pos 10, 10 : mes "合計値を入力してください。"
	pos 10, 40 : input answer, 100, 20
	pos 10, 70 : button gosub "解答", *click_button // クリックフラグを付けるだけにする
	font msmincho, SIZE / 3 * 2
	click = 0
	repeat 10, 1
		wait 100
		if click : break // ボタンが押されたらカウントダウン終了
		redraw 0
		color 255, 255, 255 : boxf (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2 : color
		circle (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2, (ginfo_winx + SIZE) / 2, (ginfo_winy + SIZE) / 2
		color 255, 255, 255
		circle (ginfo_winx - SIZE + 15) / 2, (ginfo_winy - SIZE + 15) / 2, (ginfo_winx + SIZE - 15) / 2, (ginfo_winy + SIZE - 15) / 2, 0
		pos (ginfo_winx - SIZE / 3) / 2, (ginfo_winy - SIZE / 3 * 2) / 2
		mes 10 - cnt
		redraw 1
	loop
	font msmincho, 15
	return
上記のように*click_buttonラベルの追加、*game_mainラベルと*game_answerラベルの変更を行えばOK。 解答ボタンを押しても正誤判定は行わずボタンが押されたことのみを通知してループを抜けるようにします。 *game_judgeラベル内で行う判定処理は*game_mainラベル内からジャンプするよう変更したので、 カウントダウンループ中にボタンが押されていようがいまいが最終的に行われる判定は1回のみになります。 *game_answerラベルのループ内では、 ⑨…⑧…⑦…⑥…⑤…④…③…②…①…とカウントダウンの表示を行っているだけです。 HSP自体がウィンドウズ上でのみ正常動作するように作られたものなので意識する必要ないかもしれませんが、 数字変換を行った時に候補として出てくる上記の丸囲み数字は機種依存文字であり、 MAC等の別OSだと正常に表示されなくなるものなので使用すべきではないでしょう。 何より、下限は①、上限は⑳の20種類しか用意されていませんので、 21カウント以上使用したいときには丸囲み数字が使えません。 そこで、今回はHSP3から追加されたcircle命令と数字を組み合わせて丸囲み数字を表現し、 99カウントまで表示できるようにしてみました。 尚、99と言うのは数字の背景となる●の大きさの都合上2桁までとしているだけで、 ●をもっと大きくすれば3桁でも4桁でも表示することは出来ます。 とりあえず、カウントダウンの処理は以上の追加・変更だけで動きますので、 コレで置いておいて、続いての進化「ステージ制の導入」処理に移りましょう。 前回までは、3つの数字の合計を解答する問題1つだけでしたね。 今回は、1つ目の問題では3つの数字、2つ目の問題では4つの数字、 そして、3つ目の問題では5つの数字の合計を答えるように変更してみます。 変更する箇所は下記の4ラベルです。
 1
 2
 3
 4
 5
 6
#define SIZE 250

	num = 3, 4, 5 // 第1ステージ、第2ステージ、第3ステージ
	koma = 50
	objsize 100, 25
	randomize
 1
 2
 3
 4
 5
 6
 7
 8
 9
*game_main
	stage = 0
	foreach num
		gosub *game_init
		gosub *game_draw
		gosub *game_answer
		gosub *game_judge
	loop
	goto *init // 全問終えれば初期画面に戻る
 1
 2
 3
 4
 5
 6
 7
 8
*game_init
	answer = 0, 0
	dim question, num.stage // 保持配列の要素数を各問の表示個数分に変更する
	foreach question
		question.cnt = rnd(9) + 1
		answer.1 += question.cnt
	loop
	return
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
*game_judge
	clrobj
	color 255, 255, 255 : boxf : color
	pos 10, 10 : mes "入力:" + answer.0
	pos 10, 30 : mes "正解:" + answer.1
	pos 10, 60 : button gosub "次へ", *click_button // クリックフラグを付けるだけにする
	font msmincho, SIZE, 1
	pos (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2
	if answer.0 ! answer.1 {
		color 255
		mes "×"
	} else {
		color , , 255
		mes "○"
	}
	click = 0
	repeat
		wait 100
		if click : break // ボタンが押されるまで処理を先に進めないようにする
	loop
	stage++ // 次のステージへ進める
	return
まず、スクリプト冒頭の「1つの問題で表示する数字の個数」を配列にします。 今回は3問に増やすということなので「num = 3, 4, 5」の3要素だけですが、 例えばコレを「num = 3, 4, 5, 6, 7, 8」と変更すればコレだけで6問に増やすことが出来ます。 *game_mainラベルが問題数分同一の処理を繰り返すようにしている部分です。 前回まで行っていた*game_initラベルから*game_judgeラベルまでの処理を1問として、 配列変数numの要素数、つまり問題数分繰り返しています。 *game_judgeラベル内のボタンも*game_mainラベル内の解答ボタン同様に ボタンクリックしてもクリックフラグを立てるだけにして戻ってからループを抜けるよう変更しました。 今回はボタンが押されるまでループを続けるもので、解答時のように時間制限はありませんので、 *game_judgeラベルの16〜20行目のようなループとクリック用フラグを組み込めばOKです。 それでは、第2節最後の機能追加としてサウンドでも鳴らしてみましょうか。 …といっても、解答直後の正誤結果判定の正解音「ピンポン」と、誤解音「ブー」の2つだけです。 プログラム変更前に右記のリンクテキストより、正解音誤解音をダウンロードして、 スクリプトファイルと同じフォルダまたは、未保存の場合は初期カレントディレクトリに入れてください。 変更する箇所は次の2ラベルです。
 1
 2
 3
 4
 5
 6
 7
 8
#define SIZE 250

	num = 3, 4, 5
	koma = 50
	objsize 100, 25
	randomize
	mmload "error.wav", 0	// 誤解音
	mmload "correct.wav", 1	// 正解音
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
*game_judge
	clrobj
	color 255, 255, 255 : boxf : color
	pos 10, 10 : mes "入力:" + answer.0
	pos 10, 30 : mes "正解:" + answer.1
	pos 10, 60 : button gosub "次へ", *click_button
	font msmincho, SIZE, 1
	pos (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2
	if answer.0 ! answer.1 {
		color 255
		mes "×"
		mmplay 0 // 誤解音を鳴らす
	} else {
		color , , 255
		mes "○"
		mmplay 1 // 正解音を鳴らす
	}
	click = 0
	repeat
		wait 100
		if click : break
	loop
	stage++
	return
サウンドの単純再生に適しているmm系命令で再生します。 予め再生バッファ番号を指定してロードしておき、鳴らしたい箇所でプレイ処理するだけ。 簡単な変更だけですね。 コレで少しはプレイできるレベルとなりましたが、 実際に試してみると、2回目以降の解答時に入力ボックスを選択しなければならなかったり、 解答情報が表示されなくてわかりにくい等、微妙な点があったりします。 ソレらについては次回説明するとして今回は以上で終了です。 まとめてみたスクリプトはコチラからどうぞ。