- •Занятие 1. "Постановка задания для разработки игры Змейка. Работа с двумерным массивом"
- •Правила самостоятельной разработки игр данного курса
- •Работа с двумерным массивом в Java
- •Применение двумерного массива при создании игр
- •Постановка задания по созданию игры Змейка
- •Разделение задания для трех уровней сложности
- •План разработки проекта
- •Алгоритм для реализации игры Змейка
- •Перемещать голову змейки в нужном направлении.
- •Удалять хвост змейки. Удаление хвоста равносильно записи нулевого значения в элемент массива, где находилось число, отвечающее за хвост змейки.
- •Итог занятия
- •Занятие 2. "Постановка задания для разработки игры Морской бой"
- •Постановка задания по созданию игры Морской бой
- •Разделение задания для трех уровней сложности
- •Рекомендации для реализации игровых полей игры Морской бой
- •Алгоритм для реализации игры "Морской бой"
- •Генерация кораблей на игровом поле
- •Итог занятия
- •Занятие 3. "Постановка задания для разработки игры Пасьянс-Косынка"
- •Правила игры Пасьянс-Косынка
- •Упаковка файлов изображений внутрьJar-архива
- •Работа со списком в Java
- •Import java.Util.ArrayList;
- •Постановка задания по созданию игры Пасьянс-Косынка
- •Разделение задания для трех уровней сложности
- •Алгоритм перемешивания карт в колоде
- •Создание массива списков значений
- •Итог занятия
- •Заключение
- •Занятие 1. "Разработка игры Змейка. Первый и второй уровень сложности"
- •Рекомендации для изучения программного кода игр
- •Изучаемый программный код необходимо самостоятельно вводить с клавиатуры в среде разработки, глядя на образец в печатном издании.
- •Каждую строчку, каждый фрагмент программного кода стараться максимально разобрать и понять смысл. Не следует бездумно переписывать программный код и запускать!
- •Моменты, которые вызывают особые сложности в понимании, стараться нарисовать на бумаге или пройти пошагово.Например, цикл, который использует формулу с изменяющимися переменными в цикле.
- •Старайтесь больше экспериментировать с записанным программным кодом. Изменяйте значение кого-нибудь параметра и запускайте программу. Смотрите на изменения.
- •После разбора фрагмента программного кода –закрывайте книгу и начинайте пытаться записать свой программный код,который выполняет тоже самое, при этом, не заглядывая в книгу - с чистого листа.
- •Реализация первого уровня сложности игры Змейка Подготовка изображений для игры Змейка
- •Создание проекта и файлов классов игры Змейка
- •Реализация второго уровня сложности игры Змейка(начало)
- •Итог занятия
- •Занятие 2. "Разработка игры Змейка. Второй и третий уровень сложности"
- •Реализация второго уровня сложности игры Змейка(завершение)
- •Реализация третьего уровня сложности игры Змейка
- •Механизм перемещения змейки
- •Итог занятия
- •Занятие 3. "Разработка игры Морской бой. Первый уровень сложности"
- •Создание проекта и файлов классов игры Морской бой
- •Итог занятия
- •Занятие 4. "Разработка игры Морской бой. Второй уровень сложности"
- •Реализация второго уровня сложности игры Морской бой
- •Обозначения состояния ячейки игрового поля
- •Отрисовка игрового поля на основании двумерного массива
- •Ситуация выхода за пределы массива
- •Генерация однопалубных кораблей
- •Генерация четырехпалубного корабля
- •Итог занятия
- •Занятие 5. "Разработка игры Морской бой. Третий уровень сложности"
- •Реализация третьего уровня сложности игры Морской бой
- •Выполнение ходов игроком и компьютером
- •Стратегия ходов компьютера
- •Итог занятия
- •Занятие 6. "Разработка игры Пасьянс-Косынка. Начало первого уровня сложности"
- •Подготовка изображений для игры
- •Создание проекта и файлов классов игры Пасьянса-Косынка
- •Реализация класса kosinka
- •Реализация класса okno
- •Import javax.Swing.*;
- •Import java.Awt.*;
- •Реализация класса pole
- •Реализация класса karta
- •Import javax.Imageio.*;
- •Import java.Awt.*;
- •Import java.Io.*;
- •Итог занятия
- •Занятие 7. "Разработка игры Пасьянс-Косынка. Завершение первого уровня сложности"
- •Реализация класса stopka
- •Import java.Util.ArrayList;
- •Начало реализации класса game
- •Реализация класса pole
- •Завершение реализации класса game для первого уровня сложности
- •Vidacha();
- •Итог занятия
- •Занятие 8. "Разработка игры Пасьянс-Косынка. Второй уровень сложности"
- •Перерисовка всех стопок карт
- •Stopki[I].Get(stopki[I].Size()-2).Draw(gr);
- •Раздача карт в нижние семь стопок
- •Начало реализации третьего уровня сложности
- •Итог занятия
- •Занятие 9. "Разработка игры Пасьянс-Косынка. Третий уровень сложности"
- •// Получаем номер верхней карты
- •Тестирование переноса
- •Vidacha();
- •Заключение
- •Итог занятия
Итог занятия
На этом занятии мы:
закончили реализацию игры"Пасьянс-Косынка" для второго уровня сложности;
начали реализацию игры"Пасьянс-Косынка" для третьего уровня сложности;
выполнили раздачу карт в нижние стопки;
создали перерисовку всех стопок игрового поля.
Занятие 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();
}
Если выполнить запуск проекта, то при двойном щелчке мышью по карте, она должна автоматически переноситься в домашнюю стопку, если это возможно.
Но стоит понимать, что наша игра еще не закончена! При проверке уже выполненных возможностей –все остальное пока будет работать некорректно!
