C言語でBINGOを作ろう #13 BINGO Machineを改造してみようその2
C言語でBINGOを作ろう!
C言語でBINGOを作ろう!
CUI上で動くビンゴゲームの完成目指してひっそりとプログラムの勉強を始めました。前回はBINGO Machineを改造してみました。今回はそれを更に改良します。
そろそろ完成させようYO!!
開発環境
本記事は以上の開発環境を前提に説明を行います。
BINGO Machineを改造してみようその2
BINGO Machineとは
BINGO Machineとは、ビンゴの抽選の機械です。それ前々回から聞いてるYO!!
試作3号機はこんな↓感じでした。
す、数字が被ってる・・・w
そして、初期SEEDを変えないと抽選結果が変わらない。。。w
試作4号機を改造
前回の宿題で「sample12_00.cを改造して、0~74が出て抽選を10回だけ行うBINGOMachine04.exeを作成してください。」というお題を出しました。
今回はこの試作4号機をもとに、抽選時の初期SEEDが自動的に設定されるように改造します。
なお、BINGOMachine04.exeとBINGOMachine03.exeの違いは抽選回数に制限があるかどうかです。
えっ、宿題やってない?廊下に立ってなさい!! ↓の方に前回の宿題の解説とソースコードが載ってるけど見るなよ!絶対に見るなよ!!!ぜ~ったいに見るなよ!!
試作4号機のソースコードはこちらです↓ 見るなって言ってるそばから公開してるのは内緒
#include <stdio.h> #include <stdlib.h> int main(void){ int i = 0; int num = 0; srand(7); printf("抽選を開始します。\r\n"); for(i = 0; i < 10; i++){ // ここをwhile文からfor文に変更。 printf("(Enterを押してください)\n"); char ch = getc(stdin); //キーボードからなにか入力するまで画面を一時停止する。 num = rand() % 75; //0~74になるように変更 printf("%02dが出ました。\r\n", num); } printf("抽選を終了します。"); return 0; }
7行目のsrand()関数の引数を自動的に設定できれば解決ですね。
そこで、引数を乱数に。。。って、あれ?初期SEEDが決まらないと乱数が決まらない、乱数が決まらないと初期SEEDが決まらない、初期SEEDが・・・(ry
time()関数
初期SEEDの自動設定に乱数を使おうとすると、結局その乱数を決めるための初期SEEDが必要となります。
そこで、初期SEEDを自動的に決める手軽な方法として、現在時刻を使うという手があります。
現在時刻は time.hヘッダの中の time()関数で取得できます。
time_t time(time_t *t);
time関数は戻り値が time_t型、引数がtime_tのポインタ型となっています。 time_t型も一般的には time.hヘッダをインクルードすれば使えるようになります。
一般に、time_t型は64bitの符号付整数型(筆者環境の場合、調べてはいませんがおそらくlong long int型)の別名定義となっていることが多いです。
(ただし、環境に依ります。自分の環境でどうなっているか知りたければ、ヘッダファイルを読み解いてみるとわかります。勉強になりますよ(^^)
では、早速 time()関数を使ってみましょう。
プログラム(sample13_00.c)
#include <stdio.h> #include <time.h> int main(void){ printf("%lld\r\n", time(NULL)); return 0; }
実行結果 ※値はデタラメです。また、実行したタイミングで少しずつ値が変わります。
1234567890
あれ、時間なんて表示されないぞ・・・?
time()関数の戻り値と引数
実は time()関数の戻り値は協定世界時(UTC) 1970年01月01日 00時00分00秒からの経過秒数です。時間がそのまま戻ってくるわけではないんですね。
また、引数にNULLを用いていますが、代わりにtime_t型の変数のアドレスを渡すと、その変数に戻り値と同じ値を設定してくれます。
今回は手軽なので戻り値を利用しました。
それではこれを使って早速試作4号機を改造してみましょう。
BINGO Machine 試作5号機
BINGO Machine 試作5号機
試作5号機のプログラムはこちら。
プログラム(BINGOMachine05.c)
#include <stdio.h> #include <stdlib.h> #include <time.h> //追加 int main(void){ int i = 0; int num = 0; srand( (unsigned)time(NULL) ); //srand()関数の引数に現在時刻を設定 printf("抽選を開始します。\r\n"); for(i = 0; i < 10; i++){ // ここをwhile文からfor文に変更。 printf("(Enterを押してください)\n"); char ch = getc(stdin); //キーボードからなにか入力するまで画面を一時停止する。 num = rand() % 75; //0~74になるように変更 printf("%02dが出ました。\r\n", num); } printf("抽選を終了します。"); return 0; }
実行結果
>gcc -o BINGOMachine05.exe BINGOMachine05.c >BINGOMachine05.exe 抽選を開始します。 (Enterを押してください) 61が出ました。 (Enterを押してください) 22が出ました。 (Enterを押してください)
これで毎回初期SEEDを設定する必要がなくなりましたね。めでたしめでたし。い、イカサマできなくなったorz
でも、よく見るとこれ↓何回もやってると同じ数字が被ることが。。。(画像はBINGOMachine03のもの)
おまけ
試作5号機には、抽選結果を保存したり表示したりする機能がありません。そのため、数字が被っているかどうかもわかりません。
どうやって抽選結果を保存したらいいんだろう・・・?
宿題コーナー
夏休み最終日は毎年宿題ぱーりぃでオールしてました 宿題のコーナーです。
前回の宿題と解答例
前回の宿題は、「sample12_00.cを改造して、0~74が出て抽選を10回だけ行うBINGOMachine04.exeを作成してください。」でした。 解答は以下の通りです。
解答例(homework12.c)
#include <stdio.h> #include <stdlib.h> int main(void){ int i = 0; int num = 0; srand(7); printf("抽選を開始します。\r\n"); for(i = 0; i < 10; i++){ // ここをwhile文からfor文に変更。 printf("(Enterを押してください)\n"); char ch = getc(stdin); //キーボードからなにか入力するまで画面を一時停止する。 num = rand() % 75; //0~74になるように変更 printf("%02dが出ました。\r\n", num); } printf("抽選を終了します。"); return 0; }
実行結果※表示される数値は初期SEEDによって変わります。
>gcc homework12.c -o BINGOMachine04.exe >BINGOMachine04 抽選を開始します。 (Enterを押してください) 61が出ました。 (Enterを押してください) 22が出ました。 (Enterを押してください) 65が出ました。 (Enterを押してください) (中略) 19が出ました。 抽選を終了します。
今日の宿題
並べ替え(ソート)のアルゴリズムについていくつか調べてくること。あれ、今日の宿題解答例なさそうだからサボっても(ry
次回はバケツソートのお話です。い、いったいBINGOのどこに使うってんだ・・・?
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載