- •Занятие 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();
- •Заключение
- •Итог занятия
Import java.Util.ArrayList;
В классе stopka всего одно свойство класса (переменная класса) –это список значений:
// Список значений
private ArrayList<karta> lst;
Обратите внимание, что тип значения: karta. Наш список будет хранить карты колоды, реализованные в классе karta.
В конструкторе класса создается изначально пустой список:
// Создание пустого списка значений
lst = new ArrayList<karta>();
Далее в классе перечислены методы, о которых мы говорили выше. Методы, которые понадобятся нам при работе со стопкой карт на игровом поле.Далее мы создадим массив из тринадцати стопок и будем работать со всеми стопками карт на игровом поле через массив.
На этом реализация класса stopka является полностью законченной для всех уровней сложности. Больше к этому классу мы возвращаться не будем. Можно закрыть закладку stopka.java (см.рис. 3).
Рис. 3
Получается, что четыре класса проекта у нас уже полностью закончены. Все остальные доработки коснутся классов poleи game.
Начало реализации класса game
Класс gameбудет самым большим и сложным в проекте. В этом классе будет сосредоточено программирование логики игры и контроль над действиями пользователя. Перейдем на закладку game.java и добавим в самом верху уже знакомые нам пять библиотек:
// Для работы с событиями(мышь, таймер)
import java.awt.event.*;
// Для работы с окнами и кнопками
import javax.swing.*;
// Для работы с графикой
import java.awt.*;
// Для работы с картинками
import javax.imageio.*;
// Для работы с файлами
import java.io.*;
// Класс, реализующий логику игры - управление игрой
public class game { }
Эти же библиотеки добавлены в классе pole. Начнем со свойств класса 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;
}
Это переменные, которые понадобятся для реализации первого уровня сложности игры. Первая переменная –это изображение рубашки карты. Это изображение будет передаваться в конструктор класса karta. Изображение будет общим для всех карт колоды расположенных рубашкой вверх:
// Изображение рубашки карты
public Image rubashka;
Вторая переменная–это массив,который будет хранить стопки карт игрового поля. Обратите внимание, что тип массива–stopka (класс, созданный на предыдущем этапе):
// Массив стопок карт
private stopka[] stopki;
Третья переменная–это признак первой выдачи карт из верхней левой колоды:
// Признак первой выдачи карт из верхней
// левой стопки
private boolean pervVidacha;
Смысл в этой переменной такой: изначально все карты будут загружаться в верхнюю левую стопку (см. рис. 4).
Рис. 4
Карты будут загружаться в порядке нахождения их в файлах. Другими словами, колода будет не размешанной и карты будут отсортированы по порядку. При первой выдаче карт –они будут извлекаться случайным образом из верхней левой стопки, и помещаться в правую от нее стопку (см. рис. 5).
Рис. 5
Когда все карты в верхней левой стопке закончатся –в перемешанном виде они будут находиться в правой от нее стопке(см. рис. 6).
Рис. 6
При первой выдаче карт из верхней левой стопки мы будем перемешивать карты. А при всех последующих выдачах карт –мы будем уже использовать перемешанную стопку. Но пользователь не будет догадываться об этом. Пользователь будет думать, что все карты уже перемешаны изначально.
Четвертая переменная –это признак окончания игры:
// Признак окончания игры
public boolean endGame;
Под блоком переменных класса добавим методы класса game, но пока без программного кода. Только заголовки методов:
// Изображение рубашки карты
public Image rubashka;
// Массив стопок карт
private stopka[] stopki;
// Признак первой выдачи карт из верхней
// левой стопки
private boolean pervVidacha;
// Признак окончания игры
public boolean endGame;
//Конструктор класса
public game()
{
}
// При захвате карты мышью
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)
{
}
// Определение стопки на которую нажали мышью
private int getNomKolodaPress(int mX, int mY)
{
// Если курсор мыши не попал по стопке карт
return-1;
}
// Выдача карт из верхней левой стопки
private void vidacha()
{
}
// Старт игры - Новая игра
public void start()
{
}
// Загрузка изображений колоды
private void load()
{
}
// Метод отрисовки всех стопок карт
public void drawKoloda(Graphics gr)
{
}
Программный код внутри этих методов нам предстоит написать позднее. А пока рассмотрим их предназначение. Конструктор класса, как обычно, выполняет стартовые действия при создании объекта:
//Конструктор класса
public game()
Четыре метода, которые начинаются со слова mouse, будут вызываться при различных действиях мышью. Этим методам будут передаваться координаты курсора мыши.
Метод getNomKolodaPress()будет вычислять номер стопки, на которую нажал мышью пользователь. Вычисление будет производиться по координатам курсора мыши:
// Определение стопки на которую нажали мышью
private int getNomKolodaPress(int mX, int mY)
Метод vidacha() будет отвечать за выдачу карт из верхней левой стопки:
// Выдача карт из верхней левой стопки
private void vidacha()
Метод start()будет вызываться при запуске новой игры:
// Старт игры - Новая игра
public void start()
Метод load()будет загружать изображения карт:
// Загрузка изображений колоды
private void load()
И метод drawKoloda() будет выполнять отрисовку всех стопок карт:
// Метод отрисовки всех стопок карт
public void drawKoloda(Graphics gr)
К созданию программного кода методов класса game –мы приступим после реализации класса pole.
