// Создание раздачи на четверых игроков /*public void Distribution(CardList p1, CardList p2, CardList p3, CardList p4) { // Если какой то из списков не предоставлен, то и колоду раздать не получится if ((p1 == null) || (p2 == null) || (p3 == null) || (p4 == null)) { return; } // Раздаем по 8 карт каждому игроку for (var i = 0; i < 8; i++) { p1.Add(GetRandomCard()); p2.Add(GetRandomCard()); p3.Add(GetRandomCard()); p4.Add(GetRandomCard()); } // Сортируем карты для всех игроков p1.Sort(); p2.Sort(); p3.Sort(); p4.Sort(); }*/ // Создание тестовой раздачи на четверых игроков public void Distribution(CardList p1, CardList p2, CardList p3, CardList p4) { // Если какой то из списков не предоставлен, то и колоду раздать не получится if ((p1 == null) || (p2 == null) || (p3 == null) || (p4 == null)) { return; } p1.Add(new Card(CardType.C_K, CardSuit.C_SPADES)); p1.Add(new Card(CardType.C_Q, CardSuit.C_SPADES)); p1.Add(new Card(CardType.C_J, CardSuit.C_SPADES)); p1.Add(new Card(CardType.C_J, CardSuit.C_HEARTS)); p1.Add(new Card(CardType.C_10, CardSuit.C_HEARTS)); p1.Add(new Card(CardType.C_9, CardSuit.C_HEARTS)); p1.Add(new Card(CardType.C_8, CardSuit.C_HEARTS)); p1.Add(new Card(CardType.C_7, CardSuit.C_HEARTS)); p2.Add(new Card(CardType.C_K, CardSuit.C_CLUBS)); p2.Add(new Card(CardType.C_Q, CardSuit.C_CLUBS)); p2.Add(new Card(CardType.C_J, CardSuit.C_CLUBS)); p2.Add(new Card(CardType.C_10, CardSuit.C_CLUBS)); p3.Add(new Card(CardType.C_9, CardSuit.C_CLUBS)); p3.Add(new Card(CardType.C_8, CardSuit.C_CLUBS)); p2.Add(new Card(CardType.C_7, CardSuit.C_CLUBS)); p2.Add(new Card(CardType.C_8, CardSuit.С_DIAMONDS)); p3.Add(new Card(CardType.C_10, CardSuit.C_SPADES)); p3.Add(new Card(CardType.C_9, CardSuit.C_SPADES)); p3.Add(new Card(CardType.C_8, CardSuit.C_SPADES)); p2.Add(new Card(CardType.C_7, CardSuit.C_SPADES)); p3.Add(new Card(CardType.C_10, CardSuit.С_DIAMONDS)); p2.Add(new Card(CardType.C_9, CardSuit.С_DIAMONDS)); p3.Add(new Card(CardType.C_J, CardSuit.С_DIAMONDS)); p3.Add(new Card(CardType.C_7, CardSuit.С_DIAMONDS)); p4.Add(new Card(CardType.C_A, CardSuit.C_CLUBS)); p4.Add(new Card(CardType.C_A, CardSuit.C_SPADES)); p4.Add(new Card(CardType.C_A, CardSuit.C_HEARTS)); p4.Add(new Card(CardType.C_A, CardSuit.С_DIAMONDS)); p4.Add(new Card(CardType.C_K, CardSuit.C_HEARTS)); p4.Add(new Card(CardType.C_Q, CardSuit.C_HEARTS)); p4.Add(new Card(CardType.C_K, CardSuit.С_DIAMONDS)); p4.Add(new Card(CardType.C_Q, CardSuit.С_DIAMONDS)); // Сортируем карты для всех игроков p1.Sort(); p2.Sort(); p3.Sort(); p4.Sort(); }
// Создание колоды для игры в блот public CardsDeck() { list = new CardList(); random = new Random(); // Добавляем в список все возможные карты в колоде foreach (CardSuit s in Enum.GetValues(typeof(CardSuit))) { if (s == CardSuit.C_NONE) continue; foreach (CardType t in Enum.GetValues(typeof(CardType))) { if (t == CardType.C_UNDEFINED) continue; list.Add(new Card(t, s)); } } }
// Функция возвращает список возможных к ходу карт, полученный из текущего списка карт, по взятке и месту хода public CardList PossibleCardsToMove(Bribe bribe, int Place) { #if DEBUG Debug.WriteLine("{0} Поиск повзможных карт для хода по текущей взятке ({1}) и номеру игрока - {2}", DateTime.Now, bribe, Place); #endif // В случае если взятка завершена, то игрок будет делать ход на следующей - соответственно он может использовать любую карту if ((bribe.IsEnded) || (bribe.IsEmpty)) return this; CardList possibleCards = new CardList(); // Если первый игрок пошел не с козырной масти... Случаи 1, 2, 3, 6 if (!bribe.IsTrumpBribe) { // В случае если на взятке с запрашиваемой некозырной мастью не было сделано хода с козырной мастью... Случаи 1, 2, 3 if (!bribe.BribeTrumped) { // Если у игрока есть карты этой масти, то можно пойти ими... Случай 1 if (SuitExists(bribe.BribeSuit)) { foreach (Card c in list) { if (c.Suit == bribe.BribeSuit) { possibleCards.Add(c); } } } else // Если у игрока нет карт запрашиваемой масти, но есть козыри, то нужно пойти одним из них... Случай 2 if (TrumpExists()) { // Если у игрока нет запрашиваемой масти, но в то же время первая карта старше if (bribe.FulledCount == 2) { // Если второй игрок пошел некозырной картой другой масти, то можно ходить любой картой if (bribe[0].Suit != bribe[1].Suit) return this; else { // Если первая карта больше второй, то можно пойти любой картой if (bribe[0].ThisIsBiggerThen(bribe[1])) return this; } } // Если у игрока нет запрашиваемой масти, но в то же время вторая карта старше if (bribe.FulledCount == 3) { // Если второй игрок пошел некозырной картой той же масти что и первый - проверяем дальше if (bribe[0].Suit == bribe[1].Suit) { // Если и третий игрок пошел той же мастью if (bribe[2].Suit == bribe[0].Suit) { // Если карта второго игрока больше чем карта первого и третьего - то можно пойти любой картой if ((bribe[1].ThisIsBiggerThen(bribe[0])) && (bribe[1].ThisIsBiggerThen(bribe[2]))) return this; } else { // Если первый игрок пошел картой младше - то можно ходить любой if (bribe[1].ThisIsBiggerThen(bribe[0])) return this; } } } foreach (Card c in list) { if (c.IsTrump) { possibleCards.Add(c); } } } // Если у игрока нет ни карт запрашиваемой масти, ни козырей, то он может пойти любой картой... Случай 3 else { return this; } } // Если на вязтке с запрашиваемой некозырной мастью был совершен ход козырной мастью... Случай 6 else { // Если имеются карты запрашиваемой масти, то надо ходить ими if (SuitExists(bribe.BribeSuit)) { foreach (Card c in list) { if (c.Suit == bribe.BribeSuit) { possibleCards.Add(c); } } } else { // Если ходит 4 игрок, то он не обязан перебивать карту своего сокомандника (игрока №2), если она козырная, иначе необходимо перебить, если возможно if (bribe.FulledCount == 3) { if (bribe[1].IsTrump) { // Если же и третий игрок пошел козырем, то нужно проверить, больше ли он чем козырь второго игрока if ((bribe[2].IsTrump) && (bribe[2].Cost >= bribe[1].Cost) && (bribe[2].Type != CardType.C_7)) { // Необходимо попробовать перебить Card card1 = list.Find(c => (c.IsTrump) && (c.Cost >= bribe.SeniorTrump.Cost) && (c.Type != CardType.C_7)); // В случае, если у игрока имеются козыри, старше чем использовались на раздаче, нужно использовать их if (card1 != null) { foreach (Card c in list) { if ((c.IsTrump) && (c.Cost > bribe.SeniorTrump.Cost)) possibleCards.Add(c); } return possibleCards; } // Если и таких карт нет, то можно использовать любую карту из имеющихся else { return this; } } else { return this; } } } Card card = list.Find(c => (c.IsTrump) && (c.Cost >= bribe.SeniorTrump.Cost) && (c.Type != CardType.C_7)); // В случае, если у игрока имеются козыри, старше чем использовались на раздаче, нужно использовать их if (card != null) { foreach (Card c in list) { if ((c.IsTrump) && (c.Cost >= bribe.SeniorTrump.Cost)) possibleCards.Add(c); } } // Если и таких карт нет, то можно использовать любую карту из имеющихся else { return this; } } } } // В случае если заказанная масть на взятке - козырная... Случаи 4, 5 else { // Если у ходящего игрока имеются козыри... Случай 4 if (TrumpExists()) { Card card = list.Find(c => (c.IsTrump) && (c.Cost >= bribe.SeniorTrump.Cost) && (c.Type != CardType.C_7)); // Если найдены козыри старше, чем использованы на взятке, то необходимо использовать их if (card != null) { foreach (Card c in list) { if ((c.IsTrump) && (c.Cost >= bribe.SeniorTrump.Cost)) possibleCards.Add(c); } } // Если козырей старше нет, то можно использовать любой else { foreach (Card c in list) { if (c.IsTrump) possibleCards.Add(c); } } } // Если козырей нет, то он может пойти любой картой... Случай 5 else { return this; } } return possibleCards; }