Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Java Модуль 4.docx
Скачиваний:
14
Добавлен:
01.07.2025
Размер:
20.72 Mб
Скачать

Реализация класса pole

Перейдем в класс pole в файл pole.java (см. рис. 16).

Рис. 16

Как и в предыдущих играх,в классе poleбудет реализовано игровое поле, и класс будет наследоваться от класса JPanel. В самом верху класса poleдобавим необходимые библиотеки и выполним наследование от класса JPanel:

// Для работы с событиями (мышь, таймер)

import java.awt.event.*;

// Для работы с окнами и кнопками

import javax.swing.*;

// Для работы с графикой

import java.awt.*;

// Для работы с картинками

import javax.imageio.*;

// Для работы с файлами

import java.io.*;

// Класс игрового поля наследуется от JPanel

public class pole extends JPanel { }

Все пять библиотек знакомы нам еще со времен создания игры"Новогодний дождь". В классе okno создается объект на основании класса poleи подключается к окну. Но до тех, пока мы не выполнили наследование класса pole от класса JPanel в строке подключения была ошибка (см. рис. 17).

Рис. 17

Теперь можно сохранить все изменения в проекте (см.рис. 18)и выполнить запуск.

Рис. 18

В результате мы увидим окно нужных размеров и с заголовком игры.

Теперь класс okno.javaявляется полностью законченным для всех уровней сложности. Больше к этому классу мы возвращаться не будем. Можно закрыть закладку okno.java (см. рис.19).

Рис. 19

Реализация класса karta

Класс 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 выглядит так:

// Для работы с изображениями

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]