|
Программирование >> Программирование с использованием ajax
Здесь переопределенный метод ToString записывает строковое представление хранящегося значения перечисления в возвращаемую строку, а конструктор не по умолчанию инициализирует значения полей suit и rank. Добавление класса Deck Для класса Deck с помощью диаграммы классов необходимо определить следующие члены. □ Приватное поле с именем cards и типом Card [ ]. □ Общедоступный конструктор, который должен использоваться по умолчанию. □ Общедоступный метод с именем GetCard, принимающий один параметр типа int по имени cardNumb и возвращающий объект типа Card. □ Общедоступный метод с именем Shuffle, не принимающий никаких параметров и возвращающий void. После добавления этих членов класс Deck в окне Class Details должен выглядеть так, как показано на рис. 10.15. Тур - ♦ Deck Dubiic ....EJ-?JI ...Z. ;;ut>flc - У g 4 Shufily voidГГ 7У.Р?-ГГ.Т . -- - - 4 ;о, ям**л ff fJopttHu ........ Puc. 10.15. Окно Class Details после ввода информации, необходимой для класса Deck Чтобы сделать картину в диаграмме еще более ясной, можно отобразить отношения между добавленными членами и типами. Для этого нужно щелкнуть правой кнопкой мыши на каждом члене в диаграмме классов по очереди и выбрать в контекстном меню пункт Show as Association (Показать как ассоциацию): □ cards в Deck □ suit в Card □ rank в Card По завершении диаграмма должна приобрести вид, показанный на рис. 10.16. Далее нужно изменить код в файле Deck. cs так, как показано в приведенном ниже коде (или, если используется среда VCE, сначала добавить новый соответствующий класс и ввести в нем приведенный здесь код). В этом коде первым делом реализуется конструктор, который просто создает и присваивает 52 карты полю cards. Для этого осуществляется проход по всем возможным комбинациям значений из двух перечислений с использованием каждой для создания карты, что в результате приводит к тому, что в cards первоначально содержится упорядоченный список карт:
jift cards CItti Mffthods ♦ Card (♦ 1 ovtrload) ToStnng ♦ rank Deuce Птгее Four Frve Seven Eight Nine Jack Queen King Puc. 10.16. Диаграмма классов после отображения отношений using System; using System.Collections.Generic; using System.Text; namespace ChlOCardLib { public class Deck { private Card[] cards; public Deck 0 cards = new Card [52] ; for (int suitVal = 0; suitVal < 4; suitVal++) { for (int rankVal = 1; rankVal < 14; rankVal++) { cards [suitVal * 13 + rankVal -1] = new Card((Suit) suitVal, (Rank) rankVal); Затем реализуется метод GetCard, который либо возвращает объект Card, соответствующий запрашиваемому индексу, либо генерирует исключение, как уже показывалось ранее: public Card GetCard(int cardNum) { if (cardNum > = 0 && cardNum <= 51) return cards [cardNum]; else throw (new System.ArgumentOutOfRangeException ( cardNum , cardNum, Value must be between 0 and 51. )) ; И, наконец, последним реализуется метод Shuffle. Этот метод делает следующее: создает временный массив карт и произвольным образом копирует в него карты из существующего массива cards. Основным телом в нем является цикл, выполняющий итерации от О до 51. На каждой итерации этого цикла генерируется произвольное число от О до 51 с помощью экземпляра класса System.Random из .NET Framework. После создания экземпляра объект этого класса генерирует случайное число от О до X с применением метода Next (X). Когда число готово, оно просто используется в качестве индекса того объекта Card во временном массиве, в который должна быть скопирована карта из массива cards. Для фиксирования информации об уже присвоенных картах создается массив переменных bool, которым по мере копирования карт присваивается значение true. Во время генерации случайных чисел осуществляется сверка с этим массивом для выяснения того, не была ли уже скопирована какая-то карта в место во временном массиве, на которое указывает сгенерированное случайное число. Если была, тогда просто генерируется очередное случайное число. Такой подход нельзя назвать самым эффективным, поскольку до обнаружения свободного места для копирования карты может быть сгенерировано немало случайных чисел. Однако он работает, является очень простым и позволяет коду С# выполняться настолько быстро, что заметить задержку вряд ли удастся. Выглядит код метода Shuffle следующим образом: public void Shuffle О \ Card[] newDeck = new Card [52] ; bool[] assigned = new bool [52] ; Random sourceGen = new Random () ; for (int i = 0; i < 52; i++) { int destCard = 0; bool foundCard = false; while (foundCard = false) destCard = sourceGen.Next(52); if (assigned[destCard] == false) foundCard = true; assigned[destCard] = true; newDeck[destCard] = cards[i]; newDeck.CopyTo(cards, 0) ; В последней строке в коде этого метода используется метод СоруТо класса System. Array (применяемого всякий раз, когда создается массив) для копирования каждой карты из newDeck в cards. Это означает, что вместо создания новых экземпляров используется один и тот же набор объектов Card из одного и того же объекта cards. В случае применения вместо этого cards = newDeck экземпляр объекта, на который ссылается cards, должен был бы заменяться другим, что обязательно приводило бы к появлению проблем при наличии еще где-нибудь в коде ссылки на исходный экземпляр cards, который бы так и оставался не перетасованным. На этом создание кода библиотеки классов завершено.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |