★ゲームを作ろう2(数当て)★


さて、繰り返し(while)の練習も随分とやってきましたので、ゲームを題材にこれまでやってきたことのおさらいをしましょう。

いきなり新しいゲームを作るのではなく、以前作った数当てに繰り返しの要素を加えてみます。

まずは、以前のサンプルを見てみましょう。


<sample program 024-01>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int number;
    int input;

    srand((unsigned int)time(NULL));

    number = rand() % 10 + 1;

    printf("1〜10までの整数を入力してください:");

    scanf("%d", &input);

    if (input == number) {
        printf("正解です!\n");
    }

    return 0;
}

乱数を発生させて作った1〜10までの数値を当てるゲームです。

しかし、繰り返しの概念が入っていないため、1回しかチャンスがありませんでした。


これを以下のように変更してみましょう。

  1.一度乱数が決まったら正解するまで何度でもチャンスがある。

  2.正解したらプログラムを終了する。

<実行結果>

1〜10までの整数を入力してください:5
1〜10までの整数を入力してください:6
1〜10までの整数を入力してください:3
1〜10までの整数を入力してください:8
正解です!
続行するには何かキーを押してください・・・









































解答例の前にヒントです。

※すでに完成している人は飛ばしてください。

正解するまで何度でもチャンスがあるということは、繰り返し回数が決まっていないということです。

さらに、正解したらプログラムを終了するのですから、繰り返し回数が決まっていない「繰り返し」から抜け出す方法を考えなければなりません。









































解答例です。


<sample program 047-01>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int number;
    int input;

    srand((unsigned int)time(NULL));

    number = rand() % 10 + 1;

    while (1) {

        printf("1〜10までの整数を入力してください:");

        scanf("%d", &input);

        if (input == number) {
            printf("正解です!\n");
            break;
        }
    }

    return 0;
}

<実行結果>

1〜10までの整数を入力してください:4
1〜10までの整数を入力してください:3
1〜10までの整数を入力してください:1
正解です!
続行するには何かキーを押してください・・・

正解するまで何度でもチャンスがあるのを、無限ループを使って実現しています。

無限ループを加えるだけだと、正解しても繰り返しから抜け出せませんので、break文を使って抜け出せるようにしてあります。


では、さらに改良してみます。

何度でもチャンスがあるため、必ずいつかは正解できます。

単純に考えると1から順番に数値を入力していけば、絶対に正解できますね。

これでは、面白くありませんので、少しゲーム性を持たせるため、以下のプログラムを追加してみましょう。

  3.何回目のチャレンジで正解したかを表示する。

<実行結果>

1〜10までの整数を入力してください:1
1〜10までの整数を入力してください:10
1〜10までの整数を入力してください:5
1〜10までの整数を入力してください:7
4回目で正解しました!
続行するには何かキーを押してください・・・









































解答例の前にヒントです。

※すでに完成している人は飛ばしてください。

今何回目のチャレンジか、を数えるにはカウンタが必要ですね。









































解答例です。


<sample program 047-02>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int number;
    int input;
    int counter;

    srand((unsigned int)time(NULL));

    number = rand() % 10 + 1;

    counter = 0;

    while (1) {

        printf("1〜10までの整数を入力してください:");

        scanf("%d", &input);

        counter++;

        if (input == number) {
            printf("%d回目で正解しました!\n", counter);
            break;
        }
    }

    return 0;
}

<実行結果>

1〜10までの整数を入力してください:1
1回目で正解しました!
続行するには何かキーを押してください・・・

入力した値と正解を比較する前にカウンタを増加させています。

方法は色々あるのですが、実行結果のように1回目で正解したら1回目と表示しなければならないためです。


次に、1〜10までの整数を入力するようになっていますので、以下のプログラムを追加してみましょう。

  4.入力する数値の範囲チェックを行う。

数値のチェック方法、覚えていますか。









































解答例です。


<sample program 047-03>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int number;
    int input;
    int counter;

    srand((unsigned int)time(NULL));

    number = rand() % 10 + 1;

    counter = 0;

    while (1) {

        do {
            printf("1〜10までの整数を入力してください:");
            scanf("%d", &input);
        } while (input < 1 || input > 10);

        counter++;

        if (input == number) {
            printf("%d回目で正解しました!\n", counter);
            break;
        }
    }

    return 0;
}

<実行結果>

1〜10までの整数を入力してください:-1
1〜10までの整数を入力してください:15
1〜10までの整数を入力してください:0
1〜10までの整数を入力してください:4
1回目で正解しました!
続行するには何かキーを押してください・・・

1〜10以外の数値を入れてもカウントせず、範囲内の数値だけ正解かどうかのチェックを行います。


続いて以下のプログラムを追加してみましょう。

  5.現在何回目のチャレンジか、を表示する。

カウンタをうまく利用すれば出来ると思います。

<実行結果>

1回目のチャレンジです。
1〜10までの整数を入力してください:1
2回目のチャレンジです。
1〜10までの整数を入力してください:0
1〜10までの整数を入力してください:3
3回目のチャレンジです。
1〜10までの整数を入力してください:4
3回目で正解しました!
続行するには何かキーを押してください・・・









































解答例です。


<sample program 047-04>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int number;
    int input;
    int counter;

    srand((unsigned int)time(NULL));

    number = rand() % 10 + 1;

    counter = 0;

    while (1) {

        printf("%d回目のチャレンジです。\n", counter + 1);

        do {
            printf("1〜10までの整数を入力してください:");
            scanf("%d", &input);
        } while (input < 1 || input > 10);

        counter++;

        if (input == number) {
            printf("%d回目で正解しました!\n", counter);
            break;
        }
    }

    return 0;
}

<実行結果>

1回目のチャレンジです。
1〜10までの整数を入力してください:1
2回目のチャレンジです。
1〜10までの整数を入力してください:0
1〜10までの整数を入力してください:3
3回目のチャレンジです。
1〜10までの整数を入力してください:4
3回目で正解しました!
続行するには何かキーを押してください・・・

入力前にカウンタをそのまま表示すると、「0回目のチャレンジです。」と表示されてしまうので、カウンタに1を加えた数値を表示するようにしてみました。


では次に、チャレンジできる回数を制限してみましょうか。

  6.全部で5回しかチャレンジ出来ないようにする

<実行結果>

1回目のチャレンジです。
1〜10までの整数を入力してください:1
2回目のチャレンジです。
1〜10までの整数を入力してください:3
3回目のチャレンジです。
1〜10までの整数を入力してください:4
4回目のチャレンジです。
1〜10までの整数を入力してください:7
5回目のチャレンジです。
1〜10までの整数を入力してください:9
続行するには何かキーを押してください・・・









































解答例です。


<sample program 047-05>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int number;
    int input;
    int counter;

    srand((unsigned int)time(NULL));

    number = rand() % 10 + 1;

    counter = 0;

    while (counter < 5) {

        printf("%d回目のチャレンジです。\n", counter + 1);

        do {
            printf("1〜10までの整数を入力してください:");
            scanf("%d", &input);
        } while (input < 1 || input > 10);

        counter++;

        if (input == number) {
            printf("%d回目で正解しました!\n", counter);
            break;
        }
    }

    return 0;
}

<実行結果>

1回目のチャレンジです。
1〜10までの整数を入力してください:1
2回目のチャレンジです。
1〜10までの整数を入力してください:3
3回目のチャレンジです。
1〜10までの整数を入力してください:4
4回目のチャレンジです。
1〜10までの整数を入力してください:7
5回目のチャレンジです。
1〜10までの整数を入力してください:9
続行するには何かキーを押してください・・・

何度でもチャンスがあったので、無限ループにしていましたが、回数に制限をつけるため、繰り返し条件をつけました。

随分ゲーム性が上がってきたと思いませんか。


最後に以下のプログラムを追加してください。

  7.5回のチャレンジで正解しない場合、「残念でした。」と表示する。

最終的に、正解したのか外したのかをどのようにチェックするかが鍵です。

<実行結果>

1回目のチャレンジです。
1〜10までの整数を入力してください:1
2回目のチャレンジです。
1〜10までの整数を入力してください:3
3回目のチャレンジです。
1〜10までの整数を入力してください:4
4回目のチャレンジです。
1〜10までの整数を入力してください:7
5回目のチャレンジです。
1〜10までの整数を入力してください:9
残念でした。
続行するには何かキーを押してください・・・









































解答例です。


<sample program 047-06>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int number;
    int input;
    int counter;

    srand((unsigned int)time(NULL));

    number = rand() % 10 + 1;

    counter = 0;

    while (counter < 5) {

        printf("%d回目のチャレンジです。\n", counter + 1);

        do {
            printf("1〜10までの整数を入力してください:");
            scanf("%d", &input);
        } while (input < 1 || input > 10);

        counter++;

        if (input == number) {
            break;
        }
    }

    if (input == number) {
        printf("%d回目で正解しました!\n", counter);
    }
    else {
        printf("残念でした。\n");
    }

    return 0;
}

<実行結果>

1回目のチャレンジです。
1〜10までの整数を入力してください:1
2回目のチャレンジです。
1〜10までの整数を入力してください:3
3回目のチャレンジです。
1〜10までの整数を入力してください:4
4回目のチャレンジです。
1〜10までの整数を入力してください:7
5回目のチャレンジです。
1〜10までの整数を入力してください:9
残念でした。
続行するには何かキーを押してください・・・

方法は色々ありますが、今回は以下のように変更してみました。

正解した場合、メッセージは表示せずそのままbreakする。

ループの外で、再度正解したかどうかチェックし、正解または不正解に応じたメッセージを表示する。


いかがでしたか、以前のサンプルゲームと比較して、繰り返しの要素を加えるだけで随分変化がありました。

今回はこの辺で終わりにしますが、まだまだ改良の余地はありそうです。

皆さん自身で考えてもっともっとゲーム性を高めてみてください。


次へ

戻る

目次へ