Вторник, Май 26, 2020

CardDeck

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CardDeck
{
    enum Suits { Spades, Clubs, Diamonds, Hearts }
    enum Values
    {
        Ace = 1, Two = 2, Three = 3, Four = 4, Five = 5,
        Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10, Jack = 11,
        Queen = 12, King = 13
    }
    class Card
    {
        public Suits Suit { get; set; }
        public Values Value { get; set; }
        public Card(Suits Suit, Values Value)
        {
            this.Suit = Suit;
            this.Value = Value;
        }
        public string Name
        {
            get { return Value.ToString() + " of " + Suit.ToString(); }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CardDeck
{
    class CardComparer_bySuit : IComparer<Card>
    {
        public int Compare(Card x, Card y)
        {
            if (x.Suit > y.Suit)
                return 1;
            if (x.Suit < y.Suit)
                return -1;
            if (x.Value > y.Value)
                return 1;
            if (x.Value < y.Value)
                return -1;
            return 0;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CardDeck
{
    class Deck
    {
        //Класс Deck хранит объекты в коллекции List, при этом он является закрытым.
        private List<Card> cards;
        private Random random = new Random();
        public Deck()
        {
            cards = new List<Card>();
            //Полная колода из 52 карт будет создана без передачи параметров конструктору.
            for (int suit = 0; suit <= 3; suit++)
                for (int value = 1; value <= 13; value++)
                    cards.Add(new Card((Suits)suit, (Values)value));
        }
        //Принадлежность параметра к типу IEnumerable<Card> позволяет передвать
        //конструктору любую коллекцию, а не только List<T> или массив.
        public Deck(IEnumerable<Card> initialCards)
        {
            //Перегруженный конструктор в качестве параметра берет массив карт,
            //загружая его в исходную колоду.
            cards = new List<Card>(initialCards);
        }
        public int Count { get { return cards.Count; } }
        public void Add(Card cardToAdd)
        {
            cards.Add(cardToAdd);
        }
        //Метод Deal(Раздача) выдает одну карту из колоды, он удаляет объект Card
        // и возвращает ссылку на него. Передав 0, вы сдадите верхнюю карту колоды.
        //Чтобы сдать любую другую карту, укажите ее индекс.
        public Card Deal(int index)
        {
            Card CardToDeal = cards[index];
            cards.RemoveAt(index);
            return CardToDeal;
        }
        //Метод Shuffle() создает экземпляр List<Cards> с именем NewCards.
        //Затем он берет случайную карту из поля Cards и помещает в коллекцию
        // NewCards, пока коллекция Cards не опустеет. После этого он перенаправляет
        //поле Cards на новый экземпляр. Так как ссылок на старый экземпляр
        //в итоге не остается, он удалятеся.
        public void Shuffle()
        {
            List<Card> NewCards = new List<Card>();
            while (cards.Count > 0)
            {
                int CardToMove = random.Next(cards.Count);
                NewCards.Add(cards[CardToMove]);
                cards.RemoveAt(CardToMove);
            }
            cards = NewCards;
        }
        //Методу GetCardNames() нужна создать достаточно большой массив, чтобы в
        //него поместились имена всех карт. Для этого используется цикл for, хотя
        //задача решаема и с помощью цикла foreach.
        public IEnumerable<string> GetCardNames()
        {
            string[] CardNames = new string[cards.Count];
            for (int i = 0; i < cards.Count; i++)
                CardNames[i] = cards[i].Name;
            return CardNames;
        }
        public void Sort()
        {
            cards.Sort(new CardComparer_bySuit());
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CardDeck
{

    public partial class Form1 : Form
    {
        Deck deck1;
        Deck deck2;
        Random random = new Random();
        public Form1()
        {
            InitializeComponent();
            ResetDeck(1);
            ResetDeck(2);
            RedrawDeck(1);
            RedrawDeck(2);
        }
        private void ResetDeck(int deckNumber)
        {
            if (deckNumber == 1)
            {
                int numberOfCards = random.Next(1, 11);
                deck1 = new Deck(new Card[] { });
                for (int i = 0; i < numberOfCards; i++)
                    //Для восстановления колоды #1 сначала используется метод
                    //random.Next(), после чего создается пустая колода. При
                    //помощи цикла for туда добавляются случайные карты. Напоследок
                    // остается провести сортировку. Востановить колоду #2 еще проще.
                    //Достаточно создать экземпляр Deck()
                    deck1.Add(new Card((Suits)random.Next(4),
                        (Values)random.Next(1, 14)));
                deck1.Sort();
            }
            else
                deck2 = new Deck();
        }
        //Метод RedrawDeck() тасует колоду, вытаскивает из нее случайные карты,
        // и обновляет содержимое текстовых полей в соответствии с проделанным обменом.
        private void RedrawDeck(int DeckNumber)
        {
            if (DeckNumber == 1)
            {
                listBox1.Items.Clear();
                //Обратите внимание, как карты добавляются в коллекцию при помощи цикла foreach
                foreach (string cardName in deck1.GetCardNames())
                    listBox1.Items.Add(cardName);
                label1.Text = "Deck #1 (" + deck1.Count + " cards)";
            }
            else
            {
                listBox2.Items.Clear();
                foreach (string cardName in deck2.GetCardNames())
                    listBox2.Items.Add(cardName);
                label2.Text = "Deck #2 (" + deck2.Count + " cards)";
            }
        }
        private void reset1_Click(object sender, EventArgs e)
        {
            ResetDeck(1);
            RedrawDeck(1);
        }

        private void reset2_Click(object sender, EventArgs e)
        {
            ResetDeck(2);
            RedrawDeck(2);
        }

        private void shuffle1_Click(object sender, EventArgs e)
        {
            deck1.Shuffle();
            RedrawDeck(1);
        }

        private void shuffle2_Click(object sender, EventArgs e)
        {
            deck2.Shuffle();
            RedrawDeck(2);
        }

        private void moveToDeck1_Click(object sender, EventArgs e)
        {
            if(listBox2.SelectedIndex>=0)
                if (deck2.Count > 0)
                    deck1.Add(deck2.Deal(listBox2.SelectedIndex));
            RedrawDeck(1);
            RedrawDeck(2);
        }

        private void moveToDeck2_Click(object sender, EventArgs e)
        {
            if (listBox1.SelectedIndex >= 0)
                if (deck1.Count > 0)
                    deck2.Add(deck1.Deal(listBox1.SelectedIndex));
            RedrawDeck(1);
            RedrawDeck(2);
        }
    }
}

Back to Top