★ゲームを作ろう2(数当て)★
さて、繰り返し(while)の練習も随分とやってきましたので、ゲームを題材にこれまでやってきたことのおさらいをしましょう。
いきなり新しいゲームを作るのではなく、以前作った数当て(024.htm)に繰り返しの要素を加えてみます。
まずは、以前のサンプルを見てみましょう。
<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.正解したらプログラムを終了する。
<実行結果 VC++ Express Edition>
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;
}
|
<実行結果 VC++ Express Edition>
1〜10までの整数を入力してください:4
1〜10までの整数を入力してください:3
1〜10までの整数を入力してください:1
正解です!
続行するには何かキーを押してください・・・
正解するまで何度でもチャンスがあるのを、無限ループを使って実現しています。
無限ループを加えるだけだと、正解しても繰り返しから抜け出せませんので、break文を使って抜け出せるようにしてあります。
では、さらに改良してみます。
何度でもチャンスがあるため、必ずいつかは正解できます。
単純に考えると1から順番に数値を入力していけば、絶対に正解できますね。
これでは、面白くありませんので、少しゲーム性を持たせるため、以下のプログラムを追加してみましょう。
3.何回目のチャレンジで正解したかを表示する。
<実行結果 VC++ Express Edition>
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;
}
|
<実行結果 VC++ Express Edition>
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;
}
|
<実行結果 VC++ Express Edition>
1〜10までの整数を入力してください:-1
1〜10までの整数を入力してください:15
1〜10までの整数を入力してください:0
1〜10までの整数を入力してください:4
1回目で正解しました!
続行するには何かキーを押してください・・・
1〜10以外の数値を入れてもカウントせず、範囲内の数値だけ正解かどうかのチェックを行います。
続いて以下のプログラムを追加してみましょう。
5.現在何回目のチャレンジか、を表示する。
カウンタをうまく利用すれば出来ると思います。
<実行結果 VC++ Express Edition>
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;
}
|
<実行結果 VC++ Express Edition>
1回目のチャレンジです。
1〜10までの整数を入力してください:1
2回目のチャレンジです。
1〜10までの整数を入力してください:0
1〜10までの整数を入力してください:3
3回目のチャレンジです。
1〜10までの整数を入力してください:4
3回目で正解しました!
続行するには何かキーを押してください・・・
入力前にカウンタをそのまま表示すると、「0回目のチャレンジです。」と表示されてしまうので、カウンタに1を加えた数値を表示するようにしてみました。
では次に、チャレンジできる回数を制限してみましょうか。
6.全部で5回しかチャレンジ出来ないようにする
<実行結果 VC++ Express Edition>
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;
}
|
<実行結果 VC++ Express Edition>
1回目のチャレンジです。
1〜10までの整数を入力してください:1
2回目のチャレンジです。
1〜10までの整数を入力してください:3
3回目のチャレンジです。
1〜10までの整数を入力してください:4
4回目のチャレンジです。
1〜10までの整数を入力してください:7
5回目のチャレンジです。
1〜10までの整数を入力してください:9
続行するには何かキーを押してください・・・
何度でもチャンスがあったので、無限ループにしていましたが、回数に制限をつけるため、繰り返し条件をつけました。
随分ゲーム性が上がってきたと思いませんか。
最後に以下のプログラムを追加してください。
7.5回のチャレンジで正解しない場合、「残念でした。」と表示する。
最終的に、正解したのか外したのかをどのようにチェックするかが鍵です。
<実行結果 VC++ Express Edition>
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;
}
|
<実行結果 VC++ Express Edition>
1回目のチャレンジです。
1〜10までの整数を入力してください:1
2回目のチャレンジです。
1〜10までの整数を入力してください:3
3回目のチャレンジです。
1〜10までの整数を入力してください:4
4回目のチャレンジです。
1〜10までの整数を入力してください:7
5回目のチャレンジです。
1〜10までの整数を入力してください:9
残念でした。
続行するには何かキーを押してください・・・
方法は色々ありますが、今回は以下のように変更してみました。
正解した場合、メッセージは表示せずそのままbreakする。
ループの外で、再度正解したかどうかチェックし、正解または不正解に応じたメッセージを表示する。
いかがでしたか、以前のサンプルゲームと比較して、繰り返しの要素を加えるだけで随分変化がありました。
今回はこの辺で終わりにしますが、まだまだ改良の余地はありそうです。
皆さん自身で考えてもっともっとゲーム性を高めてみてください。