Читаем Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 8: Программирование на Visual C# искусственного интеллекта. Издание 2. Продолжение 1 полностью

В этом коде метод SetColorKey даёт начало и конец диапазона цветов, которые будут расценены как прозрачный. Для среды выполнения .NET Compact Framework эти два цвета должны иметь одно и то же значение, так как только один цвет может быть сделан прозрачным.

Целесообразно также после создания проекта в программе задать фон формы Form1 в свойстве BackColor темно-зелёного цвета (DarkGreen) из структуры Color.

Когда изображение карты нарисовало, метод DrawImage используется следующим образом:

private static Rectangle drawRect;

public void DrawHand(Graphics g, int startx, int starty,

int gapx, int gapy)

{

drawRect.X = startx;

drawRect.Y = starty;

foreach (Card card in this)

{

drawRect.Width = card.CardImage.Width;

drawRect.Height = card.CardImage.Height;

g.DrawImage(

card.CardImage,                  // Image

drawRect,                  // destination rectange

0,                                    // srcX

0,                                    // srcY

card.CardImage.Width, // srcWidth

card.CardImage.Height,      // srcHeight

GraphicsUnit.Pixel,            // srcUnit

Card.cardAttributes); // ImageAttributes

drawRect.X += gapx;

drawRect.Y += gapy;

}

}

Этот код рисует все карты на экране в случайно определённой позиции (при помощи генератора случайных чисел класса Random).

1.5. Класс Card для загрузки

карт в программу

В движке игры CardEngine.cs объект класса Card представляет каждую из карт в игре. Этот класс держит фактическое значение карты и рисует её на экране. Он также обеспечивает свойства, которые дают возможность пользователям класса найти координаты карты, получить название карты и другую полезную информацию. Класс Card может использоваться во многих других карточных играх, но есть некоторые особенности, которые характерны для игры в очко.

Первая версия класса Card выполняла загрузку всех изображений, когда приложение начинало выполняться. Каждая из 52 карт и фон игры загружались в самом начале игры. Это делало приложение замедленным. Способ ускорить процесс загрузки состоит в том, чтобы загружать изображения только по запросу при использовании следующего кода:

static private Image[] cardImages = new Bitmap[53];

public Image CardImage

{

get

{

int dispNo = CardNo;

if (!FaceUp)

{

dispNo = 0;

}

if (cardImages[dispNo] == null)

{

cardImages[dispNo] = new Bitmap(

execAssem.GetManifestResourceStream(

@"PocketJack.images." + dispNo + @".gif"));

}

return cardImages[dispNo];

}

}

Переменная cardImages – массив изображений карт. Первоначально все изображения карт в этом массиве пусты. В этом коде переменная dispNo является индексом массива и именем файла карты. Если данный элемент массива – пустой указатель (null), изображение загружается и затем может быть нарисовано. В следующий раз, когда потребуется изображение данной карты, оно будет найдено немедленно. В результате приложение начинает выполняться намного быстрее, чем если бы все карты были загружены в начале игры; время, потраченное, чтобы загрузить только небольшое количество карт, необходимых для игроков, будет небольшим. Если наши приложения нуждаются в большем количестве изображений карт, то это стоит выполнять постепенно по мере загрузки приложения, вместо того, чтобы выполнить это все сразу же в начале игры.

1.6. Класс CardHand для представления

карт в руках игрока

В движке игры CardEngine.cs мы нуждаемся в контейнерном классе CardHand (Рука игрока или банкомёта с картами), чтобы держать все карты. Законченная игра будет требовать двух объектов этого контейнера: один – для управляемого компьютером дилера и другой – для игрока. Класс CardHand, который мы собираемся использовать, держит множество карт. Это основано на коллекции ArrayList, которая облегчит для пользователей класса CardHand возможность добавлять и перечислять карты в руке. Эта коллекция также содержит метод, который будет рисовать карты в руке, как показано в следующем коде:

public void DrawHand(Graphics g, int startx, int starty,

int gapx, int gapy)

Этот метод, приведённый выше, рисует карты, начиная с определённой позиции на экране. Каждая последующая карта рисуется на определённом расстоянии от предыдущей.

Класс CardHand также содержит следующий метод, который вычисляет счёт набранным картам второго игрока blackjack (компьютера):

public int BlackJackScoreHand

{

int score = 0;

int aces = 0;

foreach (Card card in this)

{

score += card.BlackJackScore;

if (card.BlackJackScore == 11)

{

aces++;

}

}

while ((score > 21) && (aces > 0))

{

score -= 10;

aces–;

}

return score;

}

Метод работает для каждой карты в руке. Он следит за числом тузов (aces), и если пришел туз, то уменьшает счёт карт с учётом туза, чтобы гарантировать, что счёт – как можно ближе к 21, насколько это возможно без перебора.

1.7. Класс CardShoe для представления

карт в колоде случайным образом и тестирования игры

Перейти на страницу:

Похожие книги

ЕГЭ-2024. История. 16 тематических вариантов. ЕГЭ близко. 862-2020 гг
ЕГЭ-2024. История. 16 тематических вариантов. ЕГЭ близко. 862-2020 гг

Сборник соответствует 3 требованиям:Задания в сборнике тематические, т.е. соответствуют той или иной теме по хронологии. Выдержать это требование было очень сложно, но именно такие задания наиболее полезны для начинающих.Задания соответствуют формату ЕГЭ, насколько это возможно, учитывая п. 1. Например, в каждом варианте ЕГЭ должны быть задания про ВОВ. Но зачем выполнять их человеку, который только начал проходить Древнюю Русь? Поэтому мы заменили эти задания на те, которые соответствуют периоду, но тоже будут полезны для практики. Зато общая нагрузка при выполнении варианта будет сопоставима с тем, что будет на реальном экзамене, и ты сможешь реально оценивать свои силы.Задания примерно соответствуют ЕГЭ по уровню сложности. Конечно это понятие растяжимое, но мы постарались соблюсти баланс.В этом сборнике представлены 16 вариантов заданий по периодам с древности до наших дней.

Анатолий Анатольевич Сухарев , Виктория Александровна Юршина

Школьные учебники / Образование и наука
Все произведения школьной программы в кратком изложении. 9 класс
Все произведения школьной программы в кратком изложении. 9 класс

Помимо краткого содержания произведений (но вместе с тем достаточно подробного, чтобы ответить на любой вопрос), в книге содержатся конспекты критических статей, биографические сведения об авторах, анализ произведений и многое другое. Основной задачей авторов пособия было предоставить читателям то, что им может понадобиться при изучении литературы в школе. Поэтому в книгу вошли все произведения, составляющие школьную программу, а также те, которые изучаются факультативно («по выбору учащихся», «по выбору учителя»). Книга будет незаменимым помощником при повторении пройденного материала, а также при сдаче экзаменов.В конце пособия отдельным разделом помещены сведения по теории литературы, изучаемые в данном классе. В книгу также входят программные произведения зарубежных авторов, их биографические сведения и краткий очерк творчества.

Игорь Олегович Родин

Школьные учебники / Образование и наука