★ゲームを作ろう2(ビッグorスモール)★
今回も繰り返しを使ったミニゲームを作ってみましょう。
今回作るゲームはコインゲームのポーカー等でよくあるダブルアップというシステムです。
ダブルアップとは、一種のボーナスゲームで、ポーカーの役に応じてもらえる配当を倍にできるチャンスを与えるというものです。
ポーカーゲームであれば、そのままトランプを使います。
色々システムはあるのですが、例えば1枚だけ表になっているカードがあり、次に配られるカードが表になっているカードより大きいか、小さいかを当てるというシステムを再現したいと思います。
では、実際に作ってみましょう。
このゲームは次の手順で作りたいと思います。
1.1〜13までの乱数を発生させる→これを「現在のカード」として扱う。
2.1〜13までの乱数を発生させる→これを「次のカード」として扱う。
3.「現在のカード」を表示し、この数値より大きいと思ったら0を小さいと思ったら1を入力させる。3.「次のカード」を表示する。
4.「次のカード」を表示する。
5.大きいを選択した上で、「現在のカード」より「次のカード」が小さければゲーム終了。
6.小さいを選択した上で、「現在のカード」より「次のカード」が大きければゲーム終了。
7.ゲーム終了でなければ「次のカード」を「現在のカード」とし、2へ戻る。
今回もいつ終わるか分かりませんので、無限ループを使って作ります。
上記の内容で作れそうだ、という方は早速作ってみてください。
イメージがわかないという方は手順を追って作っていきましょう。
まず、1の「現在のカード」を設定してみましょう。
「現在のカード」の値を入れておく変数名を「current」とします。
変数「current」に1〜13の値をセットします。
解答例です。
<sample program 048-01>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main( void )
{
int current;
srand((unsigned int)time(NULL));
current = rand() % 13 + 1;
return 0;
}
|
1〜13の値は、randで発生した乱数を13で割った余りに1を加算すると設定できます。
次に、2の「次のカード」を設定します。
「次のカード」用の変数名は「next」としましょう。
※繰り返しは後ほど設定します。
解答例です。
<sample program 048-02>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main( void )
{
int current;
int next;
srand((unsigned int)time(NULL));
current = rand() % 13 + 1;
next = rand() % 13 + 1;
return 0;
}
|
「next」も同じですね。
では、3を作成します。
まずは、入力を促すために「現在のカード」を表示し、「次のカード」が大きいと思ったら0、小さいと思ったら1を入力してもらうことを説明しなければなりません。
メッセージは以下のように表示してみます。
※「現在のカード」を8と仮定します。
次に配られるカードが「8」よりも大きいと思ったら0を、小さいと思ったら1を入力してください。
その後、0か1か入力します。
入力用の変数は「input」とします。
解答例です。
<sample program 048-03>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main( void )
{
int input;
int current;
int next;
srand((unsigned int)time(NULL));
current = rand() % 13 + 1;
next = rand() % 13 + 1;
printf( "次に配られるカードが「%d」よりも大きいと思ったら0を、", current );
printf( "小さいと思ったら1を入力してください。\n" );
scanf( "%d", &input );
return 0;
}
|
printfの1文が長い場合は、複数の行に分けることで見やすく出来ます。
続いて、4を作成します。
「次のカード」を表示するだけですので、以下のように簡単に表示しましょう。
※次のカードを3と仮定します。
次のカード「3」
解答例です。
<sample program 048-04>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main( void )
{
int input;
int current;
int next;
srand((unsigned int)time(NULL));
current = rand() % 13 + 1;
next = rand() % 13 + 1;
printf( "次に配られるカードが「%d」よりも大きいと思ったら0を、", current );
printf( "小さいと思ったら1を入力してください。\n" );
scanf( "%d", &input );
printf( "次のカード「%d」\n", next );
return 0;
}
|
ここまで作ると後は核心部分です。
5.大きいを選択した上で、「現在のカード」より「次のカード」が小さければゲーム終了。
※まだ繰り返しを組み込んでいませんので、「終了」という部分は文字を表示するだけにしておきます。
大きいを選択(0を入力)した上で、カードの比較を行います。
この処理は条件が2つ必要になります。
1つは「大きいを選択していること」
もう1つは「現在のカードより次のカードが小さいこと」
2つの条件をつなげるには「&&」と「||」がありましたね。
どちらが今回の処理にふさわしいでしょうか。
まず考えてからプログラムを作ってみてください。
解答例です。
<sample program 048-05>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main( void )
{
int input;
int current;
int next;
srand((unsigned int)time(NULL));
current = rand() % 13 + 1;
next = rand() % 13 + 1;
printf( "次に配られるカードが「%d」よりも大きいと思ったら0を、", current );
printf( "小さいと思ったら1を入力してください。\n" );
scanf( "%d", &input );
printf( "次のカード「%d」\n", next );
if( input == 0 && current > next ) {
printf( "終了\n" );
}
return 0;
}
|
<実行結果 VC++ Express Edition>
次に配られるカードが「10」よりも大きいと思ったら0を、小さいと思ったら1を入力してください。
0
次のカード「6」
終了
続行するには何かキーを押してください・・・
次も同じような処理ですからこのまま続けましょう。
6.小さいを選択した上で、「現在のカード」より「次のカード」が大きければゲーム終了。
※これも終了部分は文字を表示することとします。
解答例です。
<sample program 048-06>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main( void )
{
int input;
int current;
int next;
srand((unsigned int)time(NULL));
current = rand() % 13 + 1;
next = rand() % 13 + 1;
printf( "次に配られるカードが「%d」よりも大きいと思ったら0を、", current );
printf( "小さいと思ったら1を入力してください。\n" );
scanf( "%d", &input );
printf( "次のカード「%d」\n", next );
if( input == 0 && current > next ) {
printf( "終了\n" );
}
if( input == 1 && current < next ) {
printf( "終了\n" );
}
return 0;
}
|
<実行結果 VC++ Express Edition>
次に配られるカードが「5」よりも大きいと思ったら0を、小さいと思ったら1を入力してください。
1
次のカード「8」
終了
続行するには何かキーを押してください・・・
ここまで出来たら繰り返しを組み込んでみましょう。
7.ゲーム終了でなければ「次のカード」を「現在のカード」とし、2へ戻る。
「次のカード」を「現在のカード」とすることは非常に重要なことです。
最初のカードが「7」であったと仮定します。
次のカードが大きいと考え、0を入力したとします。
実際に次のカードが「10」であった場合は、考えが当たったわけですから、次のゲームに進みます。
次のゲームに進む際には、現在のカードは「7」から「10」に変わっていなければなりません。
その上で、新しく次のカードを配るのです。
繰り返しの範囲も考えながら作ってみてください。
また、if文の中身も「printf( "終了\n"
);」ではなく、繰り返しから抜ける「break;」に変更します。
解答例です。
<sample program 048-07>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main( void )
{
int input;
int current;
int next;
srand((unsigned int)time(NULL));
current = rand() % 13 + 1;
while(1) {
next = rand() % 13 + 1;
printf( "次に配られるカードが「%d」よりも大きいと思ったら0を", current );
printf( "小さいと思ったら1を入力してください。\n" );
scanf( "%d", &input );
printf( "次のカード「%d」\n", next );
if( input == 0 && current > next ) {
break;
}
if( input == 1 && current < next ) {
break;
}
current = next;
}
return 0;
}
|
<実行結果 VC++ Express Edition>
次に配られるカードが「5」よりも大きいと思ったら0を、小さいと思ったら1を入力してください。
0
次のカード「8」
次に配られるカードが「8」よりも大きいと思ったら0を、小さいと思ったら1を入力してください。
0
次のカード「1」
続行するには何かキーを押してください・・・
これで、ダブルアップの基本部分は完成しました。
後は皆さんで考え、得点を導入する等のプログラムを追加してみてください。