1. Создаем колоду. Я думаю, ни для кого не секрет, что 2 основные составляющие игральной карты – это масть и значение карты. Вот от этого и будем отталкиваться при создании колоды. В этой статье нам не понадобится графическая оболочка, поэтому просто создадим консольный проект. А затем, для удобства, сразу новый класс и назовем его Class.cs. Для начала нам нужно создать 2 списка-перечисления(enum) для описания всех возможных карт. CardRank – перечисление значений, и CardSuit – мастей: - // Значения мастей
- public enum CardSuit : int
- {
- Clubs = 0, //крести
- Diamond = 1, // бубны
- Hearts = 2, // червы
- Spades = 3 // пики
- }
- // Значения карт
- public enum CardRank : int
- {
- Ace = 0,
- Two = 1,
- Three = 2,
- Four = 3,
- Five = 4,
- Six = 5,
- Seven = 6,
- Eight = 7,
- Nine = 8,
- Ten = 9,
- Jack = 10,
- Queen = 11,
- King = 12
- }
Далее вот из этих двух списков нам необходимо создать колоду карт. Каждой карте мы присвоим свой уникальный ID путем простого арифметического действия. Пусть y нас y будет ID карты, a – значение карты, а b – масть карты. Формула тогда будет следующая – y=a*4 + b. Следую простой логике и этой формуле у нас получится 52 уникальных ID карты со значениями от 0 до 51 включительно. Теперь напишем функцию для определения этих самых айдишников через масть и значение: - // Функция нахождения ID карты по масти и значению
- public int ToCardNo(CardSuit suit, CardRank rank)
- {
- int cardNo = ((int)rank) * 4 + ((int)suit);
- return cardNo;
- }
Думаю тут все просто. Функция с возвращением переменной типа int, за входящие параметры принимает 2 перечисления, описанных нами выше, и производит над ними простейшую арифметическую операцию, предварительно конвертируя их в числовые значения. Теперь нам необходимо произвести обратную конвертацию карты, то есть из айдишника получить масть и значение. Тут формулы будут еще проще. Для получения значение карты нам нужно ID поделить на 4. То есть a = y/4, остаток отбрасываем, так как нам пока масть не важна и получаем целое число – значение. Функция будет следующая: - // Значение карты по ID
- public CardRank ToCardRank(int cardNo)
- {
- return (CardRank)(cardNo / 4);
- }
А для получения масти нам нужно наоборот получить остаток от деления айдишника на 4: a = y%4. - // Масть карты по ID
- public CardSuit ToCardSuit(int cardNo)
- {
- return (CardSuit)(cardNo % 4);
- }
Все гениальное просто ). Теперь на примере попробуем как эти преобразования работают. В основном классе нашего проекта пишем следующее: - cards cd = new cards();
- for (int i = 0; i < 52; i++)
- {
- int j = i + 1; // Номер карты
- string rank = cd.ToCardRank(i).ToString();
- string suit = cd.ToCardSuit(i).ToString();
-
- Console.WriteLine("{0} карта - {1} {2}", j, rank, suit);
- }
- Console.ReadLine();
После компиляции этого примера нам будет показана вся колода: 1 карта – Ace Clubs, 2 карта – Ace Diamond и так далее все 52 карты. Мы создали цикл от 0 до 51, задали эти значения как айдишники карт и пустили по кругу 2 формулы, описанные выше. Пожалуй с эти закончим. 2. Мешаем карты. И так у нас есть 52 карты и теперь нам их нужно перемешать. Для начала создадим массив чисел от 0 до 51: - List<int> deck = new List<int>();
- for (int i = 0; i < 52; i++)
- {
- deck.Add(i);
- }
Далее создаем функцию, которая и будет перемешивать наш массив: - public static void ShuffleList(List<int> list)
- {
- Random rand = new Random();
- for (int i = 0; i < list.Count; i++)
- {
- int tmp = list[i];
- list.RemoveAt(i);
- list.Insert(rand.Next(0, list.Count), tmp);
- }
- }
В цикле перемещаемся по массиву, удаляя каждый элемент и вставляя его в случайную позицию. Заметьте: код генерирует случайное число, используя новый объект Random при каждом вызове метода; это лучше, чем создание одного объекта Random для всей программы. Вот и все, теперь в нужной нам части кода применяем эту функцию на наш массив и перемешанная колода готова! Для наглядности давайте попробуем раздать карты на двух человек как при игре в «дурака» по принципу, описанному выше: - // Карты первому игроку
- for (int i = 0; i < 6; i++)
- {
- int j = deck[i];
- string rank = cd.ToCardRank(j).ToString();
- string suit = cd.ToCardSuit(j).ToString();
- Console.WriteLine("Карты первому игроку:");
- Console.WriteLine("{0} {1}", rank, suit);
- }
-
- Console.WriteLine("=================");
- // Карты второму игроку
- for (int i = 6; i < 11; i++)
- {
- int j = deck[i];
- string rank = cd.ToCardRank(j).ToString();
- string suit = cd.ToCardSuit(j).ToString();
- Console.WriteLine("Карты второму игроку:");
- Console.WriteLine("{0} {1}", rank, suit);
- }
- Console.ReadLine();
Берем первые шесть карт перемешанного массива, заводим новую переменную j как айдишник карты и в цикле осуществляем функции перевода ID в масть и значение. В следующих статьях я расскажу как подобные вещи использовать в графическом интерфейсе, используя изображения карт. А пока извините, пора домой )
|