Tips

【C言語で】#13 BINGO Machineを改造してみようその2【ビンゴを作ろう】

【C言語で】#13 BINGO Machineを改造してみようその2【ビンゴを作ろう】

C言語でBINGOを作ろう #13 BINGO Machineを改造してみようその2

C言語でBINGOを作ろう!

C言語でBINGOを作ろう!

CUI上で動くビンゴゲームの完成目指してひっそりとプログラムの勉強を始めました。前回はBINGO Machineを改造してみました。今回はそれを更に改良します。

そろそろ完成させようYO!!

 

BINGOの記事一覧はこちら

 

開発環境

開発環境はこちらをご覧ください。

 

本記事は以上の開発環境を前提に説明を行います。

 

BINGO Machineを改造してみようその2

BINGO Machineとは

BINGO Machineとは、ビンゴの抽選の機械です。それ前々回から聞いてるYO!!

試作3号機はこんな↓感じでした。

BINGOMachine03

 

す、数字が被ってる・・・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のもの)

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のどこに使うってんだ・・・?

 

BINGOの記事一覧はこちら

 

実践力が身につくC言語講座 連載リンク

競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載

アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載

パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載

Recent News

Recent Tips

Tag Search