投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/4/26 19:56:23
> Tag を -1 から始めれば、1 回だけ実行され、Tag の中身は -1 になります。 
失礼しました。-1 から始めたら、-2 ですね。


> そこでbtnStart_ClickイベントのMe.Timer1.Enabled = True前に
Timer の停止/再開は Enabled プロパティでも行えますが、
Stop / Start メソッドを使った方が、意図が分かりやすいコードになると思いますよ。

また乱数生成も、Randomize / Rnd を使うのではなく、Random クラスを使った方が良いかと。



> 「タイマーが止まった時点の数字をListなどに詰めていって、既にListに含まれている数字はタイマーを止めない」としようかと考えていますが、現実的ではない気がします。
そういう方法でも実装できますが、実際のビンゴゲームと同様のロジックの方が都合が良いでしょう。
http://www.adroom.co.jp/wp-content/uploads/383_1.jpg


ビンゴゲームだと分かりにくければ、「トランプ」を思い浮かべてみて下さい。
トランプには 53種類のカードがありますよね。

その中から、好きな位置にあるカードを一枚を抜いてもらいます。
次に、残った52枚から、さらにもう一枚カードを引きます。
その次は、残った 51 枚から…と順に抜いていくイメージです。

この場合、同じカードが2回続けて引かれる心配はありませんよね。
それと同様の方法にすれば良いわけです。


たとえば 0~9 の 10 個の値を使うのだとすれば、
List に 0~9 の連番を記録しておきます。これがトランプのかわりです。
(実際には連番で無くとも良いですが、とにかくすべて別の値にしておきます)

最初、List の中身は 0,1,2,3,4,5,6,7,8,9 という並びです。
0番目の位置には 0 という値、9番目には 9 という値が入っています。



さて、最初のリストの数は 10 個なので、0~9 の範囲で乱数を生成します。

もしも乱数が 8 という値だったら、8番目にある「8」を取り出します。
もしも乱数が 4 という値だったら、4番目にある「4」を取り出します。
もしも乱数が 0 という値だったら、0番目にある「0」を取り出します。

タイマーが止まった場合には、その位置の値を RemoveAt で削除します。たとえば、
3 番目の位置を削除すれば、List の中身は 0,1,2,4,5,6,7,8,9 になりますし、
7 番目の位置を削除すれば、List の中身は 0,1,2,3,4,5,6,8,9 になるわけです。


2回目は、リストが 9 個に減ったので、0~8 の範囲で乱数を生成します。
得られた乱数を List 内の位置として、同様に値を取り除いていきます。

以前に選ばれた数字は、既に List 内からは取り除かれていますので、
何番目の値を取り出しても、同じ数字が出現する心配はありませんね。