« そろそろオリジナルアプリをつくってみよう(その2) | メイン | そろそろオリジナルアプリをつくってみよう(その4) »

そろそろオリジナルアプリをつくってみよう(その3)

おつぎはプログラミングです。
気になるところから調べてみしょう。


1.boolean型


ボタンのspeech:アクションから出題と解答を繰り返します。
ということで、現在出題中か、解答中かを認識している必要があります。
コントローラオブジェクトに状況を示す変数を作成します。
boolean型のデータとして、ボタンを押すたびにfalseとtrueを入れ替えれば良いでしょう。
cocoaにはBool型がありますので、flagという名のBool型変数を作ってしまいましょう。
このBool型は0と1を保有できるデータ型で、この数字がすなわち、falseとtrueにあたります。
内部変数として使用するので.hには記述しません。

  BOOL flag;    - (IBAction)speech:(id)sender {      if (flag==false) {         ”出題ロジック”   } else {         ”解答ロジック”   }      flag = ! flag; }
shpeech;アクションの骨子です。 出題の状況変数flagの値をみて処理を振り分け最後にflagの値を書き換えます。 !はnotという意味です。not演算を行いtrueとflaseを入れ替えます。 booleanを使用するときにはよく使う手法でう。

2.乱数の発生

出題時は乱数を発生させる必要があります。 xillionが書いたのはこんな感じですのコード。
  int aa, bb;   srand(time(nil));   aa = rand() % 9 + 11;   do { bb = rand() % 18 + 2; } while (bb==10)

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というのがあるのでこれを使います。

  words =[ [ NSArray    arrayWithObjects:     @"mulle",@"ichi",@"knee",@"sun",@"yon",     @"ga",@"roq",@"nana",@"hech",@"queue",     @"joo",@"joo ichi",@"joo knee",@"joo san",@"joo yon",     @"joo ga",@"joo roq",@"joo nana",@"joo hech",@"joo ku",     nil ] retain ];

配列の最後はnilが必要です。
テキスト(文字列)は試行錯誤してきめました。
また範囲ですが、1919361を”じゅうきゅうじゅうきゅうさんろくいち”と読むことからわかるように、0から19までつくっておけば大丈夫です。掛け算の答えは位取りせずに1桁ずつ数字を読み上げさせます。
この配列で出題の方はNSArrayのobjectAtIndex:メソッドで取り出せますが、答えの方はどうでしょう。出力する文字列のsubstringWithRange:NSMakeRangeメソッドで文字列(勿論ないようは数字)を1桁ずつ取り出すことが可能です。その取り出した文字列を数字に変換してNSArrayのobjectAtIndex:メソッドを使用します。

  speakWords =   [ [ [ words objectAtIndex:aa ] stringByAppendingString:@" " ] stringByAppendingString:[words objectAtIndex:bb ] ];
出題のテキスト作成部分です。メッセージのネスとが多く読み取り難いですが、ランダムに発生させた2つの数字aaとbbのテキストを配列から取り出して、連結させています。単語を分けるために間にブランクを入れました。このブランクは配列のテキストに入れておいても良いでしょう。
  kai1 = [ dispWord substringWithRange:NSMakeRange(0,1) ];   speakWords = [ [ words objectAtIndex: [ kai1 intValue] ] tringByAppendingString:@" "];

  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がないので。。)の場合に処理をしています。


ひとつ前の投稿は「そろそろオリジナルアプリをつくってみよう(その2)」です。
次の投稿は「そろそろオリジナルアプリをつくってみよう(その4)」です。

トラックバック

このエントリーのトラックバックURL:
http://www.xillion.net/mova/mt-tb.cgi/292

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2008年02月29日 23:49に投稿されたエントリーのページです。

メインページアーカイブページも見てください。

Powered by
Movable Type 3.34