Contents
8は万能カード?
8は台札がなにであっても出すことができます。
8が出されたあとに出されるカードとは
では8が出されたとき、次の人はどうなるのでしょうか? 8または「同じ色のマークのカード」「8を出した人が指定できる」というルールがあります。簡単にするために「同じ色のマークのカード」にします。
これまではPlayerクラスのPutCardメソッドにおいて、このような方法で出すことができるカードを求めていました。
1 2 3 4 5 6 7 8 9 10 |
public class Player { public Card PutCard(Card card, List<Card> shuffledCards) { // 出せるカードを求める List<Card> cards1 = Cards.Where(x => x.Number == card.Number || x.Suit == card.Suit).ToList(); // 以下、省略 } } |
手札のなかから出せるカードを求める
8はどの台札に対しても使える、8のあとはこれまでとは違うルールがあるということから出せるカードを求めるメソッドを作成しました。
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 |
public class Player { public List<Card> GetAblePutCards(Card card) { List<Card> ret = null; // 8 はとにかく出すことができる ret = Cards.Where(x => x.Number == 8).ToList(); if(card.Number != 8) { // 台札が8でないときはスートが同じ、または数字が同じカードが出せる ret.AddRange(Cards.Where(x => x.Suit == card.Suit || x.Number == card.Number).ToList()); } else { // 台札が8のときはすでに取得している数字が8のカードと // 同じ色のスートのカードが出せる if(card.Suit == Suit.Spade || card.Suit == Suit.Club) ret.AddRange(Cards.Where(x => x.Suit == Suit.Spade || x.Suit == Suit.Club).ToList()); else if(card.Suit == Suit.Dia || card.Suit == Suit.Hart) ret.AddRange(Cards.Where(x => x.Suit == Suit.Dia || x.Suit == Suit.Hart).ToList()); } // 重複を取り除く return ret.Distinct().ToList(); } } |
台札に対してそのカードは出せるのか
カードと台札からそのカードは出せるかを判定するメソッドも作成しました。
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 |
public class Player { // card1はcard2に対して出すことはできるか? public bool IsAblePutCards(Card card1, Card card2) { if(card1.Number == 8) return true; if(card2.Number != 8) { if(card1.Number == card2.Number || card1.Suit == card2.Suit) return true; else return false; } else { if(card2.Suit == Suit.Spade || card2.Suit == Suit.Club) { if(card1.Suit == Suit.Spade || card1.Suit == Suit.Club) return true; else return false; } else { if(card1.Suit == Suit.Dia || card1.Suit == Suit.Hart) return true; else return false; } } } } |
新しいPutCardメソッド
このふたつのメソッドからPutCardメソッドをこのように書き直します。
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 |
public class Player { public Card PutCard(Card card, List<Card> shuffledCards) { // 出せるカードを求める List<Card> cards1 = GetAblePutCards(card); Card ret = null; if(cards1.Count == 1) { Cards.Remove(cards1[0]); ret = cards1[0]; System.Threading.Thread.Sleep(1000); PlayerPanel.Invalidate(); } else if(cards1.Count > 1) { // 複数ある場合 int index = Random.Next(cards1.Count); Card card1 = cards1[index]; Cards.Remove(card1); ret = card1; System.Threading.Thread.Sleep(1000); PlayerPanel.Invalidate(); } else { // 出せるカードがない場合 while(true) { // 積み札がなくなったらすでに出されているカードを使う。 if(shuffledCards.Count == 0) _form1.ShuffleCard(card); Card addCard = shuffledCards[0]; shuffledCards.RemoveAt(0); // 出せるカードがない場合は積み札からとり続けなければならない if(IsAblePutCards(addCard, card)) { ret = addCard; break; } else { Cards.Add(addCard); System.Threading.Thread.Sleep(1000); PlayerPanel.Invalidate(); } } } System.Threading.Thread.Sleep(1000); PlayerPanel.Invalidate(); return ret; } } |
自分のターンでカードをクリックしたときの動作
自分のターンのときはどうなるでしょうか? カードをクリックしたときに適切かどうかを判定するメソッドを一部変更するだけです。
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 { bool CheckUnjustClick(Card card) { if(!IsMyTurn) { MessageBox.Show("まだあなたの番ではありません"); return true; } if(card == null) { panelSouth.Invalidate(); MessageBox.Show("カードがある位置をクリックしてください"); return true; } if(! Players[0].IsAblePutCards(card, CenterCard)) // ここだけ変更 { MessageBox.Show("このカードは出せません"); return true; } return false; } } |