Класс kartaбудет представлять реализацию одной карты из колоды. Это значит, что класс должен содержать в себе свойства и методы, которыми обладает одна карта из колоды на игровом поле.
Рис. 20
Давайте подумаем,какими свойствами обладает карта из колоды (см. рис. 20). Во-первых, это ее координаты на игровом поле. Мы пишем двухмерную компьютерную игру. Поэтому положение каждого объекта игрового поля определяется двумя координатами: x,y. Во-вторых, это картинка, которая символизирует карту. В-третьих, тип расположения карты –картинкой вверх или рубашкой.В-четвертых, это картинка рубашки карты.В-пятых, это масть карты. В-шестых, это тип карты (король, туз и т.д.)
В-седьмых, это признак красной или черной масти. Для игры"Пасьянс-Косынка" важен цвет масти. И последнее, это признак выбранной карты–является ли она захваченной мышью пользователем.
Теперь подумаем, какими методами будет обладать карта. Методы характеризуются глаголами. Поэтому, нужно решить, что будет необходимо делать с картой на игровом поле. Во-первых,необходимо произвести загрузку изображений, связанных с картой. А также выполнить начальные действия. Это будет выполняться в конструкторе класса.Во-вторых, карту необходимо рисовать на игровом поле.
Перейдем на закладку к программному коду класса karta (см. рис. 21).
Рис. 21
Нам предстоит выполнять загрузку изображений, а также выводить изображения на игровое поле. Добавим в самом верху класса необходимые библиотеки для этих целей:
// Для работы с изображениями
import javax.imageio.*;
// Для работы с графикой
import java.awt.*;
// Для работы с файлами
import java.io.*;
Далее добавим свойства класса, а другими словами переменные класса, о которых мы говорили выше:
// Класс для карты из колоды
public class karta
{
// Координаты карты на игровом поле
public int x,y;
//Изображение карты
public Image img;
// Вид расположения рубашкой или картинкой
public boolean tipRubashka;
//Изображение рубашки карты
public Image rubashka;
// Масть карты
public int mast;
// Тип карты(король, туз и т.д.)
public int tipKarta;
// Признак захвата карты мышью
public boolean vibrana;
// Признак красной или черной масти
public boolean red_karta;
}
Все свойства будутpublic– открытые переменные класса. Рассмотрим переменные, которые заслуживают отдельного внимания.
// Вид расположения рубашкой или картинкой
public boolean tipRubashka;
При значении false, карта будет отображаться картинкой вверх, а при значении true –рубашкой вверх.
// Масть карты
public int mast;
Масть карты будем обозначать числом от 0 до 3. 0 –крести, 1 –пики, 2 –черви, 3 – буби.
// Тип карты (король, туз и т.д.)
public int tipKarta;
Тип карты будем обозначать числом от 0 до 12. 12 –Туз, 11 –Король, 10 –Дама, 9 – Валет и т.д.
// Признак захвата карты мышью
public boolean vibrana;
При захвате мышью,признак захвата будет true, иначе –false.
// Признак красной или черной масти
public boolean red_karta;
В случае красной масти,значение переменной будет –true, в случае черной масти, значение переменной будет –false.
Теперь, когда все свойства определены –приступим к методам. Начнем с конструктора класса. Под переменными–добавим конструктор класса:
// Конструктор класса
public karta(String path, Image rubashka, int nom)
{
// Признак захвата мышью -НЕ захвачена
vibrana = false;
// Изображение рубашки карты
this.rubashka = rubashka;
// Загрузка изображения карты из файла
try
{
img = ImageIO.read(new File(path));
}
catch (Exception ex) {}
//Начальная координата по X
x = 30;
//Начальная координата по Y
y = 15;
//Изначально карта расположена рубашкой
tipRubashka = true;
//Вычисляем масть карты
mast = (nom-1)%4;
//Вычисляем тип карты (король, туз и т.д.)
tipKarta = (nom-1)/4;
//Определяем цвет масти (красный или черный)
red_karta = true;
if (mast<=1) red_karta = false;
}
Конструктор принимает три параметра:
public karta(String path, Image rubashka, int nom)
{
path –это путь к файлу изображения карты, rubashka–это изображение рубашки карты, nom–это номер карты, в загружаемой колоде. Номер будет совпадать с номером в имени файла картинки (для k1.png –номер будет 1).
Рубашка для всех карт выглядит одинаково, поэтому рубашку для каждой карты по отдельности мы загружать не будем, а загрузим ее однократно и будет передавать в конструктор класса при создании объекта карты:
// Изображение рубашки карты
this.rubashka = rubashka;
Все карты изначально мы будем загружать в верхнюю левую стопку,поэтому начальные координаты всех карт будут:
//Начальная координата по X
x = 30;
//Начальная координата по Y
y = 15;
После загрузки все карты будут в верхней левой стопке, поэтому рубашкой вверх:
// Изначально карта расположена рубашкой
tipRubashka = true;
Все карты при начале игры являются не захваченными мышью:
// Признак захвата мышью- НЕ захвачена
vibrana = false;
Когда мы готовили файлы изображений, то сделали закономерность номеров загружаемых карт и типов карт(король, туз и т.д.). Используя эту закономерность, мы можем вычислить масть по номеру:
// Вычисляем масть карты
mast = (nom-1)%4;
Знак процент (%) –это остаток от деления. При делении на 4 любого числа остатки могут быть: 0, 1, 2, 3. 0–крести,1–пики, 2–черви, 3– буби.
Например, загружается карта из файла k1.png (см. рис.22). Карта имеет номер: 1, что видно из названия файла. Это карта –двойка крестей. Вычисляем масть по формуле: mast = (1-1)%4, получаем нулевое значение.
Рис. 22
Такая формула будет работать благодаря тому, что каждая масть повторяется через четыре номера. Другими словами для крестей номера следующие: 1, 5, 9, 13, и т.д.
Используя закономерность в номерах, вычисляем тип карты (король, туз и т.д.):
// Вычисляем тип карты(король, туз и т.д.)
tipKarta = (nom-1)/4;
При делении на четыре дробная часть будет отбрасываться. И в итоге мы будем получать значения: 0–двойка, 1–тройка, 2–четверка, 3–пятерка, 4- шестерка и т.д.
Это будет благодаря тому, что:
все двойки находятся в файлах: k1.png, k2.png, k3.png, k4.png;
все тройки находятся в файлах: k5.png, k6.png, k7.png, k8.png;
и т.д.
Кроме масти и типа карты определяем цвет масти:
// Определяем цвет масти(красный или черный)
red_karta = true;
if (mast<=1) red_karta = false;
0 и 1–это черная масть(крести, пики), а 2и 3 –это красная масть (черви, буби).
Под конструктором класса расположим метод, отвечающий за отображение карты на игровом поле –это последний метод класса karta:
// Метод отображения (рисования карты)
public void draw(Graphics gr)
{
//Если карта расположена рубашкой
if (tipRubashka==false)
{
// Выводим изображение рубашки
gr.drawImage(img, x , y, 72, 97, null);
}
else // Иначе - если НЕ рубашкой
{
// Выводим изображение карты
gr.drawImage(rubashka, x , y, 72, 97, null);
}
//Если карта захвачена мышью
if (vibrana==true)
{
// Рисуем вокруг карты прямоугольник желтого цвета
gr.setColor(Color.YELLOW);
gr.drawRect(x, y, 72, 97);
}
}
Методу передается один параметр типа Graphics –это графический контекст:
public void draw(Graphics gr)
{
Ширина изображения каждой карты –72 пикселя, высота – 97 пикселей.
Если карта расположена рубашкой, то выводится изображение рубашки карты из файла k0.png, иначе изображение самой карты. Для выбранной карты (захваченной мышью) –вокруг карты рисуется прямоугольник желтого цвета.
На этом реализация класса karta является полностью законченной для всех уровней сложности. Больше к этому классу мы возвращаться не будем. Можно закрыть закладку karta.java (см.рис. 23).
Рис. 23
Полный программный код класса karta выглядит так:
// Для работы с изображениями
import javax.imageio.*;
// Для работы с графикой
import java.awt.*;
// Для работы с файлами
import java.io.*;
// Класс для карты из колоды
public class karta
{
// Координаты карты на игровом поле
public int x,y;
//Изображение карты
public Image img;
// Вид расположения рубашкой или картинкой
public boolean tipRubashka;
//Изображение рубашки карты
public Image rubashka;
// Масть карты
public int mast;
// Тип карты(король, туз и т.д.)
public int tipKarta;
// Признак захвата карты мышью
public boolean vibrana;
// Признак красной или черной масти
public boolean red_karta;
//Конструктор класса
public karta(String path, Image rubashka, int nom)
{
//Признак захвата мышью - НЕ захвачена
vibrana = false;
//Изображение рубашки карты
this.rubashka = rubashka;
//Загрузка изображения карты из файла
try
{
img = ImageIO.read(new File(path));
}
catch (Exception ex) {}
//Начальная координата по X
x = 30;
//Начальная координата по Y
y = 15;
//Изначально карта расположена рубашкой
tipRubashka = true;
//Вычисляем масть карты
mast = (nom-1)%4;
//Вычисляем тип карты (король, туз и т.д.)
tipKarta = (nom-1)/4;
//Определяем цвет масти (красный или черный)
red_karta = true;
if (mast<=1) red_karta = false;
}
// Метод отображения (рисования карты)
public void draw(Graphics gr)
{
//Если карта расположена рубашкой
if (tipRubashka==false)
{
// Выводим изображение рубашки
gr.drawImage(img, x , y, 72, 97, null);
}
else // Иначе - если НЕ рубашкой
{
// Выводим изображение карты
gr.drawImage(rubashka, x , y, 72, 97, null);
}
//Если карта захвачена мышью
if (vibrana==true)
{
// Рисуем вокруг карты прямоугольник желтого цвета