- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 授業/C言語基礎/数当てゲーム へ行く。
数当てゲーム †
これまでに勉強したことを使って、次のような簡単な数当てゲームを作ります。
コンピューターがある数を一つ決め、プレイヤーがその数を当てます。 コンピューターは、プレイヤーが答えた数が正解よりも大きいか小さいかだけを教えます。
実行結果をイメージする †
プログラムを作るときは、まず、プログラムの実行結果をイメージします。
このプログラムを実行すると、まずはじめに、コンピューターが正解の数を決めます。 とりあえず、正解の数を33として話を進めます。
次に、コンピューターが、プレイヤーに数の入力を要求します。 入力を要求するメッセージは次のような感じにしましょう。
整数を入力してください:
ここで、プレイヤーが99と入力したとすると、99は正解の33より大きいので、「大きすぎる」というメッセージを出力し、もう一度、プレイヤーに入力を要求するメッセージを表示します。
整数を入力してください: 99 大きすぎます 整数を入力してください:
今度は、プレイヤーが11と入力したとすると、11は正解の33より小さいので、「小さすぎる」というメッセージを出力し、もう一度、プレイヤーに入力を要求するメッセージを表示します。
整数を入力してください: 99 大きすぎます 整数を入力してください: 11 小さすぎます 整数を入力してください:
プレイヤーが正解を入力すると、「正解」というメッセージを出力し、プログラムを終了します。
整数を入力してください: 99 大きすぎます 整数を入力してください: 11 小さすぎます 整数を入力してください: 33 正解!
このように、実行結果をイメージすることで、プログラムの中で、どんな処理が行われるのか、どんな処理が繰り返されるのかが、ある程度わかります。
フローチャートを作る †
次に、イメージした実行結果になるように、プログラムのフローチャート(またはアルゴリズム)を考えます。
このプログラムは、二つの部分に分けることができます。
- コンピューターがある数(正解)を一つ決める
- プレイヤーが答える
最初の、コンピューターがある数(正解)を一つ決めるところは、計算ゲームと同じように、乱数を使えばできます。 乱数の使い方がわからない場合は、自分で正解の値を決めてもかまいません。
その次の、プレイヤーが答えるところは、これまでに勉強した制御構造(条件分岐と繰り返し)を組み合わせて作ります。
この部分の中心は、ユーザーが答えて、それが正解よりも大きいか小さいかを教えるというものですから、キーボードからの入力と条件分岐を組み合わせると、次のようになります。
- scanf関数でキーボードから入力する
- if文で入力された数と正解を比べる
- 入力された数が正解よりも大きいならば、「大きすぎる」と表示する
- 入力された数が正解よりも小さいならば、「小さすぎる」と表示する
これを、正解が入力されるまで繰り返します。
この流れを、そのままフローチャートにすると、次のようになります。
ところが、これだと、繰り返しの部分がC言語の繰り返し処理のフローチャートと対応していないので、プログラムとして書きにくいです。
そこで、繰り返しの文をC言語の繰り返し処理のフローチャートに対応するように、フローチャートを書き直します。
プログラムを作る †
フローチャートができたら、プログラムを作ります。
乱数を使って正解の数を決める部分だけを作ると、次のようになります。
#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"); }
ここで、a はプレイヤーが入力した数を記憶しておくための変数です。
そこで、これを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; }
これで完成です(プログラム1)。
演習1 †
プログラム1を作成し、実行結果を確認せよ。