C言語でBINGOを作ろう #12 BINGO Machineを改造してみよう
C言語でBINGOを作ろう!
C言語でBINGOを作ろう!
CUI上で動くビンゴゲームの完成目指してひっそりとプログラムの勉強を始めました。前回はBINGO Machineの試作1号機を作りました。今回はそれを改良します。
前回はタイトルに何回目か書き忘れたYO!!
開発環境
本記事は以上の開発環境を前提に説明を行います。
BINGO Machineを作ろう
BINGO Machineとは
BINGO Machineとは、ビンゴの抽選の機械です。それ前回も聞いたYO!!
試作1号機はこんな↓感じでした。
す、数字が大きすぎる・・・w
試作1号機を改造
試作1号機では抽選される数字が大きすぎます。そこで、抽選される数字の範囲を制限したいと思います。
前回使用したrand()関数は、そのまま使うと出てくる非常に大きな数字も出てきます。そこで、ちょっと小細工をします。
↓のような感じです。
int num = rand() % 10; // 出てきた数字が0~9までの10個の数字に変わる
%演算子は割り算の余りを求める演算子です。上の例の場合、10で割ったあまりを求めます。10で割った場合余りは0~9のいずれかなので、rand()関数で選ばれた数字は0~9のいずれかの数字に変わる、というわけです。
注意点としては、10で割った場合、出てくる数値は0~9の10個の数字になるという点です。割った数自身(例の場合、10)は出てこないので注意してください。
それではこれを使って早速試作1号機を改造してみましょう。
BINGO Machine 試作3号機
BINGO Machine 試作3号機
2号機どこ行った
2号機は前回の宿題だったので、今回は3号機を作成しましょう。
プログラム(sample12_00.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() % 75; //0~74になるように変更 printf("%02dが出ました。\r\n", num); } return 0; }
実行結果
>gcc -o BINGOMachine03.exe sample12_00.c >BINGOMachine03.exe 抽選を開始します。 (Enterを押してください) 61が出ました。 (Enterを押してください) 22が出ました。 (Enterを押してください)
これで抽選結果に大きな数字が出なくなりました。めでたしめでたし・・・?
でも、よく見るとこれ↓
同じ数字が何回も出てる・・・!?
しかも、初期SEEDが同じだと同じ数字が順番どおりに出る。。。やった、イカサマし放題www
毎回初期SEED変更するのめんどくさい。。。
おまけ
初期SEEDを乱数にしようとしても、その乱数を作るためには初期SEEDが必要。。。という、鶏と卵状態になってしまいます。 そこで、手軽に使える実装としては、現在時刻を用いる方法があります。 ということで、次回は現在時刻を使って乱数の初期SEEDを設定します。 良かった、今回は宿題じゃない。。。w
宿題コーナー
夏が終わってからが本当の夏休m(ry 宿題のコーナーです。
前回の宿題と解答例
前回の宿題は、「抽選を10回だけ行うBINGOMachine02.cを作成してください。」でした。今回は同様、短い・・・w
解答は以下の通りです。※解答例のファイル名はhomework11.cとなっていますが、BINGOMachine02.cでもコンパイル可能です。ま、間違えたわけじゃないんだからね!!
解答例(homework11.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++){ printf("(Enterを押してください)\n"); char ch = getc(stdin); //キーボードからなにか入力するまで画面を一時停止する。 num = rand(); printf("%02dが出ました。\r\n", num); } printf("抽選を終了します。\r\n"); return 0; }
実行結果※表示される数値は初期SEEDによって変わります。
>gcc homework11.c -o BINGOMachine02.exe >BINGOMachine02 抽選を開始します。 (Enterを押してください) 61が出ました。 (Enterを押してください) 17422が出ました。 (Enterを押してください) 15215が出ました。 (Enterを押してください) (中略) 20344が出ました。 抽選を終了します。
今日の宿題
sample12_00.cを改造して、0~74が出て抽選を10回だけ行うBINGOMachine04.exeを作成してください。あれ、これ前回の宿題と今日やったこと組み合わせれば簡単w
次回は宿題で作る(はず)の試作4号機を改造して抽選される数字の初期SEEDを自動的に設定してみます。
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載