C言語でBINGOを作ろう #16 BINGOマシン完成
C言語でBINGOを作ろう!
C言語でBINGOを作ろう!
新年あけましておめでとうございます。
CUI上で動くビンゴゲームの完成目指してひっそりとプログラムの勉強を始めました。前回は抽選結果を保存し、フェニックスを倒しました同じ数字が2回以上抽選されないようにしました。
これで完成!。。。でもいいのですが、このままでは抽選結果が見づらくなっています。
そこで今回は過去に出た数字を一覧で表示できるようにしたいと思います。抽選結果が表示されるようになると、BINGOマシンっぽい感じがしますね。
すっかり年越ししちゃったYO☆
開発環境
本記事は以上の開発環境を前提に説明を行います。
抽選結果を表示する
抽選結果の表示
前回は抽選結果の保存を行いました。保存された結果を利用すれば、現在の抽選結果を表示することができるようになります。
抽選結果の利用
前回は抽選結果を保存する配列を作成し、その中身を調べ、数字が抽選済みかどうかを確認しました。
今回も前回と同様、抽選結果が保存されている配列の中身を調べて抽選結果の表示を行います。
なお、前回の抽選結果の保存はすでに終わっている前提で進めます。
抽選結果の表示の手順
抽選結果の表示の手順は以下のような感じです。
なお、まだ抽選で出ていない数字は白、すでに抽選で出た数字は水色にします。
1.配列の各要素を確認する
抽選結果が保存されている配列の各要素を調べていきます。
2-1.まだ出ていない数字の場合
調べた数字がまだ抽選で出ていない数字の場合、抽選結果の表示部分に空白(スペース)を表示します。
2-2.すでに出た数字の場合
調べた数字がすでに抽選で出た数字の場合、抽選結果の表示部分に該当の数字を表示します。
これを繰り返して
最後の数字まで調べ終わると
抽選済みの数字の一覧が表示されます。
では、具体的にプログラムを見てみましょう。
なお、配列bucketには抽選結果が保存されているとします。プログラムが長くなるので要素数は5つにしています。
1.配列の中身を調べる
抽選結果が保存されている配列の中身を調べます。
#include <stdio.h>
int main(void){
int bucket[5] = {0,1,0,0,1}; //抽選結果を保存している配列
int i;
for(i = 0; i < 5; i++){ //配列の要素の数だけ調べる
//省略
}
return 0;
}
2.抽選でまだ出てきていない数字の場合
まだ抽選で出てきていない数字の場合、空白(以下のサンプルでは__)を表示します。
#include <stdio.h>
int main(void){
int bucket[5] = {0,1,0,0,1};
int i;
for(i = 0; i < 5; i++){
if(bucket[i] == 0){ //まだ抽選で出てきていない数字の場合
printf(" __ "); //空白を表示する(左記のサンプルでは見やすいように__に変更してある)
}
//省略
}
return 0;
}
3.すでに抽選で出てきた数字の場合
すでに抽選で出てきている数字の場合、その数字を表示します。
#include <stdio.h>
int main(void){
int bucket[5] = {0,1,0,0,1};
int i;
for(i = 0; i < 5; i++){
if(bucket[i] == 0){
printf(" __ ");
}else{ //そうでなければ( = すでに抽選で出た数字なら)
printf(" %2d ", i); //その数字(インデックス)を表示する
}
}
return 0;
}
4.実行結果
これで抽選結果を表示できるようになりました。実行すると↓のようになります。
ソースコード(Sample16_00.c)
#include <stdio.h>
int main(void){
int bucket[5] = {0,1,0,0,1};
int i;
for(i = 0; i < 5; i++){
if(bucket[i] == 0){
printf(" __ ");
}else{
printf(" %2d ", i);
}
}
return 0;
}
実行結果
>gcc sample16_00.c -o sample16.exe -W -Wall -std=c99 >sample16 __ 1 __ __ 4
試作7号機のサンプル全容
以上の表示部分を組み込んだサンプル7号機のソースは↓のようになります。表示部分では見た目を整えるようにしています。
サンプルソース(bingomachine07.c)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
int i = 0;
int j = 0; //表示用のループカウンタ、今回追加で作成
int num = 0;
int bucket[75] = {0};
srand( (unsigned)time(NULL) );
printf("抽選を開始します。\r\n");
for(i = 0; i < 75; ){
num = rand() % 75;
if(bucket[num] == 0){
printf("(Enterを押してください)\n");
char ch = getc(stdin);
printf("%02dが出ました。\r\n", num);
bucket[num]++;
i++;
/* ここからが追加部分 */
//抽選結果の表示部分
for(j = 0; j < 75; j++){ //表示部分
if(bucket[j] == 0){ //もし該当の数字がまだ出ていなければ
printf(" __ "); //__を表示する
}else{ //そうでなければ
printf(" %2d ", j); //該当の数字を表示する
}
if(j % 10 == 9){ //そのままだと見づらいので、10個ごとに改行
printf("\n\r");
}
}
printf("\n\r");
/* 以上が追加部分 */
}
}
printf("抽選を終了します。");
return 0;
}
実行結果
>gcc BINGOMachine07.c -o BINGOMachine07.exe -W -std=c99 >BINGOMachine07.exe 抽選を開始します。 (Enterを押してください) 74が出ました。 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ 74 (Enterを押してください) 54が出ました。 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ 54 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ 74 (Enterを押してください) (中略) 60が出ました。 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 __ 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 (Enterを押してください) 30が出ました。 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 抽選を終了します。
試作7号機の弱点
7号機にはこれと言って弱点はないように見えます。というか、機能面ではほぼ無いと言っていいでしょう。
あとは、お好みでカスタマイズしていきましょう。
おまけ
↑うまく書けばこんなのもできるよ(^^
ソースはこちら
宿題コーナー
これがついに最終回!? 宿題のコーナーです。
前回の宿題と解答例
そろそろプログラムが長くなってきたから関数で分けたいなぁ。。。(独り言。)
例
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void disp(int bucket[], int length);
void lottery(int bucket[], int length);
int isContinue(int bucket[], int length);
int main(void){
int i = 0;
int num = 0;
int bucket[75] = {0};
srand( (unsigned)time(NULL) );
printf("抽選を開始します。\r\n");
while(isContinue(bucket, 75)){
printf("(Enterを押してください)\n");
char ch = getc(stdin);
lottery(bucket, 75);
disp(bucket, 75);
}
printf("抽選を終了します。");
return 0;
}
void disp(int bucket[], int length){
int j = 0;
int k = 0;
printf("| B | I | N | G | O |\n\r");
for(j = 0; j < length / 5; j++){
printf(" ");
for(k = 0; k < 5; k++){
if(bucket[j+15*k] == 0){
printf(" __ ");
}else{
printf(" %2d ", j+15*k);
}
}
printf("\n\r");
}
}
void lottery(int bucket[], int length){
int num;
while(1){
num = rand() % 75;
if(bucket[num] == 0){
printf("%02dが出ました。\r\n", num);
bucket[num]++;
break;
}
}
}
int isContinue(int bucket[], int length){
int i;
for(i = 0; i < length; i++){
if(bucket[i] == 0){
return 1;
}
}
return 0;
}
実行結果※おまけと同じ結果。
今日の宿題
良く復習しましょう!
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載





