Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП Лабораторный практикум.doc
Скачиваний:
45
Добавлен:
07.06.2015
Размер:
505.34 Кб
Скачать
  1. Лабораторная работа 4. Моделирование карточной игры на компьютере.

      1. Задание.

Написать программу, реализующую карточную игру на компьютере.

      1. Выполнение.

Правила игры.

В игре принимают участие 2 человека. Колода карт тасуется и раздается участникам поровну (по 18 карт). Далее, каждый участник берет карту сверху своей колоды и кладет перед собой на стол. Чья карта окажется старше, тот забирает обе карты и кладет их в конец своей колоды. Если карты равны, то участники достают еще по одной карте и кладут их поверх выбранных. Так продолжается до тех пор, пока чья-либо карта не окажется старше. В этом случае игрок забирает все карты, находящиеся на столе. Игра продолжается до тех пор, пока у какого-нибудь игрока не закончатся карты. Этот игрок считается проигравшим. Карты оцениваются только по достоинству, масть не имеет значения. Младшая карта - шестерка, старшая – туз. Картинки старше обычных карт. Однако есть одно исключение: шестерка бьет туза.

      1. Создание проекта.

Создайте на дискеDпапкуЛабКарты. Запустите Netbeans и создайте новый проект типаПриложение Java. Имя проекта укажитеCardGame; местоположение — созданная вами папкаЛабКарты. Имя главного класса укажитеCardGameMain.

      1. Создание формы.

Щелкните правой клавишей мыши на названии пакетаcardgameв окне проектов (слева вверху).В появившемся контекстном меню выберитеСоздать → Форма JFrame. В появившемся диалоговом окне в полеИмя классаукажитеDesktopFrame. Нажмите кнопкуЗавершить. Перед вами открывается конструктор экранных форм.

      1. Размещение элементов управления (эу) на форме.

Справа находится окно палитры ЭУ, которые можно размещать на форме. В центре находится сама форма (серый прямоугольник).

Из палитры перетащите мышью ЭУНадпись(JLabel) и разместите ее в левом верхнем углу формы. Расположите строку меню, 4 надписи для колод карт, две кнопки, две надписи «Игрок №1», «Игрок №2» и ещё две надписи для отображения количества карт в колодах игроков как показано на рис. 4. ЭУНадписьдля колод карт на самом деле будет отображать изображение карты. Поэтому каждая такая надпись сделана с размером, совпадающим с размером изображений карт (файлы есть на диске). Рамка сделана для того, чтобы их можно было видеть на форме в конструкторе.

Измените имена переменных для ЭУ как показано на рис. 5. ( имена указаны синим цветом).

Добавьте два пункта меню: «Новая игра», «Выход».

Рисунок 4: Изображение ЭУ на форме

Рисунок 5: Имена переменных

На пункте меню «Выход» нажмите правой клавишей мыши и в контекстном меню выберите События->Action->ActionPerformedи в появившемся методе добавьте вызов метода закрытия формы:

dispose();

В исходном тексте найдите конструктор класса DesktopFrame и в конце добавьте

setResizable(false);

Скопируйте содержимое метода mainклассаDesktopFrameв методmainклассаCardGameMain.

Запустите проект и убедитесь, что все работает.

      1. Создание класса карты.

Для выполнения данной работы нам необходимо создать несколько классов, описывающих объекты реального мира: карта и колода карт.

Начнем с карты. Карта имеет масть и достоинство. Карта может лежать рубашкой вверх (не видима) или картинкой вверх (видима). С картой ассоциируется изображение (файл *.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();

}