- •Объектно-ориентированное программирование
- •Шаг 4. Настройка надписи.
- •Шаг 5. Настройка кнопок.
- •Шаг 6. Запуск приложения.
- •Шаг 7. Обработка событий цифровых кнопок.
- •Шаг 8. Обработка арифметических операций.
- •Шаг 9. Обработка нажатий на остальные кнопки.
- •Лабораторная работа 2. Создание классов. Конструкторы.
- •Лабораторная работа 3. Создание классов. Наследование и агрегация.
- •Лабораторная работа 4. Моделирование карточной игры на компьютере.
- •Задание.
- •Выполнение.
- •Создание проекта.
- •Создание формы.
- •Размещение элементов управления (эу) на форме.
- •Создание класса карты.
- •Класс Deck.
- •Класс Game
- •Привязка к пользовательскому интерфейсу
- •Лабораторная работа 5. Лабораторная работа Создание игры «Тетрис».
- •Создание панели для отображения действий игры.
- •Лабораторная работа 6. Списки и динамические массивы
Лабораторная работа 4. Моделирование карточной игры на компьютере.
Задание.
Написать программу, реализующую карточную игру на компьютере.
Выполнение.
Правила игры.
В игре принимают участие 2 человека. Колода карт тасуется и раздается участникам поровну (по 18 карт). Далее, каждый участник берет карту сверху своей колоды и кладет перед собой на стол. Чья карта окажется старше, тот забирает обе карты и кладет их в конец своей колоды. Если карты равны, то участники достают еще по одной карте и кладут их поверх выбранных. Так продолжается до тех пор, пока чья-либо карта не окажется старше. В этом случае игрок забирает все карты, находящиеся на столе. Игра продолжается до тех пор, пока у какого-нибудь игрока не закончатся карты. Этот игрок считается проигравшим. Карты оцениваются только по достоинству, масть не имеет значения. Младшая карта - шестерка, старшая – туз. Картинки старше обычных карт. Однако есть одно исключение: шестерка бьет туза.
Создание проекта.
Создайте на дискеDпапкуЛабКарты. Запустите Netbeans и создайте новый проект типаПриложение Java. Имя проекта укажитеCardGame; местоположение — созданная вами папкаЛабКарты. Имя главного класса укажитеCardGameMain.
Создание формы.
Щелкните правой клавишей мыши на названии пакетаcardgameв окне проектов (слева вверху).В появившемся контекстном меню выберитеСоздать → Форма JFrame. В появившемся диалоговом окне в полеИмя классаукажитеDesktopFrame. Нажмите кнопкуЗавершить. Перед вами открывается конструктор экранных форм.
Размещение элементов управления (эу) на форме.
Справа находится окно палитры ЭУ, которые можно размещать на форме. В центре находится сама форма (серый прямоугольник).
Из палитры перетащите мышью ЭУНадпись(JLabel) и разместите ее в левом верхнем углу формы. Расположите строку меню, 4 надписи для колод карт, две кнопки, две надписи «Игрок №1», «Игрок №2» и ещё две надписи для отображения количества карт в колодах игроков как показано на рис. 4. ЭУНадписьдля колод карт на самом деле будет отображать изображение карты. Поэтому каждая такая надпись сделана с размером, совпадающим с размером изображений карт (файлы есть на диске). Рамка сделана для того, чтобы их можно было видеть на форме в конструкторе.
Измените имена переменных для ЭУ как показано на рис. 5. ( имена указаны синим цветом).
Добавьте два пункта меню: «Новая игра», «Выход».
Рисунок 4:
Изображение ЭУ на форме
Рисунок
5: Имена переменных
На пункте меню «Выход» нажмите правой клавишей мыши и в контекстном меню выберите События->Action->ActionPerformedи в появившемся методе добавьте вызов метода закрытия формы:
dispose();
В исходном тексте найдите конструктор класса DesktopFrame и в конце добавьте
setResizable(false);
Скопируйте содержимое метода mainклассаDesktopFrameв методmainклассаCardGameMain.
Запустите проект и убедитесь, что все работает.
Создание класса карты.
Для выполнения данной работы нам необходимо создать несколько классов, описывающих объекты реального мира: карта и колода карт.
Начнем с карты. Карта имеет масть и достоинство. Карта может лежать рубашкой вверх (не видима) или картинкой вверх (видима). С картой ассоциируется изображение (файл *.png), для отображения карты на форме.
Создайте в папке с проектом новую папку с именем «img» и скопируйте в нее содержимое папки “img” преподавателя.
Щелкните правой клавишей мыши на названии пакета cardgameв окне проектов (слева вверху).В появившемся контекстном меню выберитеСоздать → Класс Java... Укажите имя классаBadCardException. Сделайте у него следующее содержимое:
public class BadCardException extends Exception {
public BadCardException() {
super();
}
public BadCardException(String msg) {
super(msg);
}
}
Щелкните правой клавишей мыши на названии пакетаcardgameв окне проектов (слева вверху).В появившемся контекстном меню выберитеСоздать → Класс Java... Укажите имя классаCard. Добавьте в него следующее содержимое:
//введем перечислимые типы для масти и достоинства
public static enum TMast { Diamonds, Harts, Spades, Clubs};
//обратите внимание: перечисление в Java это класс и мы можем
//добавлять в него дополнительные переменные и конструкотры
public static enum TRang {
Six(6), Seven(7), Eight(8), Nine(9), Ten(10), Jack(11), Queen(12), King(13), Ace(14);
//переменная для сравнения карт, чем она больше, тем
//карта старше
private int weight;
public int getWeight() { return weight;}
//конструктор
TRang(int pw){ weight = pw;}
};
////////////////////////////////////////////////////
// переменные уровня класса
///////////////////////////////////////////////////
//масть и достоинство нашей карты
private TMast mast;
private TRang rang;
//рубашкой вверх или вниз
private boolean isVisible;
//номер изображения в массиве изображений (см ниже)
private int indCardPicArray;
//массив с названиями файлов-картинок для карт
//обратите внимание: имя файла состоит
// из достоинства (как в перечислении)
// и масти (тоже как в перечислении)
public static String[] cardPicArray = {
"./img/Six_Diamonds.png",
"./img/Seven_Diamonds.png",
"./img/Eight_Diamonds.png",
"./img/Nine_Diamonds.png",
"./img/Ten_Diamonds.png",
"./img/Jack_Diamonds.png",
"./img/Queen_Diamonds.png",
"./img/King_Diamonds.png",
"./img/Ace_Diamonds.png",
"./img/Six_Harts.png",
"./img/Seven_Harts.png",
"./img/Eight_Harts.png",
"./img/Nine_Harts.png",
"./img/Ten_Harts.png",
"./img/Jack_Harts.png",
"./img/Queen_Harts.png",
"./img/King_Harts.png",
"./img/Ace_Harts.png",
"./img/Six_Spades.png",
"./img/Seven_Spades.png",
"./img/Eight_Spades.png",
"./img/Nine_Spades.png",
"./img/Ten_Spades.png",
"./img/Jack_Spades.png",
"./img/Queen_Spades.png",
"./img/King_Spades.png",
"./img/Ace_Spades.png",
"./img/Six_Clubs.png",
"./img/Seven_Clubs.png",
"./img/Eight_Clubs.png",
"./img/Nine_Clubs.png",
"./img/Ten_Clubs.png",
"./img/Jack_Clubs.png",
"./img/Queen_Clubs.png",
"./img/King_Clubs.png",
"./img/Ace_Clubs.png",
"./img/rubawka.png", //рубашка
"./img/null.png" //пустое место
};
//для удобства добавим две константы:
//индекс имени файла изображения рубашки
public static final int RUBAWKA = 36;
//индекс имени файла изображения пустого места
public static final int NULL = 37;
///////////////////////////////////////////////////////
// методы
//////////////////////////////////////////////////
//конструктор
public Card(TMast pm, TRang pr) throws BadCardException{
mast = pm;
rang = pr;
isVisible = false;
//метод getIndCardPicArray() описан ниже
indCardPicArray = getIndCardPicArray(pm, pr);
//если для карты нет изображения, вызываем исключение
if(indCardPicArray == -1) throw new BadCardException("Карта не существует!");
}
//возвращает значение свойства видимости
public boolean isIsVisible() {return isVisible;}
}
//устанавливает новое значение свойства видимости
public void setIsVisible(boolean isVisible) {
this.isVisible = isVisible;
}
//возвращает масть карты
public TMast getMast() {
return mast;
}
//возвращает достоинство карты
public TRang getRang() {
return rang;
}
//возвращает имя файла-картинки карты
//если карта не видима, то файла рубашки
public String getCardPic()
{
if(isVisible)
return cardPicArray[indCardPicArray];
else
return cardPicArray[Card.RUBAWKA]; //рубашка
}
//метод, который по масти и достоинству карты
//возвращает индекс имени файла-картинки
//из массива cardPicArray
private int getIndCardPicArray(TMast pm, TRang pr){
//написать самим:
//по масти и достоинству формируем строку
//с именем файла-картинки;
//ищем эту строку в массиве cardPicArray
//если нашли, возвращаем найденный индекс
//если нет, возвращаем -1.
}
//сравнивает карту с другой картой по масти и достоинству
public boolean equals(Card pCard){
if(pCard.rang == rang && pCard.mast == mast)
return true;
else
return false;
}
//сравнивает карту с другой картой только по достоинству
//т.к. в нашей игре масти не учитываются
public boolean equalsInGame(Card pCard){
if(pCard.rang == rang)
return true;
else
return false;
}
//метод определяет, какая карта старше, а значит бьет другую
public boolean isMoreInGame(Card pCard){
//написать самим, но учитывать, что:
//сравнить величину карты можно через rang.getWeight()
//для этого мы и ввели переменную в перечисление Trang,
//чтобы иметь числовую характеристику достоинства карты
//не забудьте: 6 бьет туза
}
//отображает карту в указанном в параметре ЭУ на форме
public void show(JLabel lb){
lb.setIcon(new ImageIcon(getCardPic()));
lb.invalidate();
}