おつぎはプログラミングです。
気になるところから調べてみしょう。
1.boolean型
ボタンのspeech:アクションから出題と解答を繰り返します。
ということで、現在出題中か、解答中かを認識している必要があります。
コントローラオブジェクトに状況を示す変数を作成します。
boolean型のデータとして、ボタンを押すたびにfalseとtrueを入れ替えれば良いでしょう。
cocoaにはBool型がありますので、flagという名のBool型変数を作ってしまいましょう。
このBool型は0と1を保有できるデータ型で、この数字がすなわち、falseとtrueにあたります。
内部変数として使用するので.hには記述しません。
2.乱数の発生
出題時は乱数を発生させる必要があります。 xillionが書いたのはこんな感じですのコード。srandに現在時刻(time(nil))を渡してランダムシードを作成します。
rnd()で乱数を発生させます。%9と指定すると0(より大)〜9(未満)で乱数を発生させます。これに11を足して、掛け算する数にします。aaはint型ですので結局11〜19となります。
同様bbは2〜19(ただし10は除く)を乱数で発生させますが、
while条件を後ろにおいているので、まずループ内の処理(乱数発生)を行ってから条件を判定します。
これらの乱数の範囲は、普段xillionが唱えている方法を単純にロジックにしたものです。
Macに喋らせる
objective-Cで読み上げはどうすれば良いでしょう。AppleScriptのsay命令に相当するものがある筈です。まずマニュアルを調べてみましょう。残念ながら'say'ではヒットしませんでした。次に'voice'で検索すると、NSSpeechSynthesizerクラスのvoiceメソッドがありました。スピーチシンセサイザーです。使い方としては、まず初期化して
synth = [ [ NSSpeechSynthesizer alloc ] init ];
テキストをわたせば良さそうです
[synth startSpeakingString:speakWords];
NSSpeechRecognizerもあり、音声認識が可能ですが、あまり認識率がよくないので
(1'ithi'、8'hathi'の区別ができないなど)アプリには組み込みませんでした。
あと、Macは日本語ができないので適当なテキストを探さなくてはなりません。
数字をテキストに変換するための配列を準備します。
配列の要素を指定する添字(番号)がそのまま、その数字の読み上げテキストになると言う具合です。
初期値として配列を作成します。
NSArrayというのがあるのでこれを使います。
配列の最後はnilが必要です。
テキスト(文字列)は試行錯誤してきめました。
また範囲ですが、1919361を”じゅうきゅうじゅうきゅうさんろくいち”と読むことからわかるように、0から19までつくっておけば大丈夫です。掛け算の答えは位取りせずに1桁ずつ数字を読み上げさせます。
この配列で出題の方はNSArrayのobjectAtIndex:メソッドで取り出せますが、答えの方はどうでしょう。出力する文字列のsubstringWithRange:NSMakeRangeメソッドで文字列(勿論ないようは数字)を1桁ずつ取り出すことが可能です。その取り出した文字列を数字に変換してNSArrayのobjectAtIndex:メソッドを使用します。
kai2 = [ dispWord substringWithRange:NSMakeRange(1,1) ];
speakWords =
[ [ speakWords stringByAppendingString: [ words bjectAtIndex: [ kai2 intValue ] ] ] stringByAppendingString:@" "];
if (intKai > 100) {
kai3 =[ dispWord substringWithRange:NSMakeRange(2,1) ];
speakWords = [ speakWords stringByAppendingString: [ words bjectAtIndex: [ kai3 intValue ] ] ];
}
}
解答部分は、表示させる文字列(中身は数字)を1文字ずつ取り出して、その数字に対応するテキストを配列から取り出します。掛け合わせる2つの数の範囲から解答は2桁と3桁の場合がありますので、3桁目は100より大(正確には100も3桁ですが10x10がないので。。)の場合に処理をしています。