授業/C言語基礎/数当てゲーム のバックアップ(No.2)


数当てゲーム

これまでに勉強したことを使って、次のような簡単な数当てゲームを作ります。

 コンピューターがある数を一つ決め、プレイヤーがその数を当てます。
 コンピューターは、プレイヤーが答えた数が正解よりも大きいか小さいかだけを教えます。

実行結果をイメージする

プログラムを作るときは、まず、プログラムの実行結果をイメージします。

最初に、このゲームを実行すると、コンピューターがプレイヤーに入力を要求します。 プレイヤーがキーボードから数を入力すると、コンピューターが、それに対してメッセージを出力します。 これを、正解するまで繰り返します。

したがって、次のような感じになるようにプログラムを作ります。

整数を入力してください:
99
大きすぎます
整数を入力してください:
11
小さすぎます
整数を入力してください:
33
正解!

実行結果をイメージすることで、どんな処理が行われるのか、どんな処理が繰り返されるのかが、ある程度明確になります。

フローチャートを作る

次に、プログラムを書き始める前に、フローチャート(またはアルゴリズム)を考えます。

このプログラムは、二つの部分に分けることができます。

  1. コンピューターがある数(正解)を一つ決める
  2. プレイヤーが答える

最初の、コンピューターがある数(正解)を一つ決めるところは、計算ゲームと同じように、乱数を使えばできます。 乱数の使い方がわからない場合は、自分で正解の値を決めてもかまいません。

その次の、プレイヤーが答えるところは、これまでに勉強した制御構造(条件分岐と繰り返し)を組み合わせて作ります。

この部分の中心は、ユーザーが答えて、それが正解よりも大きいか小さいかを教えるというものですから、キーボードからの入力と条件分岐を組み合わせると、次のようになります。

  1. scanf関数でキーボードから入力する
  2. if文で入力された数と正解を比べる
    • 入力された数が正解よりも大きいならば、「大きすぎる」と表示する
    • 入力された数が正解よりも小さいならば、「小さすぎる」と表示する

これを、正解が入力されるまで繰り返します。

これを、そのままフローチャートにすると、次のようになります。

number1.png

ところが、これだと、繰り返しの部分がC言語の繰り返し処理のフローチャートと対応していないので、プログラムとして書きにくいです。

そこで、繰り返しの文をC言語の繰り返し処理のフローチャートに対応するように、フローチャートを書き直します。

number2.png

プログラムを作る

フローチャートができたら、プログラムを作ります。

乱数を使って正解の数を決める部分だけを作ると、次のようになります。

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

int main(void) {
  int r;

  srand((unsigned int) time(NULL));  // 乱数のシード
  r = rand() % 100 + 1;

  return 0;
}

ここでは、正解の数は、1から100までの整数としています。 rand関数、srand関数、time関数の使い方については、計算ゲームを復習しましょう。

次に、その後の繰り返し処理を形だけ作ります。

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

int main(void) {
  int r;

  srand((unsigned int) time(NULL));  // 乱数のシード
  r = rand() % 100 + 1;

  while (1) {


  }
  printf("正解!\n");

  return 0;
}

ただし、これだとコンパイル時にwhile文の繰り返し条件でエラーになりますので、実際には、条件を 1 にしておくといいです。(忘れないように注意が必要です。)

条件を考えるのは後にして、先に、繰り返し処理の中を考えましょう。 繰り返し処理の中だけを考えると、次のようになります。

  printf("1から100までの整数を入力してください:\n");
  scanf("%d", &a);
  if (a > r) {
    printf("大きすぎます\n");
  } else if (a < r) {
    printf("小さすぎます\n");
  }

そこで、これをwhile文の波括弧 { } の中にいれて、新しく登場した変数 a の宣言を追加します。

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

int main(void) {
  int r, a;

  srand((unsigned int) time(NULL));  // 乱数のシード
  r = rand() % 100 + 1;

  while (1) {
    printf("1から100までの整数を入力してください:\n");
    scanf("%d", &a);
    if (a > r) {
      printf("大きすぎます\n");
    } else if (a < r) {
      printf("小さすぎます\n");
    }
  }
  printf("正解!\n");

  return 0;
}

正解でない間、繰り返すので、繰り返し条件は「a と r が等しくない」という式になります。 また、最初は、繰り返し条件を必ず満たすようにしなければならないので、a の値を1から100まででない値に初期化します。

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

int main(void) {
  int r, a;

  srand((unsigned int) time(NULL));  // 乱数のシード
  r = rand() % 100 + 1;

  a = -1;
  while (a != r) {
    printf("1から100までの整数を入力してください:\n");
    scanf("%d", &a);
    if (a > r) {
      printf("大きすぎます\n");
    } else if (a < r) {
      printf("小さすぎます\n");
    }
  }
  printf("正解!\n");

  return 0;
}

これで完成です。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS