C#でつくる素数大富豪、完成品はこんな感じです。

実際に作成したアプリケーションで遊んでみましたが、合成数だしをするときに「合成数は10、素因数は2×5」のつもりで確定ボタンを押したら「×」を記号を入れるのを忘れていて「10は25にはなりません」というエラーメッセージが返ってくることがありました。

現状では出せないカードを出した場合は出したカードだけ返却されるというルールですが、実際には出したカードだけ返却されるだけでなく、それを同じ枚数を山札から取らなければならないというペナルティーがあります。こんな凡ミス、しかも本物のカードをつかっていれば絶対やらないようなミスでペナルティーを受けたくありません。

そこで合成数出しをするときは本当にそれが自分が出したいカードと一致しているのかの確認画面を出したいと思います。

カードを出す前の確認機能の実装

MessageBoxを使ってもよいのですが、ちょっと見た目がチープになるのでボタン付きのPanelを表示させます。Panelに確定のボタンがついていてこれをクリックしたら出されたカードの正当性の判定がおこなわれます。最終確認をして出したわけですから、これで間違っていたらプレイヤーの完全なミスです。潔くペナルティーをうけてください。

確認用コントロールの作成

では合成数だしの確認機能を実装します。

まず確認用のコントロールを作成します。LabelひとつとButtonがふたつで構成されています。LabelはAutoSizeをfalseにし、TextAlignはContentAlignment.MiddleCenterにしています。あとは各自のデザイン感覚に任せます。

実行、キャンセルのボタンがクリックされたらForm1クラス側でもこれに対応できるようにClickRunとClickCancelのイベントを定義しておきます。

これからこんな警告用のコントロールもつくってみました。合成数出しをしようとするとよくやるミス防止のためにつくりました。

Form1クラス側の処理

次にForm1クラス側の処理を示します。

初期化に関する処理

作成したVerificationControlクラスとAlertControlクラスのインスタンスを生成し、ボタンがクリックされたときのイベントを処理できるようにイベントハンドラを追加します。

それからアプリケーションが開始された直後はゲームスタートのボタン以外はクリックできないようにすることにしました。ゲームスタート前はカード自体が作られていないので[一枚取る]ボタンをクリックしてしまうと例外が発生してしまいます。

確認メッセージを表示する処理

実行ボタンがクリックされたときに実行される処理はButtonDecision_Clickメソッドで定義されていますが、この中身を別のメソッド(async void DecisionFinal())を作成してそこに移します。そしてButtonDecision_Clickの中を以下のように書き換えます。

素因数が存在する場合は2×5とすべきところを25とやっているとAlertControl1が表示され、素因数をひとつだけでは合成数出しはできない旨を通知します。それ以外のときは指定した合成数と素因数はこれで間違いないか確認するコントロールが表示されます。

確認メッセージのボタンが押されたときの処理

確認用のコントロールにあるボタンがクリックされたら出されたカードが正しいかの判定がおこなわれます。素因数が1つしかなかった場合や確認用コントロールのCancelボタンが押されたときは処理は行なわれません。クリアボタンをおして自分で再指定することになります。

ペナルティーはありかなしか?

CheckBoxでペナルティーがありかなしかを選択できるようにします。またコンピュータのカードをみることができるかどうかも設定できるようにします。

まずForm1に設定用のCheckBoxをつくります。

コンピュータはミスはしないので、プレイヤーのミスだけ考えます。CheckPlayerCards1メソッドとCheckPlayerCards2メソッドで出されたカードが正しくないと判定されたときに、間違って出されたカードを返却するだけでなく、それと同数のカードを山札から追加します。

プレイヤーが合成数出しをしたときの判定処理をおこなう部分です。合成数出しは合成数だけでなく素因数としてもカードを消費することができるのですが、失敗するとダメージが大きいです。

コンピュータのカードを裏向きで表示させる

コンピュータのカードを裏向きで表示させるのは簡単です。[コンピュータのカードをみせる]にチェックが入っていないのであれば