Основа для карточной игры в C#
Цель этого примера - предоставить некоторую поддержку для создания карточной игры. В нем показано, как сделать класс для представления карт и рассказать, какая карта отображается в PictureBox. На самом деле это относительно просто.
Следующий код показывает класс Card.
public class Card { public int Rank, Suit; public Bitmap Picture; public Card(int rank, int suit, Bitmap picture) { Rank = rank; Suit = suit; Picture = picture; } }
Класс сначала определяет свойства Rank и Suit. В этом примере я сделал их числовыми. Ранг будет находиться между 0 (Ace) и 12 (King).
Костюм будет 0 и 4 и будет представлять сердца, бриллианты, клубы, лопаты и другие. Иски в этом порядке, потому что это порядок, в котором они отображаются в файлах изображений .png. Вы можете изменить их, если хотите.
В последнем значении Suit хранятся обратные карточки и другие разные изображения, которые могут использоваться карточной игрой. Изображение cards.png не включает джокеров, но это то место, куда вы могли бы поместить их, если хотите.
В следующем коде показаны переменные, которые программа использует для хранения информации о карте.
// Базовая информация о колоде. // Пятый сюиту для спины, шутников и т. д. private const int NumSuits = 5; private const int NumRanks = 13; private int CardWidth, CardHeight; // Иски в их порядке в файле. private enum Suits { Hearts, Diamonds, Clubs, Spades, Misc, } //pictureBoxes, хранящие изображения карт. private PictureBox[,] Pics = null;
Значения NumSuits и NumRanks содержат номера костюмов и рангов. Поля CardWidth и CardHeight будут позднее содержать размеры изображений карт.
Перечисление Suits облегчает привязку индексов к костюмам.
В массиве Pics будут храниться элементы управления PictureBox, удерживающие карты.
Когда программа запускается, следующий обработчик события Load загружает данные карты.
// Загрузите карты. private void Form1_Load(object sender, EventArgs e) { // Загрузите изображения с карты. LoadCardImages(); // Расположите карту PictureBoxes. ArrangeCards(); }
Этот код просто вызывает методы LoadCardImages и ArrangeCards. Следующий код показывает LoadCardImages.
// Загрузите карту PictureBoxes. private void LoadCardImages() { CardWidth = Properties.Resources.cards.Width / NumRanks; CardHeight = Properties.Resources.cards.Height / NumSuits; int x0 = 0; int y0 = 0; int dx = CardWidth; int dy = CardHeight; Pics = new PictureBox[NumRanks, NumSuits]; int y = y0; for (int suit = 0; suit < NumSuits; suit++) { int x = x0; for (int rank = 0; rank < NumRanks; rank++) { Pics[rank, suit] = LoadCard(rank, suit, x, y); x += dx; } y += dy; } }
В ресурсе Properties.Resources.cards хранится изображение всех карт. Этот метод использует его для получения ширины и высоты карт. Затем он выделяет массив Pics и проецирует изображение, чтобы получить изображения отдельных карт.
Когда он перемещается по строкам и столбцам карточных изображений, код отслеживает свое положение на основном изображении и вызывает метод LoadCard для загрузки каждой из карт.
В следующем коде показан способ LoadCard.
// Загрузите одну карту из колоды. private PictureBox LoadCard(int rank, int suit, int x, int y) { // Получить изображение. PictureBox pic = new PictureBox(); Bitmap bm = LoadCardImage(rank, suit, x, y); // Создаем PictureBox. pic.Image = bm; pic.SizeMode = PictureBoxSizeMode.AutoSize; pic.BorderStyle = BorderStyle.Fixed3D; pic.Parent = panCards; pic.MouseEnter += pic_MouseEnter; pic.MouseLeave += pic_MouseLeave; // Дайте PictureBox объекту Card так, чтобы // мы можем сказать, что это за карта. pic.Tag = new Card(rank, suit, bm); return pic; }
Этот метод создает новый PictureBox для хранения карты. В зависимости от того, что будет делать ваша карточная игра, вы можете не создавать PictureBox для каждой карты. Например, вы можете просто создать объекты Card для представления карт. Затем вы можете отобразить их в PictureBoxes позже. Этот пример просто загружает изображения и отображает их в отдельных элементах PictureBox, так что это вовсе не карточная игра.
После создания PictureBox метод вызывает LoadCardImage, чтобы загрузить изображение для карты. Затем он устанавливает различные свойства PictureBox, включая его Изображение, SizeMode и BorderStyle. Он устанавливает Parent в элемент управления Panel с именем panCards. Этот элемент управления имеет AutoScroll = True, поэтому он отображает полосы прокрутки, если элементы управления PictureBox внутри него не подходят в его видимой области.
Наконец, метод устанавливает свойство PictureBox элемента управления Tag, равное объекту Card, который содержит информацию о карте. Позже программа может использовать объект Tag, чтобы увидеть, какую карту представляет PictureBox.
В следующем коде показан способ LoadCardImage.
// Вернуть изображение для карты. private Bitmap LoadCardImage(int rank, int suit, int x, int y) { Bitmap bm = new Bitmap(CardWidth, CardHeight); using (Graphics gr = Graphics.FromImage(bm)) { Rectangle dest_rect = new Rectangle(0, 0, CardWidth, CardHeight); Rectangle src_rect = new Rectangle(x, y, CardWidth, CardHeight); gr.DrawImage(Properties.Resources.cards, dest_rect, src_rect, GraphicsUnit.Pixel); } return bm; }
Этот метод создает Bitmap, чтобы удерживать изображение карты и создает связанный объект Graphics. Затем он создает прямоугольник, который заполняет новое растровое изображение.
Он также создает прямоугольники, которые идентифицируют место, где изображение должно быть скопировано из большого растрового изображения, содержащего все изображения карт. Наконец, код копирует изображение карты из большого растрового изображения в новое растровое изображение и возвращает его.
В следующем коде показан способ ArrangeCards.
// Расположите карту PictureBoxes. private void ArrangeCards() { // Отображение колоды. const int margin = 4; int y = margin; for (int suit = 0; suit < NumSuits; suit++) { int x = margin; for (int rank = 0; rank < NumRanks; rank++) { Pics[rank, suit].Location = new Point(x, y); x += Pics[0, 0].Width + margin; } y += Pics[0, 0].Height + margin; } }
Этот метод просто проходит через элементы управления PictureBox в массиве Pics и позиционирует элементы управления в строках и столбцах внутри Panel.. р>
В заключительные части программы входят следующие обработчики событий, которые выполняются, когда мышь входит или выходит из PictureBox.
// Отображение информации о карте. private void pic_MouseEnter(object sender, EventArgs e) { // Получаем информацию о карте. PictureBox pic = sender as PictureBox; Card card = pic.Tag as Card; Suits suit = (Suits)card.Suit; int rank = card.Rank + 1; Text = rank.ToString() + " of " + suit.ToString(); } // Очистите информацию cardf. private void pic_MouseLeave(object sender, EventArgs e) { Text = "howto_playing_cards"; }
// Отображение информации о карте. private void pic_MouseEnter (отправитель объекта, EventArgs e) { // Получаем информацию о карте. PictureBox pic = отправитель как PictureBox; Карта карты = pic.Tag as Card; Костюм костюма = (Костюмы) card.Suit; int rank = card.Rank + 1; Текст = rank.ToString () + "of" + suit.ToString (); } // Очистите информацию cardf. private void pic_MouseLeave (отправитель объекта, EventArgs e) { Текст = "howto_playing_cards"; }
...
Свойство pic_MouseLeave просто сбрасывает строку заголовка формы, поэтому оно отображает имя программы, а не любую карту, с которой последняя передала мышь.