C言語でBINGOを作ろう #11 BINGO Machine試作1号機
C言語でBINGOを作ろう!
C言語でBINGOを作ろう!
CUI上で動くビンゴゲームの完成目指してひっそりとプログラムの勉強を始めました。前回は二次元配列の使い方を紹介しました。今回からはいよいよビンゴを作り始めます。
前回はタイトルに何回目か書き忘れたYO!!
開発環境
また、C言語の開発環境を構築したい場合は以下を参考にしてください。
コマンドプロンプトからサクラエディタを起動できるようにしてみた前編
コマンドプロンプトからサクラエディタを起動できるようにしてみた後編
本記事は以上の設定を行っている前提で説明を行います。
BINGO Machineを作ろう
BINGO Machineとは
BINGO Machineとは、ビンゴの抽選の機械です。
未来予想z 完成予想図は↓こんな感じ
・・・いったいどうやればこんな風になるんだ・・・!?
BINGO Machineの構造
どんなプログラムも、いきなり作れる人はいません。それはBINGO Machineでも同じです。まずはプログラムの全体像を考えてみましょう。
このBINGO Machineにはどんな機能が必要でしょうか。挙げてみましょう。
・数字を選ぶ
最低限必要な機能です。数字を選べないとBINGO Machineとは呼べませんね。
・抽選結果を表示する
数字を選んでも、どの数字が出たのかを知る手段がないと抽選には使えません。
細かい機能は追々足していくとして、この機能が無いとBINGO Machineとは言えませんね。もう少し各機能を見てみましょう。
機能1 数字を選ぶ
数字を選ぶには
・数字をランダムに選ぶ
・結果を保存する
・同じ数字は2度出さない
といった機能が必要です。
機能2 抽選結果を表示する
抽選結果を表示するには
・保存されている結果を読み込む
・結果によって表示を切り替える
といった機能が必要です。
こうして見ると、どちらの機能も数字の保存が必須です。また、数字を選ぶためにはランダムに数字を選ぶことが必要です。ランダムな数字は乱数(正確には疑似乱数)を用いて取得します。
乱数はrand()関数を使用することで比較的手軽に利用できます。
(ただし、rand()関数にはいろいろな問題がありますので、実際のプログラムではメルセンヌツイスタなどの利用をおすすめします。)
プログラム(sample11_00.c)
#include <stdio.h> #include <stdlib.h> int main(void){ int num; int i = 0; for(i = 0; i < 5; i++){ num = rand(); printf("num = %d\n", num); } return 0; }
実行結果
>gcc -o Sample11_00.exe Sample11_00.c >Sample11_00 num = 41 num = 18467 num = 6334 num = 26500 num = 19169
実行してみるとわかりますが、実際にはこのプログラムは何度実行しても同じ数字が出てきます。これは、乱数を作り出すための初期値(初期SEED)が設定されていないためです。
この状態では何度動かしても、同じ数字が同じ順番で出てきます。そこで初期SEEDを設定する必要があります。初期SEEDの設定にはsrand()関数を利用します。
srand(int seed);
例えば下のような感じです。
プログラム(sample11_01.c)
#include <stdio.h> #include <stdlib.h> int main(void){ srand(7); //7の代わりにいろいろな数字を入れて試してみてください。 int num; int i = 0; for(i = 0; i < 5; i++){ num = rand(); printf("num = %d\n", num); } return 0; }
実行結果
>gcc -o Sample11_01.exe Sample11_01.c >Sample11_01 num = 61 num = 17422 num = 15215 num = 7040 num = 15521
初期SEEDに設定されている値(7)をほかの数字に変更すれば様々な乱数が出てきます。
これで様々な数字が出るようになりました。
では早速BINGO Machineを作ってみましょう。いろいろ問題あるけど気にしないw
BINGO Machine 試作1号機
BINGO Machine 試作1号機
プログラム(sample11_02.c)
#include <stdio.h> #include <stdlib.h> int main(void){ srand(7); int num = 0; printf("抽選を開始します。\r\n"); while(1){ printf("(Enterを押してください)\n"); char ch = getc(stdin); //キーボードからなにか入力するまで画面を一時停止する。 num = rand(); printf("%02dが出ました。\r\n", num); } return 0; }
キーボードから文字を入力するごとに抽選が行われます。(10行目でキーボードからの入力を受け付けている。) そのため、12345と入力すれば連続で6回※抽選されます。 ※Enterキーの入力もカウントします。 10行目を消すととんでもないことになります。やるなよ、絶対にやるなよ!!↓の行の強制終了の方法知らないとテンパるから絶対やるなよ!!!!また、このBINGO Machineは無限ループします。終了する際は Ctrl + c で強制停止してください。 実行結果↓・・・あれ、とんでもなく大きな数字が出ている・・・!?
おまけ
今回はwhile文で無限ループさせていますが、for文を使ったり、ループカウンタを導入したりすれば決まった回数だけ抽選することも可能です。
ということで、今日の宿題は↑これw
て、手抜きや。。。w
宿題コーナー
夏は終わっても、夏休みの宿題は終わらないぜ!! 宿題のコーナーです。
前回の宿題と解答例
前回の宿題は、「要素数3×4のint型の配列numを準備してください。
その後、一度各要素の値を0で初期化してください。
その後、numの要素に好きな値を代入してください。
最後に、numの要素をすべて表示してください」でした。前回同様、長い・・・w
解答は以下の通りです。確認用コードの行を外すと、実際にrowやcol、初期化直後のnumの各要素の値が表示されます。
解答例(homework10.c)
#include <stdio.h> int main(void){ /* 要素数3x4の二次元配列作成 */ int num[3][4]; /* 行数row、列数colの取得 */ int row = sizeof(num) / sizeof(num[0]); int col = sizeof(num[0]) / sizeof(num[0][0]); //printf("row = %d\n", row); //確認用コード //printf("col = %d\n", col); //確認用コード int i = 0; int j = 0; /* 0で初期化 */ for(i = 0; i < row; i++){ for(j = 0; j < col; j++){ num[i][j] = 0; //printf("num[%d][%d] = %d\n", i, j, num[i][j]); //確認用コード } } /* numに値を代入 */ for(i = 0; i < row; i++){ for(j = 0; j < col; j++){ num[i][j] = 10 * i + j; } } /* numの中身を表示 */ for(i = 0; i < row; i++){ for(j = 0; j < col; j++){ printf("num[%d][%d] = %d\n", i, j, num[i][j]); } } return 0; }
実行結果※表示される数値は自分が作ったプログラム通りのものであれば下の通りである必要はありません。
>gcc homework10.c -o homework10.exe >homework10 num[0][0] = 0 num[0][1] = 1 num[0][2] = 2 num[0][3] = 3 num[1][0] = 10 num[1][1] = 11 num[1][2] = 12 num[1][3] = 13 num[2][0] = 20 num[2][1] = 21 num[2][2] = 22 num[2][3] = 23
今日の宿題
抽選を10回だけ行うBINGOMachine02.cを作成してください。あれ、これ今日やったような・・・?
次回は試作1号機を改造して抽選される数字の範囲を調節します。
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載