前回まで七並べゲームを作成してきました。他のカードゲームもつくってみます。今回はババ抜きを作ります。
参加者は自分以外はコンピュータです。前回同様、コンピュータには一台で複数役をやってもらいます。
使用するカードはスペード、ハート、ダイヤ、クラブをそれぞれ13枚とジョーカーを使います。
ゲーム開始の準備
まずカードをつくる必要があります。ただ七並べのようにすべてのカードをテーブルのうえに置く必要はありません。フォームに表示されるカードは自分のカードと自分が引こうとしている相手のカードだけでよいのではないでしょうか? あと他のライバルがカードを何枚持っているかがわかれば充分であると考えます。
今回もカードクラスを作成します。カードに必要なことは記号、番号……くらいでよいと思います。トランプに書かれているマークのことをスート(英語: suit)というそうです。以降は「スート」という言葉を使います。
七並べゲームではプレイヤークラスは最後まで作りませんでしたが、今回は先につくります。プレイヤークラスはプレイヤーの名前、自分がもっているカード、カードがなくなったときの順位などを管理します。
Cardクラスをつくる
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class Card {     public Card(Suit suit, int number)     {         Suit = suit;         Number = number;     }     public Suit Suit     {         private set;         get;     }     public int Number     {         private set;         get;     } } public enum Suit {     None = -1,     Joker = 0,     Spade = 1,     Hart = 2,     Dia = 3,     Club = 4, } | 
Playerクラスをつくる
次にプレイヤーに関するクラスを作成します。それぞれのプレイヤーの名前や持っているカードを管理させます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class Player {     public Player(string name)     {         Name = name;     }     public string Name     {         set;         get;     } = "名無し";     public List<Card> Cards = new List<Card>();     public bool IsFinished = false; // あがったかどうか? } | 
カードを生成する
ではゲームを開始するまえにカードをつくりましょう。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public partial class Form1 : Form {     public Form1()     {         InitializeComponent();         CreateCards();     }     List<Card> Cards = new List<Card>();     void CreateCards()     {         for(int i=1; i<=13; i++)             Cards.Add(new Card(Suit.Spade, i));         for(int i = 1; i <= 13; i++)             Cards.Add(new Card(Suit.Hart, i));         for(int i = 1; i <= 13; i++)             Cards.Add(new Card(Suit.Dia, i));         for(int i = 1; i <= 13; i++)             Cards.Add(new Card(Suit.Club, i));         Cards.Add(new Card(Suit.Joker, 0));     } } | 
カードがないとゲームにならないので、コンストラクタのなかでカードを作ってしまいます。そして生成された53枚のカードをフィールド変数 Cardsに格納します。
プレイヤーの生成
つぎにこれをプレイヤーたちに配るのですが、そのまえにプレイヤーの人数を決める必要があります。七並べでは4人で固定でしたが、ババ抜きゲームでは変更できるようにします。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | public partial class Form1 : Form {     List<Player> Players = new List<Player>();     void CreatePlayer()     {         Players.Add(new Player("あなた"));         Players.Add(new Player("佐藤さん"));         Players.Add(new Player("鈴木さん"));         Players.Add(new Player("高橋さん"));         Players.Add(new Player("田中さん"));     } } | 
とりあえず5人にしました。ここに新しいプレイヤーに適当な名前をつけて参加させることができます。名前は日本人の名字を多い順にならべただけです。
5位  伊藤
6位  渡辺
7位  山本
8位  中村
9位  小林
10位  加藤
と続きます。以上、どうでもいい話でした。
プレイヤーの生成もコンストラクタのなかでやってしまいましょう。
| 1 2 3 4 5 6 7 8 9 10 | public partial class Form1 : Form {     public Form1()     {         InitializeComponent();         CreateCards();         CreatePlayer();     } } | 
カードを配るためのメソッド
出場者が決まったらカードを配ります。メニューの[ゲームスタート]がクリックされたらゲーム開始になるのですが、2回目を続けて行なう場合、持っているカードを初期化しなければなりません。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public partial class Form1 : Form {     Random random = new Random();     void HandoutCards()     {         List<Card> cards = Cards.ToList();         int playersCount = Players.Count;         // 持っているカードはクリアする         for(int i = 0; i < playersCount; i++)             Players[i].Cards.Clear();         // カードは53枚         for(int i=0; i<53; i++)         {             // 何を配るか?(乱数で決める)             int index = random.Next(0, cards.Count);             Card card = cards[index];             // 誰に配るか?             int id = i % playersCount;             Players[id].Cards.Add(card);             cards.RemoveAt(index);         }     } } | 
カードを配るメソッドはGameStartというメソッドをつくってそのなかで実行するのが適切ではないでしょうか?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public partial class Form1 : Form {     // メニューの[ゲームスタート]がクリックされたらゲーム開始     private void GameStartMenuItem_Click(object sender, EventArgs e)     {         GameStart();     }     void GameStart()     {         // ゲーム開始時は誰もあがっていない状態にする         foreach(Player player in Players)             player.IsFinished = false;         HandoutCards();     } } | 
実験してみると正しく配られていることがわかります。
