Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Ватсон К. -> "С#" -> 119

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 113 114 115 116 117 118 < 119 > 120 121 122 123 124 125 .. 404 >> Следующая


П если useTrumps имеет значение true, public static Suit trump 3 Suit.Club;

// Маркер, который определяет, являются ли тузы старке королей

II или младле двоек.

public static bool isAceHigh ^ true;

После этого имеет смысл добавить в класс Deck несколько дополнительных конструкторов, которые позволят инициализировать колоды карт с разными характеристиками:

public Deck()

{

for (int suitVal = 0; suitVal < 4; suitVal++)

(

for {int rankVal = 1; rankVal < 14; rankVal + +) t

cards.Add(new Card((Suit)suitVal, (Rank)rankVal));

}

)

)

II Конструктор не по умолчании. Позволяет устанавливать наивысиее Н старшинство тузов, public DecMbool isAceHigh) : this О (

Card.isAceHigh 3 isAceHigh;

>

It Конструктор не no умолчанию. Позволяет использовать козырнув масть, public Deck(bool useTrumps, Suit trump) : this!)

{

Card. useTruraps = useTrumps;

Card, trump = trump)

)

Дополнительные сведения о классах

251

public static bool operator >¦= (Card cardl, Card cardS)

<

if (cardl.euit =» card2.suit)

{

if (iaAceHigh)

return (cardl.rank >= card2.rank) Л {cards.rank « Rank.Ace) j else

return (car<51 .rank >» card2. rank) j

)

else

(

1C (иввТгищра && tcard2.euit == Card.trump}) return false; else

return true i

)

)

public static bool operator «“(Card cardl, Card card2)

(

return Кcardl > cards);

По этому коду у нас нет особых замечаний, за исключением, пожалуй, несколько усложненного способа использования логического оператора XOR {"). Он применяется, например, при перегрузке оператора >. Если мы шаг за шагом пройдем этот код, то сможем понять, каким образом он работает и почему в данном случае необходим именно он.

Мы производим сравнение двух карт — cardi и card2, примем предполагается, что карта cardl была сыграна первой. Как уже обсуждалось ранее, это важно в том случае, если мы используем козырные карты, поскольку козырная карта бьет некозырную, даже когда последняя старше. Естественно, если обе карты оказываются одной масти, то уже не имеет значения, является ли данная масть козырной или нет, поэтому именно эта проверка осуществляется в первую очередь:

public static bool operator >(Card cardl. Card card2) f

if (cardl.euit == card2.suic)

I

Если статический маркер isAceHigh имеет значение true, то в этом случае мы лишены возможности сравнивать старшинство карт непосредственно по их значению в перечислимом типе Rank, поскольку старшинство туза в этом типе равно 1 (т, е. ниже, чем старшинство всех остальных карт). Именно здесь мы можем очень эффективно использовать оператор". Мы выполняем два сравнения: одно по старшинству и одао на предмет того, не является лн карта тузом. Результаты сравнений могут быть следующими:

? Если карта cardi старше, чем card2, и карта card2 не является тузом,

TO cardl старше, чем card2.

? Если карта cardi старше, чем card2, и карта card2 является тузом, то card2 старше, чем cardl.

? Если карта cardi младше card2 и не является тузом, то card2 старше, чем cardl.

? Еслн карта cardi младше card2 и является тузом, то cardl старше, чем cardi.
252

Глава 11

cardi> card] card2.rank ¦- Xank.Aca cardi старше, чем carda?
true false true
true true false
false false false
false true true

В данном случае логика оказывается идентичной, поэтому использование этого оператора позволяет получить требуемый результат:

if (isAceHigh)

return (cardi,rank > card2.rank)

(card2.rank == Rank.Ace);

Все вышесказанное можно представить в виде таблицы, расположенной слева.

Напоминаем вам, что оператор хон работает аналогично тому, как представлеино в следующей таблице.

Однако в том случае, если isAceHigh имеет значение false, мы вполне можем положиться на старшинство карты, что позволяет упростить выполнение операции:

else

return (cardi.rank > card2.rank);

opl op2 opl л op2
true false true
true true false
false false false
false true true

Остальная часть кода относится к тому случаю, когда карты cardi н card2 имеют разные масти. При этом оказывается важным статический маркер useTrumps. Если он имеет значение true и карта card2 — козырной масти, то мы можем совершенно определенно утверждать, что карта cardi не является козырней (так как эти карты разных мастей), а поскольку козыри всегда старше, то карта card2 оказывается более старшей:

else

(

if (useTrumps ?& (cards.suit return false;

Card.trump))

Если карта card2 не является козырной (т. е. маркер useTrumpa имеет значение false), то в этом случае более старшей оказывается карта cardi, поскольку именно она была сыграна первой:

else

return true;

Еще один оператор (> = ) использует аналогичный код, а все остальное совсем просто, поэтому мы не будем вдаваться в подробности.

Следующий простой клиентский код тестирует эти операторы (для этого код следует поместить в функцию Main о клиентского проекта точно так же, как мы поступали с клиентским кодом в предыдущих примерах с использованием CardLib):
Предыдущая << 1 .. 113 114 115 116 117 118 < 119 > 120 121 122 123 124 125 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.