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);
}
}
}