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

Итог занятия

На этом занятии мы:

  • закончили реализацию игры"Пасьянс-Косынка" для второго уровня сложности;

  • начали реализацию игры"Пасьянс-Косынка" для третьего уровня сложности;

  • выполнили раздачу карт в нижние стопки;

  • создали перерисовку всех стопок игрового поля.

Занятие 9. "Разработка игры Пасьянс-Косынка. Третий уровень сложности"

На этом занятии мы выполним реализацию третьего уровня сложности игры Пасьянс-Косынка: - закончим разработку игры; - запустим и проверим работу игры в действии.

На этом занятии завершим создание игры и запустим ее

окончательный вариант. Продолжим доработку классаgame.

После того как пользователь будет нажимать левую клавишу мыши необходимо определить на какую карту нажал пользователь. Если курсор мыши в этот момент действительно был над картой, то мы должны отметить эту карту как выбранную.Выбранную карту или группу карту пользователь сможет переносить мышью.Переносить карты пользователь может из любой стопки, кроме верхней левой (с номером 0). Если речь идет о верхних стопках, то пользователь может переносить только верхнюю карту. Для нижних стопок пользователь может переносить группу карт.Для установки выбранной карты добавим новый метод к классу game:

// Установка выбранной карты

private void setVibrana(int nom, int mX, int mY)

{

// Если верхние стопки (1,2,3,4,5)

if ((nom>=1) && (nom<=5))

{

// Если в стопке есть карты

if (stopki[nom].size()>0)

{

// Получаем номер верхней карты

int nomPosled = stopki[nom].size()-1;

//Получаем верхнюю карту

karta getKarta = stopki[nom].get(nomPosled);

// Устанавливаем признак выбранной карты

getKarta.vibrana = true;

// Номер выбранной карты

nomKarti = nomPosled;

// Номер выбранной стопки

nomStopki = nom;

// Смещения курсора мыши

dx = mX - getKarta.x;

dy = mY - getKarta.y;

//Запоминаем текущие координаты карты

oldX = getKarta.x;

oldY = getKarta.y;

}

}

// Если нижние семь стопок

else if ((nom>=6) && (nom<=12))

{

// Если в стопке есть карты

if (stopki[nom].size()>0)

{

// Получаем номер верхней карты

int nomPosled = stopki[nom].size()-1;

// Получаем верхнюю карту

karta getKarta = stopki[nom].get(nomPosled);

int nomVibrana = -1;

// Если выбрана самая верхняя карта

if ((mY>=getKarta.y)&&(mY<=(getKarta.y+97)))

{

nomVibrana = nomPosled;

}

// Если выбрана НЕ самая верхняя карта

else if (mY<getKarta.y)

{

// Вычисляем номер выбранной карты

nomVibrana = (mY-130)/20;

if (stopki[nom].get(nomVibrana).tipRubashka==true)

{

nomVibrana = -1;

}

}

// Если карта выбрана

if (nomVibrana!=-1)

{

// Получаем выбранную карту

karta getKartaVibrana = stopki[nom].get(nomVibrana);

// Если карта открыта рубашкой

if (getKartaVibrana.tipRubashka==false)

{

//Устанавливаем признак выбранной

getKartaVibrana.vibrana = true;

// Номер выбранной карты

nomKarti = nomVibrana;

//Номер выбранной стопки

nomStopki = nom;

//Смещения курсора мыши

dx = mX - getKartaVibrana.x;

dy = mY - getKartaVibrana.y;

//Запоминаем текущие координаты карты

oldX = getKartaVibrana.x;

oldY = getKartaVibrana.y;

}

}

}

}

}

Методу setVibrana()будут передаваться номер выбранной стопки и координаты мыши на момент нажатия на левую клавишу. Если выбрана одна из верхних стопок, то при наличии карт в стопке,получаем самую верхнюю. Устанавливаем для нее признак выбранной, запоминаем ее координаты на момент выбора, запоминаем смещения курсора мыши. Если же выбрана одна из нижних стопок, то выясняем: выбрана самая верхняя карта или карта внутри стопки. Если выбрана карта внутри стопки,то вычисляем ее номер.

А дальше делаем те же установки, что и для верхних стопок.

Теперь перейдем к методуmousePressed() и добавим к нему строки:

// При одиночном нажатии левой кнопки мыши

public void mousePressed(int mX, int mY)

{

//Определяем номер стопки

int nom = getNomKolodaPress(mX, mY);

//Устанавливаем выбранную карту

setVibrana(nom, mX, mY);

}

При нажатии левой кнопки мыши определяется номер выбранной стопки.

После этого вызывается метод установки выбранной карты, который мы создали на предыдущем шаге. Если сейчас запустить проект, то мы сможем увидеть, что мышью можно выполнить захват карт и переносить их по игровому полю (см. рис. 1). Это происходит потому, что мы запрограммировали методы при нажатии на левую кнопку мыши и перенос в режиме захвата. Но мы еще не запрограммировали метод при отпускании левой кнопки мыши после переноса. Поэтому после отпускания кнопки мыши карта будет оставаться на месте, и не будет возвращаться назад или добавляться к новой стопке.

Рис. 1

Далее реализуем метод -при двойном щелчке левой клавишей мышиmouseDoublePressed(). При двойном щелчке по карте она должна перемещаться в домашнюю стопку, если это возможно. Перебираем четыре домашние стопки и смотрим верхнюю карту, если находим подходящую домашнюю стопку, то перемещаем туда карту. Карту можно перенести в пустую домашнюю стопку, если это туз. Если домашняя стопка не пустая, то в нее можно перенести карту той же масти. Если в домашней стопке, сверху, находится туз, то на него можно положить двойку. Если сверху домашней стопки находится любая карта, кроме туза, то на нее можно положить следующую карту по возрастанию. В программном коде эта схема выглядит так:

// При двойном щелчке левой клавишей мыши

public void mouseDoublePressed(int mX, int mY)

{

//Определяем номер стопки

int nom = getNomKolodaPress(mX, mY);

// Если это нижняя стопка или с номером 1

if ((nom==1) || ((nom>=6)&&(nom<=12)))

{

// Если в стопке есть карты

if (stopki[nom].size()>0)

{

// Номер верхней карты

int nomPosled = stopki[nom].size()-1;

// Получаем верхнюю карту

karta getKarta = stopki[nom].get(nomPosled);

if ((mY>=getKarta.y)&&(mY<=(getKarta.y+97)))

{

// Перебираем четыре домашние стопки

for (int i=2;i<=5;i++)

{

// Результат поиска подходящей

// домашней стопки

int rez = -1;

// Если домашняя стопка пустая

if (stopki[i].size()==0)

{

// Если переносимая карта -туз

if (getKarta.tipKarta==12)

{

//Запоминаем номер домашней стопки

rez = i;

}

}

// Если домашняя стопка уже не пустая

else

{

// Получаем номер последней карты в

// домашней стопке

int nomPosled2 = stopki[i].size()-1;

// Получаем саму карту

karta getKarta2 = stopki[i].get(nomPosled2);

// Если эта карта в домашней стопке - туз, а //переносим двойку и их масти совпадают

if ((getKarta2.tipKarta==12)&&

(getKarta.mast==getKarta2.mast)&&

(getKarta.tipKarta==0))

{

// Запоминаем номер домашней стопки

rez = i;

}

// Если эта карта в домашней стопке НЕ туз,

// а их масти совпадают

else if ((getKarta2.tipKarta>=0)&&

(getKarta2.tipKarta<11)&&

(getKarta.mast==getKarta2.mast))

{

// Если переносимая карта на один уровень старше

if ((getKarta2.tipKarta+1==getKarta.tipKarta))

{

// Запоминаем номер домашней стопки

rez = i;

}

}

}

// Если удалось найти подходящую домашнюю стопку

if (rez>=0)

{

// Изменяем координаты на домашнюю стопку

getKarta.x = (110*(rez+1))+30;

getKarta.y = 15;

// Добавляем в домашнюю стопку

stopki[rez].add(getKarta);

// Удаляем из старой стопки

stopki[nom].remove(nomPosled);

// Проверяем конец игры

testEndGame();

// Прерываем цикл

break;

}

}

}

}

}

//Открываем верхнюю карту

openKarta();

}

Если выполнить запуск проекта, то при двойном щелчке мышью по карте, она должна автоматически переноситься в домашнюю стопку, если это возможно.

Но стоит понимать, что наша игра еще не закончена! При проверке уже выполненных возможностей все остальное пока будет работать некорректно!

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