今度は出せるカードがない場合、いつでもジョーカーを代用できるわけではなく、次のカードと一緒に出せる場合でないと出せないルールに適用させます。

ジョーカーといっしょに出せるカードを取得する必要があります。そのために出せるカードとジョーカーがその代わりをするカードをペアにしたPairWithJokerクラスを示します。

GetPairWithJokerメソッドはジョーカーといっしょに出せるカードのペア(PairWithJoker)のリストを返します。

Listを引数にするGetPairWithJokerメソッドは持っているカードのなかにジョーカーとの組み合わせで出せるカードがあれば、それをリストにして返します。

それではまずライバルのターンのときの処理を考えてみましょう。

これまで使用してきたRivalTurnメソッドをそのまま改造しようとするので以下のように変更しました。

カードを単独で出せるか、ジョーカーといっしょならどうかについてそれぞれ考えます。そして両方が可能であれば1/5の確率でジョーカーといっしょに出します。片方の方法でしか出せないならその方法で出します。

TakeoutSingleはカードを一枚だけ出すメソッドです。

TakeoutWithJokerはジョーカーといっしょに出すためのメソッドです。

では自分がカードを出すときはどのようにすればいいでしょうか?

ゲーム開始のときとライバルのターンが終わったときに、引数が0でCanPlayerTakeoutCardメソッドが呼ばれます。ここでカードを出すことができるかどうかの判定をしているわけですが、ここにジョーカーと一緒なら出せるかどうかの判定する処理をかけばいいですね。

CanPlayerTakeoutCard(0)の実行結果がfalseの場合、強制的にパスになります。

CanPlayerTakeoutCard(0)の実行結果がfalseの場合、強制的にパスになるため、前回書き換えたMyPassメソッドをは元に戻します。

前回はジョーカーはカードをもっていない部分であればどこにでも置くことができましたが、今回は違います。ジョーカーを使うときはジョーカーではなくいっしょに出したいカードをクリックさせるようにします。

ジョーカーをクリックした場合は「ジョーカーではなく一緒に出したいカードをクリックせよ」という内容のメッセージボックスを出します。

適切なクリックがされた場合は、自動的に2枚のカードが出るようにします。

まずはクリックされたときのイベントハンドラを示します。

OnMouseClickForTakeCardメソッドはクリックされた場所に自分のカードがあるかどうか調べてTakeoutMyCardIfCanメソッドを呼びます。TakeoutMyCardIfCanメソッドは名前のとおり、可能であれば引数でわたされたカードを出します。

TakeoutMyCardIfCanメソッドを示します。

カードがクリックされたらそのまま出せるか、ジョーカーとセットで出せるかの判定をして可能であればカードを出します。適切ではないカードがクリックされたらエラーのメッセージボックスを表示します。