【C#.NET】大富豪やったことない奴が大富豪作ってみる その2

2022.02.22

CATEGORY : C#.NET プログラミング

あんみんどうふです。

前回は手札を配る所まで作りました。
今回はカードを場に出して次の番へ進められる所まで作ります。

前回の記事はこちら。

あけましておめでとうございます。あんみんどうふです。 トランプを使った「大富豪」というゲームをご存知でしょうか。 私はルールを一切知りません。なのでこれといった説明もできず、多人数でやるトランプゲームということしか知りません。 ...

UI

まず画面が無いと始まらないので適当にコントロールを配置します。

とりあえずこんな感じになりました。
各種コントロールは以下の通りです。これからもう少し増える予定ですが、暫定としてとりあえず。

Label

labelRemainCards・・・自身の手札残り枚数。
labelMsg・・・現在の状況をテキストとして表示する領域。

Button

buttonStart・・・ゲーム開始ボタン。ゲーム中は表示されない。
buttonConfirm・・・手札を選んで確定するボタン。
buttonPassMe・・・カードを出せない時にパスをして次の番へ進めるボタン。

PictureBox

pictureBoxCardNow1・・・現在場に出ているカードの1枚目。
pictureBoxCardNow2・・・現在場に出ているカードの2枚目。
pictureBoxCardNow3・・・現在場に出ているカードの3枚目。
pictureBoxCardNow4・・・現在場に出ているカードの4枚目。

CheckedListBox

checkedListBoxMyCards・・・自身の手札。出すカードにチェックを入れる。

 

フォームのBackColor(背景色)はテーブルゲームっぽい色にしています。SeaGreen(#2e8b57)です。

関数もろもろ

コントロールを用意したら次に細かい関数をいろいろ用意していきます。

メッセージ出力

前回コメントアウトしていた関数その1、「WriteMsg」です。labelMsgにテキストを表示させる関数を作ります。

WriteMsg(“メッセージの内容”)と打つだけでlabelMsgに反映されます。
第2引数のboolはTrueを入れると改行して追記するようにしてます(デフォルトはFalse)。

関数化すると”いざコントロールがまるっと変わることになった時”に関数内3箇所の「labelMsg.Text」を変えるだけでよくなります。
最初はこの部分をLabelではなくTextBoxで作っていたので一度助けられました。

 

プレイヤーの名前を取得する

プレイヤーIDから名前を取得して返します。
自身のIDと一致する場合「あなた」を返し、それ以外は「CPU {ID}」の文字列を返しています。

 

カード画像一括読込

前回の記事でコメントアウトしていた関数その2、「ReadCardImage」です。
実行ファイルと同フォルダ内の「img」フォルダから「{種類ID}-{カード番号}.png」(例:♥の6→「1-6.png」)を読み込んで配列cardImgに格納しています。

ちなみにカードの画像はチコデザ様より拝借してます。
トランプのイラスト – オリジナル全53枚のカード無料素材

 

場に出ているカードを表示

カードを出したり消したりした時に呼び出す関数「UpdateViewCardNow」です。
cardsNow(場に出ているカード)が1枚でもあれば先程のReadCardImageで読み込んだ画像を各PictureBoxに表示します。

 

場に出ているカードをすべて消す

カードをリセットします。1巡分終わる時に使います。
コードは至って単純で、cardsNow内全てにID0のカード(空)を入れてるだけ。

 

自身の所持するカードのリストを更新

checkedListBoxMyCardsの項目を更新します。
Listから自身の手札を取得してソートし、データソースとして格納しています。
ついでに残り枚数のテキストも更新しています。

 

カードを場に出す

プレイヤーとカードIDを指定してカードを場に出します。

引数で対象プレイヤー、対象カード1~4枚を指定し、そのプレイヤーがカードを所持しているかチェックします。
カードを持っている or 指定無し(IDが0)ならフラグをTrueにし、4枚分すべてのフラグがTrueならカードを場に出し、手札から削除するようにしています。

Debug~から始まる部分は各値をコンソールに出力していますが、デバッグ用なので無視していいです。

 

次の番へ進める

ここまで紹介した関数を使い、次の番へ進める関数「NextPlayer」を書いていきます。

playerNow(現在のプレイヤーID)を増やして番を進める

必要ならリセット処理をし、メッセージ表示

次のプレイヤーへ

みたいな流れです。

32行目の関数「CpuAI」をコメントアウトしていますが、これはCPUのAIに関するものです。長くなるのでこれは次回に回します。

 

ゲーム開始ボタン

buttonStartのClickイベントを作ります。これが無いと始まりません。

 

初期化処理ちょっと修正

ReadCardImageとWriteMsgを作ったので、前回作った関数「Initialize」の97、98行目のコメントアウトを削除します。後ろから2行分です。

また、こんなルールがありましたね。(Wikipedia引用)

ゲームはダイヤの3から始める。最初の親が手札から最初のカードを出し、以降順番に次のプレイヤーがカードを出し重ねていく。

前回はカードを配る部分しか作っていなかったので、♢の3を持つプレイヤーが親となる所までは出来ていましたが、場に出す処理は入れていないので昇順ソートの次の行に関数CardsPlayを追記します。
前回の記事で言うと84行目辺り。

 

実行してみる

ここまで書いたら実行します。

今回は私が♢の3を持っているようなので親プレイヤーになりました。
Startをクリックします。

 

♢の3が場に出され、手札が表示され、メッセージも表示されました。
番がCPU1へと進んでいます。
また、自身の手札の内容がリストに表示されていることも確認できます。


ごちゃごちゃと書いてますが、まだこのくらいしかできていません。次回はプレイヤーが選んだカードを場に出したり、CPUに選ばせたりできるようにします。

つづく、かも。