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

Vidacha();

}

}

При отпускании левой кнопки мыши определяем номер стопки,которая выбрана. Если это верхняя левая стопка, то производим выдачу карты в стопку, которая находится правее.

Осталось реализовать метод выдачи карт из верхней левой стопки.Рассмотрим схему действий. Если происходит первая выдача карт из стопки с номером0, то выбираем случайную карту и помещаем ее в стопку с номером 1. Если выдача карт уже не первая, то берем самую верхнюю карту из стопки с номером 0и помещаем ее в самый верх стопки с номером 1. При первой выдаче мы перемешиваем карты. Все последующие выдачи карт должны совпадать с первой. Когда карты в стопке с номером 0закончатся полностью мы должны перебросить все карты из стопки с номером1в стопку с номером 0. При переносе из стопки в стопку изменяем координату карты по X, так как при переносе из стопки в стопку положение карты изменяется на игровом поле. Также изменяем признак отображения карты (картинка/рубашка), так как в стопке с номером 0все карты находятся рубашкой вверх,а в стопке с номером 1 все карты находятся картинкой вверх.Запишем описанную схему в программном коде:

// Выдача карт из верхней левой стопки

private void vidacha()

{

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

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

{

int nom;

// Если это первая выдача

if (pervVidacha==true)

{

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

nom = (int)(Math.random()*stopki[0].size());

}

else //Если повторная выдача

{

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

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

}

// Получаем карту из стопки с номером 0

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

// Делаем отображение картинкой

getKarta.tipRubashka = false;

// Увеличиваем координату на 110 -

// сдвигаем в стопку правее

getKarta.x += 110;

// Добавляем карту в стопку с номером 1

stopki[1].add(getKarta);

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

stopki[0].remove(nom);

}

else // Если карт уже нет

{

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

// в стопке номером1

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

// Переносим карты из стопки с номером 1

// в стопку с номером 0

for (int i=nomPosled;i>=0;i--)

{

karta getKarta = stopki[1].get(i);

// Делаем отображение рубашкой

getKarta.tipRubashka = true;

// Уменьшаем координату на110 -

// сдвигаем в стопку левее

getKarta.x -= 110;

// Добавляем в стопку с номером 0

stopki[0].add(getKarta);

}

// Очищаем стопку с номером 1

stopki[1].clear();

// Признак первой выдачи меняем на false

pervVidacha=false;

}

}

Теперь можно выполнить запуск нашего проекта (см.рис. 12).

Рис. 12

При нажатии на стопку с номером 0, карты будут выдаваться в стопку с номером 1. Когда карты в стопке с номером 0 закончатся их можно будет перебросить из стопки с номером 1в исходную стопку. При запуске новой игры выдача карт будет производиться новым случайным образом.

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

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

import java.awt.event.*;

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

import javax.swing.*;

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

import java.awt.*;

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

import javax.imageio.*;

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

import java.io.*;

// Класс, реализующий логику игры - управление игрой

public class game

{

// Изображение рубашки карты

public Image rubashka;

// Массив стопок карт

private stopka[] stopki;

// Признак первой выдачи карт из верхней

// левой стопки

private boolean pervVidacha;

// Признак окончания игры

public boolean endGame;

//Конструктор класса

public game()

{

//Загрузка изображения рубашки карты

try

{

rubashka = ImageIO.read(new File("c:\\karta\\k0.png"));

}

catch (Exception ex) {}

//Создание массива из 13 элементов,

//каждый элемент массива - это список

// значений (стопка карт)

stopki = new stopka[13];

// Для каждого элемента массива в цикле

//создаем новый объект

for (int i=0;i<13;i++)

{

// Создание нового объекта (нового списка значений)

stopki[i] = new stopka();

}

//Запуск игры - старт игры

start();

}

// При захвате карты мышью

public void mouseDragged(int mX, int mY)

{

}

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

public void mousePressed(int mX, int mY)

{

}

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

public void mouseDoublePressed(int mX, int mY)

{

}

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

public void mouseReleased(int mX, int mY)

{

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

int nom = getNomKolodaPress(mX, mY);

// Если верхняя левая стопка

if (nom==0)

{

// Делаем выдачу карты

vidacha();

}

}

// Определение стопки на которую нажали мышью

private int getNomKolodaPress(int mX, int mY)

{

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

int nom=-1;

// Если курсор находится в зоне верхних стопок

if ((mY>=15) && (mY<=(15+97)))

{

if ((mX>=30) && (mX<=(30+72))) nom = 0;

if ((mX>=140) && (mX<=(140+72))) nom = 1;

if ((mX>=360) && (mX<=(360+72))) nom = 2;

if ((mX>=470) && (mX<=(470+72))) nom = 3;

if ((mX>=580) && (mX<=(580+72))) nom = 4;

if ((mX>=690) && (mX<=(690+72))) nom = 5;

}

// Если курсор находится в зоне нижних стопок

else if ((mY>=130) && (mY<=(700)))

{

if ((mX>=30) && (mX<=110*7))

{

if (((mX-30)%110)<=72)

{

nom = (mX-30)/110;

nom += 6;

}

}

}

// Возврат результата

return nom;

}

// Выдача карт из верхней левой стопки

private void vidacha()

{

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

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

{

int nom;

// Если это первая выдача

if (pervVidacha==true)

{

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

nom = (int)(Math.random()*stopki[0].size());

}

else // Если повторная выдача

{

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

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

}

// Получаем карту из стопки с номером 0

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

// Делаем отображение картинкой

getKarta.tipRubashka = false;

// Увеличиваем координату на 110 -

// сдвигаем в стопку правее

getKarta.x += 110;

// Добавляем карту в стопку с номером 1

stopki[1].add(getKarta);

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

stopki[0].remove(nom);

}

else //Если карт уже нет

{

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

// в стопке номером1

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

// Переносим карты из стопки с номером 1

// в стопку с номером 0

for (int i=nomPosled;i>=0;i--)

{

karta getKarta = stopki[1].get(i);

// Делаем отображение рубашкой

getKarta.tipRubashka = true;

// Уменьшаем координату на110 -

// сдвигаем в стопку левее

getKarta.x -= 110;

// Добавляем в стопку с номером 0

stopki[0].add(getKarta);

}

// Очищаем стопку с номером 1

stopki[1].clear();

// Признак первой выдачи меняем на false

pervVidacha=false;

}

}

// Старт игры - Новая игра

public void start()

{

//Очищаем все тринадцать списков

for (int i=0;i<13;i++)

{

// Удаление всех элементов списка

stopki[i].clear();

}

//Производим загрузку

load();

//Признак конца игры - false

endGame = false;

//Признак первой выдачи - true

pervVidacha = true;

}

// Загрузка изображений колоды

private void load()

{

// Цикл делает 52 шага

for (int i=1;i<=52;i++)

{

// В верхнюю левую стопку загружаем карты

stopki[0].add(new karta("c:\\karta\\k"+(i)+".png", rubashka, i));

}

}

// Метод отрисовки всех стопок карт

public void drawKoloda(Graphics gr)

{

//ВЕРХНЯЯ ЛЕВАЯ СТОПКА

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

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

{

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

stopki[0].get(stopki[0].size()-1).draw(gr);

}

//ВТОРАЯ СЛЕВА ВЕРХНЯЯ СТОПКА

// Если в стопке более одной карты

if (stopki[1].size()>1)

{

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

stopki[1].get(stopki[1].size()-2).draw(gr);

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

stopki[1].get(stopki[1].size()-1).draw(gr);

}

// если в стопке одна карта

else if (stopki[1].size()==1)

{

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

stopki[1].get(stopki[1].size()-1).draw(gr);

}

}

}

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