public object Clone() { Cards newCards = new Cards(); foreach (Card sourceCard in List) { newCards.Add(sourceCard.Clone() as Card); } return newCards; }
private static bool useJokers = false; // flag for jokers usage #endregion #region Constructors /// <summary> /// Nondefault constructor. Allows to include jokers. /// </summary> public Deck(bool includeJokers = false) { useJokers = includeJokers; // set the useJokers field int numberOfRanks = 14; if (useJokers) { numberOfRanks++; // increase the number of ranks if jokers are included } // Add every card in the deck to the Cards collection for (int suitVal = 0; suitVal < 4; suitVal++) { for (int rankVal = 1; rankVal < numberOfRanks; rankVal++) { cards.Add(new PlayingCard((CardRank)rankVal, (CardSuit)suitVal)); } } }
public void Shuffle() { Cards newDeck = new Cards(); bool[] assigned = new bool[52]; Random sourceGen = new Random(); for (int i = 0; i < 52; i++) { int sourceCard = 0; bool foundCard = false; while (foundCard == false) { sourceCard = sourceGen.Next(52); if (assigned[sourceCard] == false) { foundCard = true; } } assigned[sourceCard] = true; newDeck.Add(cards[sourceCard]); } newDeck.CopyTo(cards); }
public void Shuffle() { Cards newDeck = new Cards(); bool[] assigned = new bool[52]; Random sourceGen = new Random(); for (int i = 0; i < 52; i++) { int sourceCard = 0; bool foundCard = false; while (foundCard == false) { sourceCard = sourceGen.Next(52); if (assigned[sourceCard] == false) foundCard = true; } assigned[sourceCard] = true; newDeck.Add(cards[sourceCard]); } newDeck.CopyTo(cards); }
public bool HasWon() { // Создать временную копию раскладки на руках, которая может изменяться. Cards tempHand = (Cards)PlayHand.Clone(); // Найти наборы по три и четыре карты bool fourOfAKind = false; bool threeOfAKind = false; int fourRank = -1; int threeRank = -1; int cardsOfRank; for (int matchRank = 0; matchRank < 13; matchRank++) { cardsOfRank = 0; foreach (Card c in tempHand) { if (c.rank == (Rank)matchRank) { cardsOfRank++; } } if (cardsOfRank == 4) { // Пометить набор из четырех карт fourRank = matchRank; fourOfAKind = true; } if (cardsOfRank == 3) { // Два набора по три карты означают невозможность выигрыша // (threeOfAKind будет true, только если этот код уже выполнялся) if (threeOfAKind == true) { return false; } // Пометить набор из трех карт threeRank = matchRank; threeOfAKind = true; } } // Проверить простое условие выигрыша if (threeOfAKind && fourOfAKind) { return true; } // Упростить раскладку на руках, если найдет набор из трех или четырех карт, // удалив использованные карты if (fourOfAKind || threeOfAKind) { for (int cardIndex = tempHand.Count - 1; cardIndex >= 0; cardIndex--) { if ((tempHand[cardIndex].rank == (Rank)fourRank) || (tempHand[cardIndex].rank == (Rank)threeRank)) { tempHand.RemoveAt(cardIndex); } } } // В этой точке из метода может быть возврат, поскольку: // - найден набор из четырех и набор из трех карт, выигрыш // - найдено два набора из трех карт, проигрыш // Если возврат из метода не произошел, это означает одну из следующих ситуаций: // - ни одного набора не найдено, и tempHand содержит 7 карт // - найден набор из трех карт, и tempHand содержит 4 карты // - найден набор из четырех карт, и tempHand содержит 3 карты // Найти исход из четырех наборов, начиная с поиска карт той же самой масти // показанным ранее способом bool fourOfASuit = false; bool threeOfASuit = false; int fourSuit = -1; int threeSuit = -1; int cardsOfSuit; for (int matchSuit = 0; matchSuit < 4; matchSuit++) { cardsOfSuit = 0; foreach (Card c in tempHand) { if (c.suit == (Suit)matchSuit) { cardsOfSuit++; } } if (cardsOfSuit == 7) { // Если все карты имеют ту же самую масть, возможны, но не очевидны два исхода threeOfASuit = true; threeSuit = matchSuit; fourOfASuit = true; fourSuit = matchSuit; } if (cardsOfSuit == 4) { // Пометить набор из четырех карт одной масти fourOfASuit = true; fourSuit = matchSuit; } if (cardsOfSuit == 3) { // Пометить набор из трех карт одной масти threeOfASuit = true; } threeSuit = matchSuit; } if (!(threeOfASuit || fourOfASuit)) { // Чтобы можно было продолжить, нужен, по меньшей мере, один исход return false; } if (tempHand.Count == 7) { if (!(threeOfASuit && fourOfASuit)) { // Нужны наборы из трех и четырех карт одной масти return false; } // Создать два временных набора для проверки Cards set1 = new Cards(); Cards set2 = new Cards(); // Если все 7 карт имеют ту же самую масть... if (threeSuit == fourSuit) { // Получить минимальное и максимальное достоинства карт int maxVal, minVal; GetLimits(tempHand, out maxVal, out minVal); for (int cardIndex = tempHand.Count - 1; cardIndex >= 0; cardIndex--) { if (((int)tempHand[cardIndex].rank< (minVal + 3)) || ((int)tempHand[cardIndex].rank > (maxVal - 3))) { // Удалить все карты из набора из трех карт, которые // начинаются с minVal или заканчиваются на maxVal tempHand.RemoveAt(cardIndex); } } if (tempHand.Count != 1) { // Если осталось более одной карты, двух исходов не будет return false; } if ((tempHand[0].rank == (Rank)(minVal + 3)) || (tempHand[0].rank == (Rank)(maxVal - 3))) { // Если запасная карта может превратить один из наборов из трех карт // в набор из четырех карт, значит, есть два набора return true; } else { // Если запасная карта не подходит, значит, есть два набора из трех // карт, но ни одного набора из четырех карт return false; } } // Если наборы из трех и четырех карт отличаются... foreach (Card card in tempHand) { // Разделить карты в наборы if (card.suit == (Suit)threeSuit) { set1.Add(card); } else { set2.Add(card); } } // Проверить, последовательны ли наборы if (isSequential(set1) && isSequential(set2)) { return true; } else { return false; } } // Если остается четыре карты (найдено три карты одного достоинства) if (tempHand.Count == 4) { // Если осталось четыре карты, они должны быть той же самой масти if (!fourOfASuit) { return false; } // Выигрыш, если карты последовательны if (isSequential(tempHand)) { return true; } } // Если остается три карты (найдено четыре карты одного достоинства) if (tempHand.Count == 3) { // Если осталось три карты, они должны быть той же самой масти if (!threeOfASuit) { return false; } // Выигрыш, если карты последовательны if (isSequential(tempHand)) { return true; } } // Вернуть false, если не существует двух допустимых наборов return false; }