抽選結果の保存【ビンゴを作ろう】この記事は2016年10月18日に書かれたものです。内容が古い可能性がありますのでご注意ください。抽選結果の保存C言語でBINGOを作ろう!C言語でBINGOを作ろう!CUI上で動くビンゴゲームの完成目指してひっそりとプログラムの勉強を始めました。前回はバケツソートを扱えるようになりました。抽選結果の保存が出来ていません。このままでは何度でも不死鳥の如く同じ数字が出てきます。そこで次は、バケツソートを応用して抽選結果の保存を行います。抽選結果の保存ができれば、現在の抽選結果の表示もできるようになります。こちらをご覧ください。本記事は以上の開発環境を前提に説明を行います。抽選結果を保存するには、抽選で出た数字(または、まだ出ていない数字)を記録する必要があります。様々な方法が考えられますが、今回は配列とバケツソートを利用して抽選結果の保存を行います。バケツソートの利用バケツソートは、並べ替えの際に対象の数字そのものを配列のインデックスに見立てて並べ替えています。この、「数字をインデックスとして配列を操作する」という性質を利用して抽選結果を保存します。抽選結果の保存の手順は以下のような感じです。オレンジの枠で囲んだ内容は説明がわかりやすくなるようにつけています。実際は抽選結果が確定するまでは画面には何も表示しません。1.配列を準備する抽選結果を保存する配列を準備します。その後、抽選を行います。出ていない数字が選ばれた場合(最初の抽選は必ずパターン1になります。)2-1.数字を抽選する(上が抽選結果の数字、下が配列のイメージ)数字を抽選します。今回は2が出たものとして話を進めます。3-1.配列の要素を調べる抽選結果の数字がインデックスになっている配列の要素を調べます。今回は2が出たので配列の要素2を調べます。4-1.配列の要素を変更する該当する配列の要素が空だったので、要素を変更します。今回は2が出たので配列の要素2を変更します。その後、結果を画面に表示します。表示が終わったら、次の数字の抽選へ。出ている数字が抽選された場合2-2.数字を抽選する(上が抽選結果の数字、下が配列のイメージ)再度抽選を行います。2が出ている状況で、もう一度2が出たとします。3-2.配列の要素を調べる抽選結果の数字がインデックスになっている配列の要素を調べます。今回は2が出たので配列の要素2を調べます。4-2.もう一度抽選からやり直す該当する配列の要素(要素2)が空ではなかったので、その数字は一度出ていることになります。画面の表示に移らずにもう一度抽選を繰り返します。具体的にプログラムを見てみましょう。1.空の配列を準備するまずは並べ替える元の数字の列と、空の配列を準備します。これは前回のバケツソートと同じ。0;}2.抽選を行う次に、抽選を行います。printf("抽選を開始します。すべての数字が出るまでループさせる。printf("抽選を終了します。0;}3.再抽選するかどうか判定する再抽選が必要かどうか判定します。抽選で出た数字をインデックスにしてbucketを調べ、要素が0ならまだ出ていない数字とする。例:bucket[2]が0なら、2番はまだ出ていない。bucket[7]が1なら、7番はすでに抽選で出ている。すべての数字が出るまでループさせる。//numがインデックスのbucketを調べる。値が0ならまだ出ていない数字。printf("抽選を終了します。0;}4.抽選結果を配列に保存1~3の手順でバケツソートによる並べ替えは完了です。このままでは本当に並べ変わっているのかよくわからないので、最後に表示部分を作ります。すべての数字が出るまでループさせる。//抽選の結果出た数字を表示する。printf("%02dが出ました。//該当のバケツを空でない状態にする。//for文の継続処理の部分では何もせず、抽選結果がまだ出ていない数字だったときにループカウンタを増やす。printf("抽選を終了します。0;}これで、抽選結果を保存できるようになりました。試作6号機のサンプル全容サンプルソースの全容は↓のようになります。読み込みを一時停止する部分なども実装しています。printf("抽選を開始します。すべての数字が出るまでループさせる。//キーボードからなにか入力するまで画面を一時停止する。printf("%02dが出ました。printf("抽選を終了します。-std=c99>BINGOMachine06.exe抽選を開始します。(Enterを押してください)06が出ました。(Enterを押してください)43が出ました。(Enterを押してください)17が出ました。(Enterを押してください)(中略)49が出ました。(Enterを押してください)33が出ました。(Enterを押してください)36が出ました。試作6号機の弱点これで数字がかぶらないようになりました。フェニックスを倒したぞしかしこのままでは一度出た数字を確認するのが大変です。そこで、次回は一度出た数字も合わせて表示されるようにします。ラストスパートやで!!おまけ何だかプログラムが長くなりすぎて見づらい。今回作ったバケツソートっぽいものは同じ数字が2回以上出てくるとうまく並べ替えができません。そこで、どうやれば同じ数字が2回以上出てきても並べ替えできるか、考えてみましょう。することで数字がダブっていても数えることができる。bucketの要素が空になるまで取り出し続ける。空でない場合、jは増やさない。9今日の宿題そろそろプログラムが長くなってきたから関数で分けたいなぁ。)次回は今までの抽選結果も表示されるようにします。