前回のコンピュータによる合成数出しが本当に出せるカードなのか調べる C#で素数大富豪をつくる(3)ではコンピュータが出せるカードの組み合わせを取得しましたが、そのなかからランダムに選ぶだけでは簡単に行き詰まってしまいます。最善とはいかなくてもそれに近そうなコンピュータの次の一手を考えます。

カードを配布する

Button1を押すとコンピュータにカードが13枚配られます。配られたカードはテキストボックスに表示されます。

カードの生成とシャッフル

CreateCardsメソッドはゲームを開始するにあたって52枚のカードをつくるためのものです。

ShuffleCardsメソッドは生成された52枚のカードをシャッフルします。この先頭の13枚がコンピュータに配られます。

なにも考えずにカードを出して大破産

カードが配られたらButton2をクリックしてみましょう。場に出すことができるカードのうち最初にみつけたものを出します。そのとき残りのカード、場に出されたカード、素因数場に出されたカード、合成数出しの場合は素因数、カードによって作られた数がテキストボックスに表示されます。

実際にButton2を押し続けてみると以下のような結果になります。乱数を用いてカードを配っているので、必ずこうなるというわけではなく、結果の一例です。

これだと途中で出せるカードがなくなってしまいます。素数大富豪も大富豪と同じで出せるカードだからといって何も考えずに出してしまうと後半で行き詰まってしまうのです。カードを出したら次の順番が回ってきたときにどうするかを考えながら出すカードを選ばなければなりません。

次に出せるカードがあるか確認してから出す

改善点は他にも多数あるはずですが、カードを出したとして次に出せるカードが存在しない場合はそのカードを出すのをやめて他のカードを考えさせるようにします。

偶数のカードはできるだけ早めに処分したい

SearchNumberメソッドはコンピュータが出すことができるカードを探します。

出されたカードをコンピュータの手持ちのカードから取り除き、結果を表示します。

動作チェックをしてみると、こんな感じになります。