さて、繰り返し(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 残念でした。 続行するには何かキーを押してください・・・
解答例です。
#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する。
ループの外で、再度正解したかどうかチェックし、正解または不正解に応じたメッセージを表示する。
いかがでしたか、以前のサンプルゲームと比較して、繰り返しの要素を加えるだけで随分変化がありました。
今回はこの辺で終わりにしますが、まだまだ改良の余地はありそうです。
皆さん自身で考えてもっともっとゲーム性を高めてみてください。