単純なゲームをつくります。フォーム上に1~25の文字が表示されていて、1から順に25までクリックするという極めて単純なものです。全部終わるまでの時間も計測します。実際にやってみると次にクリックすべき数字が見つからなくて軽いパニック状態になれます。

まずForm1クラスのコンストラクタで25個のLabelをリストに入れてしまいます。こうすればLabels[i]とやればアクセスできるようになります。label1とかlabel2とかlabel3とかいちいち書いていられません。

ラベルをリストに格納したらクリックイベントを処理できるようにしてしまいましょう。デザイナでClickと書いている部分をひとつひとつクリックしていては時間がかかるだけです。ラベルをリストに格納してしまったわけですから、ループ文でやってしまいましょう。

ゲームをスタートさせる処理としては、ラベル上に1~25の数字をセットします。またラベルがクリックされたことでどの数字が選択されたのかわかるようにしておきます。Label.Tagに数値をセットすればいいのではないでしょうか?

CreateRandomNumber()メソッドでは仮のリストに1~25を格納して、最大値が(仮のリストの要素数 – 1)になる乱数を発生させ、その要素を引き抜いて新しいリストに追加します。これを仮のリストの要素数が0になるまで繰り返します。

こうしてつくられた整数リストをSetRandomNumber(List<int> vs)に渡してラベルに数字を表示させます。それと同時にLabel.Tagにも数値をセットします。

最後にフィールド変数 RandomNumbersにランダムに並べ替えられた整数のリストをセットするとともに、最後にクリックされた数は0とし、これをフィールド変数 LastClickedNumber に代入します。

ゲームがはじまったらクリックすべきラベルをクリックしたのかを判定する必要があります。ではクリックされるべき数はどのようにして求めればいいのでしょうか? それは最後にクリックされた数よりも大きくて最小のものです。

あとはラベルがクリックされたときGetNextNumber()メソッドが返す数と比較すれば正しくクリックされたことがわかります。正しくクリックされている場合はフィールド変数 LastClickedNumberの値を変更します。そして正しいクリックがされた場合と正しくないクリックがされた場合の処理をおこないます(OnGoodClick(Label label)と OnBadClick(Label label)メソッド)。

またすべて正しくクリックした場合はゲーム終了となりますが、それはどうやって判定すればいいのでしょうか? それはGetNextNumber()メソッドが-1を返したときです。そのときはOnGameClear()メソッドを呼び出し、そのなかでフィールド変数 IsClearedをtrueにします。そしてIsCleared == trueのときにラベルをクリックしてもなにもおきないようにしてしまいます。

最後にゲームをもう一回やりたいときはメニューの[スタート]をクリックします。クリックするとIsClearedフラグがfalseに変更されて、GameStart()メソッドが実行されます。