前回のコンピュータと対戦できるようにする C#で素数大富豪をつくる(5)で一応ゲームとしての体裁は整いましたが、やっぱりカードゲームなのでカードを表示させたいです。今回はカードを表示させます。

ちょっと長くなってしまったので「カードを表示させてゲームらしくする」は2回にわけます。今回はカードを生成、シャッフル、配る処理と、クリックしてカードを選択するところまでやります。

Cardクラスをつくる

カードをつくるための画像はここからダウンロードします。

トランプ カードイラスト – No: 934665/無料イラストなら「イラストAC」

画像を入手したら、これをプロジェクト ⇒ プロパティ ⇒ リソースに追加します。

ではカードを描画するためのクラスをつくりましょう。

コンストラクタにはスートと番号、幅、高さを渡します。描画するときはXY座標とサイズを指定してからDrawメソッドを呼びます。CardImageは一回取得したらそれを使い回します。

裏面を表示させたくなることも考えられるので裏面を描画するメソッドも作りました。裏面は全部同じなので最初に1回だけ取得してstatic変数にいれてしまいます。

フォームにカードを表示させる

次にデザイナで以下のようなフォームを作成します。

最初にコンストラクタとフィールド変数を示します。

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

ゲーム開始のボタンが押されたらカードを生成してシャッフルしてプレイヤーとコンピュータに配ります。

上記のとおり、ゲーム開始にともなってカードの生成とシャッフルがおこなわれるのですが、Cardオブジェクトを作ったのでカードの生成とシャッフルの処理をするメソッドを変更しました。

カードの位置を指定して描画する

次に描画の処理ですが、一番上の列にコンピュータが持っているカード、二番目の列にコンピュータが場に出したカード、三番目にプレイヤーが場に出したカード、一番下にプレイヤーが持っているカードを配置し、これを描画します。

実際の描画処理を示します。描画したい位置が確定したらCard.Drawメソッドを呼ぶだけです。

プレイヤーがカードを出せるようにする

プレイヤーがカードを出す処理を示します。

クリックでカードを選択

出したいカードをクリックすればよいのですが、スペースの関係でカードを重ねて描画しています。そのためカードの見える部分がクリックされたカードを選んだように処理をしなければなりません。

そこでカードのX座標を大きい順にソートします。これならクリックされた座標を含むカードを探して最初に見つかったものが選ばれたカードということになります。

カードを出す処理はPutCardメソッドで行なわれます。これも前回のものとは引数が異なっています。CheckBoxをみて素数としてカードを出すのか合成数出しをするのかを切り分けています。

カードをCardsPutByPlayer1またはCardsPutByPlayer2リストに移動させるとともに出されたカードをLabelに表示させています。この操作でカードを描画すべき位置がかわるので再描画の処理をしています。

合成数出しのための処理

かけ算のボタンが押されたときの処理は前回とほぼ同じです。Labelに素数または合成数と素因数のかけ算の式を表示させる部分が追加されています。

キャンセルの処理

クリアのボタンが押されたときの処理を示します。Labelに表示されるテキストをクリアするのとCardsPutByPlayer1、CardsPutByPlayer2に移動していたCardオブジェクトをPlayerCardsに戻しています。またカードの描画位置が変わるので再描画の処理をしています。

山札からカードを取る

出せるカードがない場合、山札から1ターンにつき1枚だけカードを取ることができます。この場合、出したカードはすべていったん返却されて出し直しにすることにします。

パスの処理

プレイヤーがパスをするときの処理を示します。パスをすると手番がコンピュータへ移ります。

パスをすると場に出されているカードがすべて流れます。流されたカードは山札の一番下に置かれます。