前回の続きです。

C#でババ抜きをつくる

カードを配り終わったら数字がそろっているカードを捨てます。2枚そろっているときは2枚、3枚そろっているときは1枚残して2枚捨てます。4枚ともそろっているときは4枚とも捨てます。

ではこのような処理をするためにはどうすればいいでしょうか?

同じカードをみつけたら捨てるメソッド

これでどうでしょうか? 1から13まで持っているカードのなかにあるか調べます。2枚見つかったときと4枚見つかったときは捨てるカードのリストに加えます。3枚あるときは先に見つけた2枚を捨てるカードリストに加えます。そして最後にプレイヤーが持っているカードと捨てるカードの差集合をもとめます。

そしてこれはPlayerクラスのメソッドとします。

TakeoutCardsメソッドは最初にカードが配られたときに実行するだけでよさそうです。あとはカードを1枚しか引かないので、引いたカードと同じ数があれば一緒に捨てる、なければ手持ちのカードに加える処理をすればいいからです。

相手のカードを引いてそろったら捨てる

ゲームがはじまったら相手がもっているカードを1枚引いて、数字がそろっていたら捨てます。カードを引くときは「誰から」「どのカードを」を考える必要があります。

ババ抜きのルールでは時計回りに時計回りの順にカードを左となりの人にひいてもらって、同じカードがあれば中央の場にすてていくことになっています。ということは順番だけでなくカードも時計回りに移動することになります。

プログラム的には

1が0のカードを引く
2が1のカードを引く
3が2のカードを引く
4が3のカードを引く
5が4のカードを引く
0が5のカードを引く

以上の繰り返しになります。

PullCardというメソッドを作りました。これは相手とカード(リストの何番目にあるか)を指定してカードを引いた処理をおこなうものです。引いたカードの数字を調べて自分も持っているのであればカードを捨てる、ないなら引いたカードを自分のカードに加えます。

当然のことながら引いたカードは相手の手元からはなくなります。そのための処理もいっしょにおこなっています。

カードを表示させる

これまではデータ的な処理しかしませんでした。今回は自分のカードを表示させることにします。

ババ抜きは相手のカードを引くので自分のカードだけでなく相手のカードも表示させる必要があります。そこで手前に自分のカード、向こう側に相手のカードを裏向きに表示します。

カードのイメージを作成する

まずはカードを表示する位置を決めなければなりません。それからカードのイメージを取得する必要があります。

まずカードのイメージはこれまでどおりの方法でよいと思います。

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

で入手した画像からカードの絵柄を取得します。

カードの裏側のイメージを作成する

これはカードの裏面のイメージを取得するメソッドとプロパティです。

それからカードの大きさを取得できるようにしておきましょう。

カードを表示させる

次にカードを表示する場所を決めます。デザイナでこんな感じにしてみました。

パネルを2枚貼り付けています。手前(下)が自分のカードで上が相手のカードです。

カードが配り終えたら自分のカードを表示します。

Invalidateメソッドを呼ぶことでパネルが更新されます。panel1には相手のカード、panel2には自分のカードが表示されます。

ShowMyCardsメソッドとShowRivalCardsメソッドは以下のようになっています。

カードをパネルの真ん中あたりに表示させたいので1枚目のカードの左上のX座標を計算しています。

カードが表示される部分の幅は

カードの横幅
カードの間隔 × (カードの枚数-1)

この両者をあわせたです。

求めるX座標はパネルの幅とこの長さを差を半分にしたものです。そのためこのような処理になっています。

相手のカードを表示させるために作成したのがShowRivalCardsメソッドです。カードを引く相手はあがったプレイヤーによって前回と変わってしまうことがあります。全部で5人なのでPlayers[4]のカードを表示すればよいというわけではありません。

表示するのはあがっていないプレイヤーでインデックスが最後のものです。そこで

のようにして取得しています。

また自分があがってしまったあとは相手のカードは表示する必要はありません。

自分のターンになったらカードを出せるようにする

自分の番になったら相手のカードをクリックしてカードを引きます。

クリックのイベントハンドラを示します。

クリックされた場所にある相手のカードをしらべてこれを取得します。あとはPlayerクラスで作成したメソッドが捨てることができるカードがあるかどうか調べて適切な処理をしてくれます。

またIsMyTurnプロパティを作成することで、自分のターンでないときにクリックしてもなにもおきないようにしています。

まずクリックされた場所にあるカードを調べるためのGetIndexClickedCardメソッドを示します。

IsMyTurnは自分のターンかどうかを調べるとともに、自分の番であることを表示するプロパティです。

ライバルのターンは次回に続きます。