« モールス受信練習機でタイマとメトロノームを作ってみる(1/3) | メイン | 拡張PIC16実験 和文モールス受信練習機へ(7) »

モールス受信練習機を乱数で遊んでみる(2/2)


 乱数といえば、おみくじというのもありますね。そこで、引いたくじによって音が変わるおみくじを作ってみます。

0から9の乱数を作る
 おみくじの種類を10種類としてみます。とすると10通りの値が求められればOKです。それならば10で割ったあまりを変数nに代入するなら、
n = rand() % 10;
となります。nの値は0から9までの範囲になります。

if文を使おう
 if文は、
if (条件式) {
   文
}
として使います。文のところには条件が成り立つときに実行したい文を書きます。条件が成り立たないときに実行したい文があるなら、
if (条件式) {
   文
} else {
  文2
}
と else をつけて文2のところに書きます。elseはどんどん長くしてもかまいません。

条件式の書き方
 条件式のところに書くのは二つの変数や式の値の比較を書くのが基本です。a==b, a<b, a>b, a<=b, a>=b は、それぞれaとbが等しい、aがb未満、aがbより大きい、aがb以下、aがb以上の時に条件が成り立ちます。二つ以上の式は、&& (かつ) || (または) でつなぐことができます。また式が成り立つことを否定する ! が使えます。たとえば aとbとcが一致していることを条件式で書くには、
if (a == b && b ==c) {

}
とします。

モールス符号を出してみる
 サイコロのように出た数字の回数だけ音を鳴らすと、だんだんと長くなってしまいます。そこでモールス符号で音を出してみます。モールス符号では数値を五つの短点と長点の組み合わせで表します。1から5は、その数の回数だけ短い音を出し、残りの回数は長い音を出します。6から9では、その数から5を引いた回数だけ長い音を出し、残りの回数は短い音を出します。0については、5回長い音を出します。

 そこで作ってみたのが次のmain関数です。if文でnが0の時、nが5以下の時(n=1から5)、それ以外の時(n=6から9)に場合分けをしています。それぞれで、forループを使って音を作っています。

void
main(void)
{
    int i, n;

    init();                 // 初期化

    for (;;) {
        while (BIT_SW != 0) // タクト・スイッチ SW1 が押されるまで待つ
        {
            n = rand() % 10;     // 乱数 (0から32767)を10で割った余りは0から9
        }

        // モールス符号を作る
        // 0: -----
        // 1: .---- 2: ..--- 3: ...-- 4: ....- 5: .....
        // 6: -.... 7: --... 8: ---.. 9: -----
        // なので
        // n=0: 長点を5回出す
        // n=1から5: 短点をn回出し、長点を(5-n)回出す
        // n=6から10: 長点を(n-5)回出し、長点を(10-n)={5-(n-5)}回出す
        //             n=10のときは、モールス符号の 0 を出す
        // とすればいい
        if (n==0) {
            for (i=0; i<5; i++) {
                beep(1200, 300);
                delay100ms(2);
            }
        } else if (n<=5) {
            for (i=0; i<n; i++) {
                beep(1200, 100);
                delay100ms(2);
            }
            for (i=n; i<5; i++) {
                beep(1200, 300);
                delay100ms(2);
            }
        } else {
            n = n-5;
            for (i=0; i<n; i++) {
                beep(1200, 300);
                delay100ms(2);
            }
            for (i=n; i<5; i++) {
                beep(1200, 100);
                delay100ms(2);
            }
        }
    }
}

おみくじを作ってみる
 簡単なおみくじのmain関数を作ってみました。nが0のときにはサイレンのような音をならします(外れ)。nが1の時にはあたりとしてメロディを流します。nが2の時には低い音を出します(ちょっと外れ)。それ以外の時には1000Hzのビープ音を流します。自分なりのおみくじを考えると面白いですね。

 さいごに、紹介したmain関数を書いてあるEJ-sound - timer2.zipを用意しておきました。main関数がいくつかあるので、試したいmain関数の前の#if 0 を #if 1 に変えます。#if 0から#endifで囲まれた部分はコメント同様にコンパイルに影響しないので、このように複数のmain関数を書くことができます。

void
main(void)
{
    int i, n;

    init();                 // 初期化

    for (;;) {
        while (BIT_SW != 0) // タクト・スイッチ SW1 が押されるまで待つ
            {
        n = rand() % 10;     // 乱数 (0から32767)を10で割った余りは0から9
        }

        if (n == 0) {
        for (i=0; i<15; i++) {
            beep(1200, 100);
            beep(880, 100);                
        }
        } if (n == 1) {
        play_melody("c2G1G1A2G2 3B3c3");
        } if (n == 2) {
        beep(440, 300);
        } else {
        beep(1000, 100);
        }
            delay100ms(2);        // 0.2秒間スイッチに反応しない時間を作る
    }
}
(光永 法明)

カテゴリ:

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/6640





カテゴリ

会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。

Powered by
Movable Type 4.1
/*yahoo remove*/