русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Завершение реализации класса game для первого уровня сложности


Дата добавления: 2015-06-12; просмотров: 1682; Нарушение авторских прав


Пять классов нашего проекта уже полностью закончены. Все остальные доработки, для всех трех уровней сложности, затронут только класс game. Перейдем в файлgame.java.

В классе gameу нас добавлено несколько методов, которые пока ничего не выполняют. Начнем с конструктора класса:

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

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();

}

Конструктор загружает изображение рубашки карты. Далее создается массив из тринадцати элементов. Каждый элемент массива –это объект класса stopka. Другими словами,это список значений с картами –стопка карт. После создания массива в цикле создается объект для каждого элемента массива. И в конце происходит запуск игры –старт новой игры.

Далее займемся методом для загрузки колоды карт:

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

private void load()

{

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

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

{

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

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

}

}

Массив stopkiбудет содержать все тринадцать стопок карт. Нумерация в массиве начинается с нуля. Соответственно каждая стопка на игровом поле будет иметь свой номер. Решим, что нумерация стопок будет идти слева направо и сверху вниз(см. рис. 11). Так как читается текст в книге.

Рис. 11

Мы будем обращаться к стопкам карт так, как показано на рисунке(см. рис. 11).Соответственно верхняя левая стопка будет иметь номер: 0.Именно в эту стопку мы будем загружать все карты при старте игры. Загрузка будет производиться в цикле. Для добавления в список используется метод add():



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

При добавлении создается объект на основании классаkarta и конструктору класса kartaпередаются три параметра: путь к файлу карты, изображение рубашки карты и номер карты.

Далее займемся методом для запуска игры:

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

public void start()

{

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

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

{

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

stopki[i].clear();

}

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

load();

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

endGame = false;

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

pervVidacha = true;

}

Метод start()будет вызываться каждый раз при нажатии на кнопку Новая игра. В начале этот метод очищает все тринадцать списков,удаляя из них элементы. Далее производится загрузка колоды карт в верхнюю левую стопку. Признак окончания игры устанавливается –ложь.Признак первой выдачи из верхней левой колоды устанавливается –истина, потому что после старта игры произойдет самая первая выдача карт.

Для первого уровня сложности необходимо загрузить все карты в верхнюю левую стопку с номером 0 и затем производить выдачу карт, перемещая их во вторую слева верхнюю стопку с номером 1. Пока достаточно выполнять отрисовку только этих стопок карт. Так как все карты колоды будут пока находиться в этих двух стопках. Добавим код в метод drawKoloda():

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

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);

}

}

Метод drawKoloda() будет вызываться в методе paintComponent()класса poleпосле рисования фона и тринадцати белых прямоугольных рамок.

Сначала рисуем верхнюю левую стопку с номером 0:

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

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

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

{

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

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

}

Проверяем, есть ли в ней карты. Если есть, то рисуем самую верхнюю карту.

Самая верхняя карта имеет номер: size()-1, потому что нумерация элементов списка идет с нуля. Метод get()получает карту по номеру.Метод draw() находится в классе karta.

Далее рисуем вторую слева верхнюю стопку с номером 1:

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

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

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);

}

Со второй стопкой ситуация несколько отличается. Если в стопке всего одна карта, то рисуем самую верхнюю. Если более одной карты, то рисуем сначала вторую сверху, а потом самую верхнюю. Самая верхняя карта будет всегда рисоваться поверх второй сверху, потому сначала выводится вторая карта сверху. Две карты стопки с номером 1пользователь будет видеть,когда мышью захватит самую верхнюю карту и переместит ее в сторону.

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

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

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;

}

При определении номера стопки, над которой расположен курсор необходимо анализировать координаты курсора мыши. Ширина каждой карты –72пикселя, высота каждой карты–97 пикселей. Верхний ряд стопок находится с отступом по Y –15 пикселей.Нижний ряд стопок находится с отступом поY –130 пикселей. Отступ между стопками карт,расположенных рядом в одном ряду –110пикселей. Самая левая стопка находится с отступом по X- 30пикселей. Для верхнего ряда необходимо точное вычисление по размерам карты. Для нижнего ряда нужно учитывать,что карты раскладываются сверху вниз–одна ниже другой. Поэтому нижнюю границу стопки нижнего ряда необходимо брать –700пикселей(до нижней части окна).

Выдачу карты мы будем производить при отпускании левой клавиши мыши, если в этот момент курсор мыши находится над верхней левой стопкой карт с номером 0:

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

public void mouseReleased(int mX, int mY)

{

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

int nom = getNomKolodaPress(mX, mY);

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

if (nom==0)

{

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

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);

}

}

}



<== предыдущая лекция | следующая лекция ==>
Реализация класса pole | Итог занятия


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.092 сек.