七並べゲームをするためには相手が必要です。対戦相手は3人でプレイヤーとあわせて4人で勝負をおこないます。対戦相手はコンピュータが担当します。出せるカードを適当に出していきます。
相手が決まったら次にカードを配る必要があります。今回はジョーカーは使いません(ややこしくなるので)。
メニュー[スタート]がクリックされたらゲームスタートです。
1 2 3 4 5 6 7 8 9 10 11 12 |
public partial class Form1 : Form { private void StartToolStripMenuItem_Click(object sender, EventArgs e) { GameStart(); } void GameStart() { // 後述 } } |
乱数をつかって52枚のカードを選んでいきます。
1 |
List<Card> cards1 = cards.ToList(); |
まずカードのリストのコピーをつくります。ここから4人で乱数で数値を発生させてカードを取っていきます。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
public partial class Form1 : Form { // プレイヤーは4人 List<Card>[] playersCards = new List<Card>[4]; // ゲームで使う乱数発生器 Random random = new Random(); public Form1() { InitializeComponent(); BackColor = Color.Green; Init(); playersCards[0] = new List<Card>(); playersCards[1] = new List<Card>(); playersCards[2] = new List<Card>(); playersCards[3] = new List<Card>(); } void GameStart() { HandoutCards(); } // カードを配る void HandoutCards() { List<Card> cards1 = cards.ToList(); int i; int count = 0; playersCards[0] = new List<Card>(); playersCards[1] = new List<Card>(); playersCards[2] = new List<Card>(); playersCards[3] = new List<Card>(); while(true) { // 誰に配るか? List<Card> player = playersCards[count % 4]; count++; // カードがなくなったら終わり if(cards1.Count == 0) break; // 何を配るか? i = random.Next(0, cards1.Count); Card card = cards1[i]; player.Add(card); cards1.RemoveAt(i); } // ためしに自分に配られたカードを表示させる foreach(Card card1 in playerCards[0]) card1.isExists = true; Invalidate(); } } |
ためしに自分に配られたカードを表示させてみると、こんな感じになります。乱数を使用しているため、実行するたびに違う結果が得られます。
まず最初に7を持っている人は出します。
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 |
public partial class Form1 : Form { void GameStart() { HandoutCards(); Takeout7(); // 7を持っている人は出す } void Takeout7() { // 7のカードを持っていたら手持ちのカードから取り除く for(int i =0; i< playersCards.Length; i++) { playersCards[i] = playersCards[i].Where(x => x.Number != 7).ToList(); } // 7のカードはテーブルの上に存在する状態である foreach(Card card in cards) { if(card.Number == 7) card.isExists = true; } Invalidate(); } } |
カードを配り終わったら自分のカードを表示させる必要があります。もし自分のカードが存在するのであれば自作メソッドShowMyCardsで表示させます。
カードを表示させる場所ですが、テーブルに出されているカードの下側に表示させます。カードのサイズは60ピクセル×90ピクセルで10ピクセルの隙間があります。そこで自分のカードを表示させる部分のY座標は450くらいに設定します。複数のカードがある場合はX座標を右に70ピクセルずらして表示させます。
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 31 32 |
public partial class Form1 : Form { private void Form1_Paint(object sender, PaintEventArgs e) { foreach(Card card in cards) card.ShowCard(e.Graphics); ShowMyCards(e.Graphics); } void ShowMyCards(Graphics g) { if(playersCards[0] == null || playersCards[0].Count == 0) return; // まずカードをソートする List<Card> cards1 = new List<Card>(); cards1.AddRange(playersCards[0].Where(x => x.Mark == CardMark.spade).OrderBy(x => x.Number)); cards1.AddRange(playersCards[0].Where(x => x.Mark == CardMark.hart).OrderBy(x => x.Number)); cards1.AddRange(playersCards[0].Where(x => x.Mark == CardMark.dia).OrderBy(x => x.Number)); cards1.AddRange(playersCards[0].Where(x => x.Mark == CardMark.club).OrderBy(x => x.Number)); int i = 20; foreach(var card in cards1) { Point pt = new Point(i, 450); card.CopyDrawCard(g, pt); // カードをコピーして表示する i += 70; } } } |
CopyDrawCardメソッドはカードをコピーして任意の座標に表示させるメソッドです。大きさはもとのカードと同じサイズです。
1 2 3 4 5 6 7 8 9 |
class Card { public void CopyDrawCard(Graphics g, Point pt) { // カードをコピーして表示する Rectangle rect = new Rectangle(pt, Size); g.DrawImage(Bitmap, rect); } } |
失礼いたします。
下記の部分ですが 、コンテキストにplayerCardsという名前が存在しません
というエラーが表示されます。
また、playerCardsをplayersCardsに修正するとforeachの部分でエラーになります。
// ためしに自分に配られたカードを表示させる
foreach(Card card1 in playerCards)
card1.isExists = true;
Invalidate();
失礼いたします。
下記の部分ですが 、コンテキストにplayerCardsという名前が存在しません
というエラーが表示されます。
恐らくplayerCardsがplayersCards[0]だと思いますが…
ご指摘ありがとうございます。正しくは
です。