89070

Разработка игры «Эрудит» на языке Java

Курсовая

Информатика, кибернетика и программирование

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

Русский

2015-05-09

2.09 MB

18 чел.

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«Пензенский государственный технологический университет»

(ПензГТУ)

Факультет информационных и образовательных технологий

название института

Кафедра «Информационные технологии и системы»

название кафедры

Дисциплина «Языки программирования»

наименование дисциплины

КУРСОВАЯ РАБОТА

на тему: «Разработка игры «Эрудит» на языке Java»

тема курсовой работы

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

ПензГТУ 3.230400.25.ПЗ

шифр документа

Выполнил: студент группы 13ИС2б Чинков М.Ю.

Руководитель: ст. преподаватель кафедры ИТС Володин К.И.

Работа защищена с оценкой: ________________________

Пенза, 2014 г.


Утверждаю

зав. каф. ИТС Михеев М.Ю.

«_____»_____________

ЗАДАНИЕ

на курсовую работу по дисциплине «Языки программирования»

Студент ______________       Группа 13ИС2б

Тема работы: «Разработка игры «Эрудит» на языке Java»

Исходные данные (технические требования на работу)

1. Назначение программы: «компьютерная игра»

2. Состав и структура исходных данных: данные представляют собой вопросы с вариантами ответов, из которых пользователю представляется выбрать только 1 правильный вариант.

3. Функции программы: вывод на экран вопроса с 4 вариантами.

4. Требования к программе: тип меню – горизонтальное, выбор функций меню –  по клику компьютерной мышью, вывод результата в конце игры.

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

6. Графическая часть:

– схема программы (7 листов формата А4);

7. Экспериментальная часть:

– составление и отладка программы в Intellij IDEA Community Edition 12.1.2;

– создание файла для игры в формате jar с помощью Java Development Kit 1.7.0_45;

СОДЕРЖАНИЕ

ВВЕДЕНИЕ 4

1. ПОСТАНОВКА ЗАДАЧИ НА РАЗРАБОТКУ ПРОГРАММЫ 6

2. МЕТОДЫ РЕШЕНИЯ ЗАДАЧ 11

2.1 Задачи класса MainUI 14

2.2 Задачи класса SuccessStage 15

2.3 Задачи класса TasksViewStage 15

2.4 Выводы к разделу 16

3. ОПИСАНИЕ ПРОГРАММЫ 18

3.1 Пакет beans 18

3.2 Пакет manager 19

3.3 Пакет ui 20

3.4 Выводы к разделу 24

4. МЕТОДИКА ОТЛАДКИ ПРОГРАММЫ 25

4.1 Результаты работы программы 26

5. JAR-СБОРКА И СОЗДАНИЕ ИНСТАЛЯЦИОННОГО ПАКЕТА 28

5.1 Jar-сборка проекта 28

5.2 Создание инсталляционного пакета приложения 30

6. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ 33

ЗАКЛЮЧЕНИЕ 34

СПИСОК ЛИТЕРАТУРЫ 35

ПРИЛОЖЕНИЕ А. Схема программы 36

ПРИЛОЖЕНИЕ Б. Исходный код программы 39

ПРИЛОЖЕНИЕ В. Пример сгенерированной документации 44


ВВЕДЕНИЕ

Цель курсовой работы – приобретение навыков создания компьютерной игры для пользователей персональных компьютеров, программирования на языке Java, генерирования документации программного кода, создания инсталляционного пакета, а также практическое освоение графического интерфейса для создания приложений.

В рамках задачи курсовой работы мною был выбран такой проект, как разработка компьютерной игры «Эрудит» с помощью языка программирования Java. В данном случае термин «компьютерная игра» – это компьютерная программа, организующая игровой процесс и выступающая в качестве партнёра. Тематика созданной мною игры – интерактивная, познавательная.

Актуальность работы: приложение «Эрудит», разработанное в рамках курсовой работы, имеет формат флэш–игры и является аналогом телеинтерактивов «Кто хочет стать миллионером?» (Россия) и «Who Wants to Be a Millionaire?» (Великобритания). Данная игра нацелена в большей степени на подростковую аудиторию (13–16 лет). Цель игры – научить подростков, желающих участвовать в подобных играх, проводить досуг с интенсивной интеллектуальной направленностью, подтолкнуть их к развитию индивидуальности. В игре выдержана разносторонность вопросов, ответы на которые дают школьникам новые полезные знания. Вопросы собраны из интернет–базы.

Процесс выполнения курсовой работы:

1. Постановка задачи на разработку программы (суть идеи компьютерной игры «Эрудит», обоснованность выбора языка программирования Java для решения задачи, средства, использованные в процессе разработки программы).

2. Выбор методов решения задач (описание задач, поставленных в каждом классе программы и методы их решения).

3. Описание программы (описание основных операций в классах программы).

4. Отладка программы (описание процесса отладки программы, цикла разработки приложения, результаты работы программы).

5.  Сборка проекта (запись проекта в jar-файл и создание инсталляционного пакета).

6. Создание руководства пользователя (инструкция пользования игрой, правила игры, средства ввода данных).


1. ПОСТАНОВКА ЗАДАЧИ НА РАЗРАБОТКУ ПРОГРАММЫ

Постановка задачи – это один из наиболее важных этапов при создании программы. От того, насколько полно, точно и ясно определены требования к разрабатываемому ПО, его функции и предполагаемые возможности, во многом зависит качество и стоимость разработки.

Для реализации данной идеи был выбран язык программирования Java, потому что его преимущества по сравнению с другими языками программирования являются наиболее важными для создания качественной программы. Java представляет собой язык программирования и платформу вычислений, которая была впервые выпущена Sun Microsystems в 1995 г. Существует множество приложений и веб–сайтов, которые не работают при отсутствии установленной Java, и с каждым днем число таких веб–сайтов и приложений увеличивается. Java отличается быстротой, высоким уровнем защиты и надежностью. Java используется повсюду: от портативных компьютеров до центров данных, от игровых консолей до суперкомпьютеров, используемых для научных разработок, от сотовых телефонов до сети Интернет.

Одно из главных преимуществ языка – независимость от платформы, на которой выполняются программы. Таким образом, один и тот же код можно запускать под управлением операционных систем Windows, Linux, Mac и т.д. Программы на Java транслируются в байт–код, выполняемый виртуальной машиной Java  (программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор), поэтому байт–код полностью независим от операционной системы и оборудования, что позволяет выполнять Java–приложения на любом устройстве, для которого существует соответствующая виртуальная машина.

Другим, не менее важным преимуществом Java, является большая схожесть с языком программирования C, изучаемый мною в рамках дисциплины «Языки программирования». Также при разработке Java было уделено большое внимание простоте языка, поэтому программы на Java, по сравнению с программами на других языках, проще писать, компилировать, отлаживать и изучать.

Игра состоит из 10 вопросов, которые выводятся на экран в случайном порядке. Заставкой экрана является окно, в котором отражены две кнопки: при нажатии первой, пользователь выходит из игры, при нажатии второй – начинает игру. Пользователю даны на выбор 4 возможных варианта ответа, из которых он может выбрать только один. Игра продолжается при выборе

пользователем правильного ответа, при выборе неправильного ответа – завершается. В конце игры на экране выводится количество набранных очков.

Полное прохождение игры показывает развитый кругозор пользователя и его готовность к интеллектуальным играм на определенных площадках (пример – «Интеллектуальный марафон»).

Сначала был написан программный код, в котором были реализованы все свойства и функции игры. Затем была проделана отладка программы при помощи интегрированной среды разработки. Далее была написана документация к программному коду и был создан инсталляционный пакет приложения. Процесс выполнения курсовой работы завершается выполнением графической части, а именно схемы программы. Для выполнения задач были использованы:

  1.  Интегрированная среда разработки (IDE).

Интегрированная среда разработки – это совокупность программных средств, которая поддерживает все этапы разработки программного обеспечения от написания исходного код программы до ее компиляции и отладки. В данном проекте исходный код программы, а также компиляция и отладка программы были выполнены с помощью среды Intellij IDEA Community Edition 12.1.2, разработанной компанией JetBrains. Стоит отметить, что реализовать эту же задачу на языке Java можно с помощью таких IDE, как NetBeans IDE и Eclipse.

Рисунок 1 – логотип Intellij IDEA Community Edition 12.1.2

  1.  Комплект разработчика приложений (SDK).

SDK – это комплект средств разработки, позволяющий создавать приложения для определённого пакета программ, компьютерной системы, игровых консолей, операционных систем и прочих платформ. Для создания приложения в формате jar был использован Java Development Kit 1.7.0_45.

  1.  Графический редактор.

Графический редактор – программа, позволяющая создавать и редактировать двумерные изображения с помощью компьютера. Для выполнения графической части курсовой работы нужен редактор, позволяющий создавать блок–схемы. Удобнее всего использовать Microsoft Visio 2010, который является частью Microsoft Office. Также для создания логотипа был использован графический редактор Adobe Photoshop CS6 – графический редактор, с помощью которого можно создавать растровые изображения.

Рисунок 2 – логотип игры «Эрудит»

  1.  Платформа для создания приложения.

В данном случае важная для создания игры функция платформы – возможность строить приложения с насыщенным графическим интерфейсом пользователя для непосредственного запуска из–под операционных систем.

Для создания приложения на языке Java понадобится платформа JavaFX. Для запуска JavaFX в среде Intellij IDEA нужно в каждом из классов, отвечающих за графический интерфейс, сначала выполнить ввод библиотек, отвечающих за JavaFX, а затем создать сцену (scene).

Также для создания игры на языке Java можно использовать платформу GUI. Для разработки приложений на GUI используется интегрированная среда разработки NetBeans. В ней создается форма Swing GUI. Для создания графического интерфейса в Swing используется класс JFrame. Основное отличие от JavaFX состоит в том, что можно добавлять различные элементы (кнопки, поля) на экран приложения вручную, а код впоследствии генерируется автоматически.

  1.  Инструмент для создания инсталяционного пакета.

Инсталлятор – установщик программного обеспечения на компьютер конечного пользователя. Выполняется входящим в состав самого программного обеспечения средством установки. Для создания инсталляционного пакета была использована Inno Setup 5.5.4 – система создания инсталляторов для программ. С помощью Inno Setup можно создать классический интерфейс установки игры.

Рисунок 3 – логотип Inno Setup

  1.  Система документирования исходного кода

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

Для решения задачи документирования кода был использован Javadoc –   генератор документации в HTML-формате из комментариев исходного кода на Java от компании Sun Microsystems. Javadoc — стандарт для документирования классов Java. Для работы с данной системой документирования достаточно просто написать комментарии в кавычках в каждом классе перед исходным кодом. Чтобы увидеть результат документирования в Intellij IDEA Community Edition 12.1.2, нужно использовать комбинацию клавиш Ctrl + Q.


2. МЕТОДЫ РЕШЕНИЯ ЗАДАЧ

Любая программа на языке Java состоит из пакетов, а пакеты, в свою очередь, состоят из классов. Каждый класс хранится в отдельном файле. Имя файла совпадает с именем класса, расширение файла – java. Любая функция может существовать только внутри класса. В данной программе было создано в общей сложности 3 пакета и 7 классов. Каждый класс решает определенные задачи, поставленные с целью работы приложения.

Задача, реализованная в классе Task – хранение информации о вопросах и ответах в игре. В классе Task были введены строковые переменные вопроса (String question), правильного ответа (String rightAnswer) и массив ответов (List<String> answers), которые также используются в других классах.

Задача, реализованная в классе TaskStorage – работа с текстовым файлом, в котором хранятся вопросы и список ответов для игры(открытие файла, чтение файла, разделение вопросов и ответов, выделение правильного ответа, закрытие файла).

Перед тем, как открыть файл, он был загружен в out-директорию с помощью конструкции. Затем идет чтение файла функцией bufferedreader. Также была использована функция e.printStackTrace() для подробного вывода возможных ошибок. Функция scanner была использована для разделения строки файла на вопросы и ответы. Суть разделения такова: если программа находит в текстовом файле символ «:», то это означает конец вопроса и начало списка вариантов ответов. Символ «;» обозначает переход от одного варианта ответа к другому. Символ «!!!» после названия варианта ответа обозначает то, что данный ответ на вопрос является правильным. Символ «/n» (перенос строки) обозначает переход на следующий вопрос. После нахождения данных символов кладем созданный вопрос в общий список.

while ((line = reader.readLine()) != null) {

Scanner scanner = new Scanner(line); scanner.useDelimiter(Pattern.compile("\n"));                scanner.useDelimiter(Pattern.compile(":"));//определяем символы, которые будут служить для разделения строк            

while (scanner.hasNext()) {

String question = scanner.next();//первая часть разделенной строки - вопрос

String answerLine = scanner.next();//вторая часть разделенной строки - список ответов

answerLine.trim();

Scanner answersScanner = new Scanner(answerLine);

answersScanner.useDelimiter(Pattern.compile(";"));

List<String> answers = new ArrayList();

String correct = null; //из подстроки ответов выделяем одиночные ответы, разделенные ;

while (answersScanner.hasNext()) {

String answer = answersScanner.next();

if (answer.endsWith("!!!")) {

answer = answer.replaceAll("!", "");

correct = answer;} //если ответ заканчивается на !!!, это правильный ответ

answers.add(answer.trim());}

simpleTasks.add(new Task("" + i++, question, answers, correct.trim()));}}//кладем вопрос в общий список

Листинг 1 – сканирование текстового файла

Данный отрывок исходного кода отображает процесс работы с текстовым файлом. Закрываем чтение файла методом  reader.close, сам файл закрываем методом in.close.

Задачи класса TestItem:

  1.  Хранение информации о действующем вопросе в игре и ответе, данном пользователем на этот вопрос.

Данная задача была выполнена методом ввода строковых переменных task и answer, которые были объявлены в классе Task. Также в данном классе была применена аннотация @Override – она проверяет, переопределен ли метод и вызывает предупреждение компиляции, если метод не найден в классе.

  1.  Проверка, правильный ли ответ дал пользователь.

Задача была выполнена методом ввода оператора if-else. Если пользователь выбирает правильный ответ на вопрос, то игра продолжается, если ответ неправильный – игра прерывается.

Задачи класса TestManager:

  1.  Ввод в приложение вариантов суммы выигрыша пользователя.

В игру были добавлены суммы выигрыша, выводящиеся на экран пользователя в зависимости от количества вопросов, на которые пользователь ответил верно. Был добавлен массив prizeMapping. Также были введены вручную элементы массива, которым присвоено определенное значение. После пяти правильных ответов на вопросы пользователь получает несгораемую сумму. Она высчитывается путем деления на 5 и возвращается пользователю в случае дальнешего проигрыша с помощью оператора return.

  1.  Формирование количества вопросов в игре.

Для решения данной задачи была введена переменная Simple_quantity, которой было присвоено значение, равное количеству вопросов в игре. Всего в игре пользователь может ответить максимум на 10 вопросов, общее количество вопросов в базе – 47.

  1.  Перемещение вопросов из текстового файла в менеджер игры.

Были использованы функция simpleTasks, которая выбирает все вопросы из хранилища и addTasks, добавляюшая вопросы в менеджер программы. Также в данном классе используется функция Collections.shuffle, которая при каждом запуске программы выводит разные вопросы.

  1.  Вывод вопросов на экран в случайном порядке.

Для решения данной задачи использовался оператор rand.

  1.  Смена вопросов в процессе работы приложения.

Программа проверяет, правильный ли ответ дал пользователь. Если да, то выводит на экран следующий вопрос с помощью функции nextItem. Если текущий вопрос был последним, то возвращается значение null и пользователю выводится самая большая сумма выигрыша.

public boolean setAnswer(String answer) {

if (currentIndex >= 0) {

items.get(currentIndex).setAnswer(answer);

}

return  items.get(currentIndex).isRight();

}//проверяем, верный ли ответ дал пользователь

public TestItem nextItem() {//возвращаем следующий вопрос для вывода на экран

if (currentIndex == items.size() - 1) {

return null;} //если текущий вопрос был последним возвращаем null

return items.get(++currentIndex);}

Листинг 2 – проверка ответа, данного пользователем

  1.  Расчет выигрыша пользователя.

Для расчета выигрыша использовались функции getSuccess и getPrize. При завершении игры пользователю выводится следующее сообщение: "Ваш выигрыш составил " + getPrize() + " очков".

2.1 Задачи класса MainUI

  1.  Инициализация кнопок «Выход» и «Начать».

Задача инициализации кнопки «Выход» была решена с помощью создания функции exitButton и присвоения ей текста кнопки, цвета и размера текста, размеров кнопки и обработчика нажатия кнопки. Аналогично была проведена инициализация кнопки «Начать». В класе MainUI также есть аннотация @Override.

  1.  Формирование панели для кнопок, создание сцены для вывода первого окна приложения.

Была создана горизонтальная панель с помощью функции hbox, на которую были помещены кнопки «Начать» и «Выход». Затем была создана сцена для вывода первого окна приложения.

BorderPane root = new BorderPane();

 Scene scene = new Scene(root);

 primaryStage.setScene(scene);

 root.setBottom(hbox);

Листинг 3 – создание сцены для вывода окна приложения

  1.  Вычисление размеров окна, вывод окна.

Данная задача была выполнена добавлением в классс метода getDefaultToolkit и последующим вводом переменных screenHeight и screenWidth, которым был присвоен размер окна приложения. Затем задаем точку для нашего окна на экране с помощью функций setX и setY и показываем окно пользователю (функция show). За запуск окна приложения отвечает функция launch.

2.2 Задачи класса SuccessStage

  1.  Инициализация кнопки «ОК».

Задача была решена так же, как и в классе MainUI с кнопками «Выход» и «Начать».

  1.  Формирование панели, создание сцены для вывода последнего окна приложения, вывод окна.

Была создана вертикальная панель (функция vbox), на которую были добавлены текст с выигрышем пользователя и кнопка «ОК». Затем была создана сцена, на которой располагается панель. В конце класса происходит пока окна пользователю (setBottom).

2.3 Задачи класса TasksViewStage

  1.  Вывод вопроса на экран приложения.

Класс Label выводит текст вопроса. Затем были созданы кнопки «Завершить игру» и «Ответить». Затем был добавлен класс ToggleGroup, который представляет группу переключателей, в которой только один переключатель может находиться в выбранном состоянии. Массив вариантов ответов выводится на экран в формате радиокнопок.

  1.  Добавление цвета и шрифта текста на кнопках.

Добавлением данных кнопок занимается интерфейс set (setTextFill, setFont, setOnAction). Затем формируем горизонтальную панель hbox для расположения кнопок друг к другу.

  1.  Добавление логотипа в окно игры.

Был создан объект класса image, в который был помещен логотип игры.

  1.  Формирование панели, создание сцены для вывода окна приложения.

Формируем вертикальную панель vbox, добавляем туда функцией addAll логотип игры, горизонтальная панель кнопок, вопрос и варианты ответов. Добавляем класс BorderPane, который отслеживает размер сцены, выбираем цвет фона (функция setStyle) и создаем сцену.

  1.  Проверка на правильность ответа, данного пользователем.

Добавляем переменную result, чтобы получить данный пользователем ответ. Был использован переключатель setToggleGroup для перехода между радиокнопками.

  1.  Обновление окна новым вопросом.

Проверяем оператором if-else, выбрал ли пользователь верный ответ. Если вопросы еще остались, обновляем окно функцией remove. Если вопросы закончились, закрываем окно вопросов и ответов функцией close и выводим окно выигрыша пользователя. Если ответ неправильный, то срабатывает функция setExitOnError и программа выводит окно выигрыша пользователя на экран так же, как и в том случае, когда вопросы закончились.

  1.  Создание случайного вывода возможных ответов на экране.

Функция Collections.shuffle перемешивает массив ответов. Функция getAnswers выводит список ответов на экран.

2.4 Выводы к разделу

В данном разделе были описаны задачи, поставленные с целью реализации основного задания курсовой работы (разработка игры «Эрудит» на языке Java), и методы решения задач. Подводя итоги, можно сказать, что задание в рамках курсовой работы было решено путем создания семи классов и инициализации в них поставленных задач.

  1.  Класс Task1 основная задача
  2.  Класс TaskStorage1 основная задача
  3.  Класс TestItem – 2 основные задачи
  4.  Класс TestManager – 6 основных задач
  5.  Класс MainUI – 3 основные задачи
  6.  Класс SuccessStage – 2 основные задачи
  7.  Класс TasksViewStage – 7 основных задач


3. ОПИСАНИЕ ПРОГРАММЫ

3.1 Пакет beans

Первый пакет – beans. Пакет был создан в целях работы с вопросами и ответами, их обработкой перед выводом на экран. Он состоит из трех классов – Task, TaskStorage и TestItem. Класс Task отвечает за ввод основных переменных, которые используются в других классах. В данном классе был создан массив ответов на вопросы. Затем были введены те самые переменные, о которых говорилось ранее. Применялся метод Task типа Public.

public Task(String id, String question, List<String> answers, String rightAnswer) {

this.id = id;

this.question = question;

this.answers = answers;

this.rightAnswer = rightAnswer;}

Листинг 4 – ввод переменных в классе Task

Класс TaskStorage отвечает за чтение текстового файла с вопросами и ответами и создание хранилища вопросов. Мы открываем на чтение наш файл с вопросами, читаем файл построчно, разделяем строку на вопрос и ответы методом определения символов, которые будут служить для разделения строк. Первая часть разделенной строки – вопрос, вторая – список ответов. Из подстроки ответов мы выделяем одиночные ответы, разделенные символом «;», и обнаруживаем правильный ответ. Если ответ заканчивается на «!!!», то это правильный ответ.

if(answer.endsWith("!!!")) {

answer = answer.replaceAll("!","");

correct = answer;}

Листинг 5 – алгоритм выбора правильного ответа

Затем кладем созданный вопрос в общий список вопросов и закрываем файл. В конце класса мы считаем вопросы из файла. Это необходимо при первом обращении к списку вопросов.

if (storage == null) {

storage = new TaskStorage();}

return simpleTasks;

Листинг 6 – подсчет вопросов в файле

Класс TestItem проверяет, правильный ли ответ дал пользователь. Если ответ верный, то игра продолжается, если нет – выход из игры в окно окончательного результата.

public boolean isRight() {

if (answer != null && answer.equals(task.getRightAnswer())) {

return true;}

return false;}

Листинг 7 – реакция на выбранный пользователем ответ

3.2 Пакет manager

Второй пакет – manager. Он состоит из одного пакета – TestManager. Его можно назвать самым главным классом программы, так как он управляет работой программы, печатает вопрос и выводит выигрыш на экран. Сначала я ввел суммы выигрыша в игре с помощью массива, количество элементов которого является максимальному числу вопросов в игре. Несгораемая сумма определяется в конце класса делением на 5, так как несгораемой суммой является каждый пятый выигрыш.

private List<String> prizeMapping = new ArrayList(15);

{prizeMapping.add("0");

prizeMapping.add("10000");

prizeMapping.add("20000");

prizeMapping.add("30000");

prizeMapping.add("40000");

prizeMapping.add("50000");//несгораемая сумма

prizeMapping.add("60000");

prizeMapping.add("70000");

prizeMapping.add("85000");

prizeMapping.add("100000");

prizeMapping.add("150000"); //несгораемая сумма

………………

int index = currentIndex/5;

index = index * 5;

return prizeMapping.get(index);

Листинг 8 – инициализация суммы выигрыша пользователя

В этом классе мы также формируем количество вопросов в игре посредством ввода менеджера, выбираем все вопрсоы из хранилища, перемешиваем, чтобы при каждом запуске выпадали разные вопросы и добавляем вопросы в менеджер. Устанавливаем флаг – индикатор того что игра закончена из–за неправильного ответа. Данный флаг необходим для расчета конечного выигрыша. Затем выводим вопросы на экран в случайном порядке.

private void addTasks(List<Task> tasksToAdd, int quantity) {

int i=0;

while(i < quantity && !tasksToAdd.isEmpty()) {

int randomIndex = Math.abs(rand.nextInt()%tasksToAdd.size());

Task task = tasksToAdd.get(randomIndex);

items.add(new TestItem(task));

i++;}}

Листинг 9 – добавление вопросов в игру

Проверяем, верный ли ответ дал пользователь. Если ответ верный, то возвращаем следующий вопрос для вывода на экран. Если текущий вопрос был последним возвращаем значение null. Затем выводим выигрыш на экран. В конце класса происходит расчет выигрыша.

3.3 Пакет ui

Третий пакет – ui. В пакете была проведена разработка графического интерфейса приложения. Пакет состоит из трех классов – MainUI, SuccessStage и TaskViewStage. Класс MainUI отвечает за запуск первого окна приложения. В среде Intellij IDEA Community Edition 12.1.2 именно его мы запускаем с помощью команды Run (Shift + F10), чтобы увидеть полную работу приложения. В начале класса были введены библиотеки, большинство из которых нужны для запуска JavaFX и подключение к классу TestManager. Формируем первую форму приложения с двумя кнопками: «Выход» и «Начать». Происходит инициализация кнопки «Выход» (написание текста кнопки, задание ее размеров, цвета текста, размера текста, обработчика нажатия на кнопку). Затем то же самое проделываем с кнопкой «Начать». Формируем горизонтальную панель и кладем на нее две объявленные кнопки и помещаем полученную панель на наш главный виджет.

HBox hbox = new HBox();

hbox.getChildren().addAll(exitButton, goButton);

hbox.setPadding(new Insets(5, 5, 5, 5));

BorderPane root = new BorderPane();

Scene scene = new Scene(root);

primaryStage.setScene(scene);

root.setBottom(hbox);

Листинг 10 – формирование горизонтальной панели и добавление сцены

Затем вычисляем размеры экрана для того, чтобы красиво разместить наше главное окно программы и показываем его пользователю. В конце класса отрывок кода, позволяющий запустить первое окно, закрыть его и вывести окно с вопросами.

private void handleGoButton() {

final TasksViewStage stage = new TasksViewStage(new TestManager());

stage.show();

stage.setMinWidth(stage.getWidth());

stage.setMinHeight(stage.getHeight());

this.primaryStage.close();

}

public static void main(String[] args) {

launch(args);}

Листинг 11 – запуск первого окна приложения

Класс SuccessStage инициализирует окно, которое выводит выигрыш пользователя. В начале класса создаем кнопку «ОК» и сообщаем пользователю о призовых. Затем задаем вертикальное расположение текста с выигрышем и кнопки "ОК" и запускаем сцену. Сцену нужно запустить в каждом классе, отвечающем за графический интерфейс приложения.

VBox vbox = new VBox();

vbox.setPadding(new Insets(10, 10, 10, 10));

vbox.getChildren().addAll(prizeLabel, okButton)

BorderPane root = new BorderPane();   

Scene scene = new Scene(root);

setScene(scene);

root.setBottom(vbox);

setResizable(false);

Листинг 12 – формирование вертикальной панели и добавление сцены

Класс TaskViewStage создает окно с вопросами и ответами. В начале класса происходит процесс вывода на экран нового вопроса.

Label question = new Label();

Button exitButton = new Button("Завершить игру");

Button nextButton = new Button("Ответить");

ToggleGroup answerGroup = new ToggleGroup();

List<RadioButton> answerButtons = new ArrayList<RadioButton>();

VBox answerBox = new VBox(); 

Листинг 13 – вывод на экран нового вопроса

Затем устанавливается размер рамки окна и расположение кнопок на ней, определяется цвет, шрифт текста на кнопках. Делаем положение кнопок «Завершить игру» и «Ответить» под вопросом и списком ответов горизонтальным. Затем добавляем логотип в окно игры. Далее определяем вертикальное положение логотипа, вопроса, списка ответов и создаем сцену, на которую накладываем все перечисленные элементы. Выбираем цвет фона – серый. Создаем функцию – обработчик кнопки «Ответить», получаем данный пользователем ответ. В конце класса проверяем: если ответ правильный и вопросов больше нет – завершаем игру и выводим выигрыш. Если ответ правильный и вопросы еще есть –    обновляем окно новым вопросом. Если ответ неправильный – завершаем игру и выводим выигрыш на экран.

if (result == true) {

TestItem item = tm.nextItem();

if (item == null) {

new SuccessStage(tm).show();

this.close();

return;

}

for (RadioButton rb : answerButtons) {

answerBox.getChildren().remove(rb);

}

answerButtons.clear();            question.setText(item.getTask().getQuestion());

} else {

tm.setExitOnError();

new SuccessStage(tm).show();

this.close();

}

Листинг 14 –действие приложения после выбора ответа

Также в этом классе есть функция Collections.shuffle, которая перемешивает возможные ответы, выставляя их при каждом запуске игры в разном порядке.

List<String> answers = item.getTask().getAnswers();

Collections.shuffle(answers);    

for (String str : answers) {

RadioButton rb = new RadioButton(str);

answerButtons.add(rb);

}

Листинг 15 –перемешанные ответы в игре

Также в проекте находится файл расширением iml.  Это файл модуля, создаваемый автоматически в IntelliJ IDEA. Он хранит информацию о блоке разработки, которая может быть компонентом Java, хранит пути модуля, зависимости и другие настройки. Файлы IML также используются для хранения небольших секций большого проекта разработки.

<?xml version="1.0" encoding="UTF-8"?>

<module type="JAVA_MODULE" version="4">

<component name="NewModuleRootManager" inherit-compiler-output="true">

<exclude-output />

<content url="file://$MODULE_DIR$">

<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />

</content>

<orderEntry type="inheritedJdk" />

<orderEntry type="sourceFolder" forTests="false" />

</component>

</module>

Листинг 16 –файл IML

  1.  Выводы к разделу

В данном разделе была описана программа, написанная для разработки игры «Эрудит» на языке Java. Конкретно был изложен принцип работы программы в целом, описание каждого из классов программы и обоснование создания пакетов в проекте (для более точной структуры и понимания программы). Подводя итоги, можно вновь перечислить основные задачи классов в программе.

  1.  Класс Task – ввод библиотек, основное описание принципа работы программы
  2.  Класс TaskStorage – чтение текстового файла, хранилище вопросов
  3.  Класс TestItem – проверка правильного ответа
  4.  Класс TestManager – управление работы программы, печатает вопрос
  5.  Класс MainUI – первая форма
  6.  Класс SuccessStage – вывод заработка
  7.  Класс TasksViewStage – вывод вопроса


  1.  МЕТОДИКА ОТЛАДКИ ПРОГРАММЫ

Отладка программы – этап разработки компьютерной программы, на котором обнаруживают, локализуют (определяют оператор программы, выполнение которого вызвало нарушение нормального вычислительного процесса) и устраняют ошибки. Всего при отладке программы могут быть выявлены три типа ошибок: ошибки компоновки (проблемы при разрешении внешних ссылок), ошибки выполнения («зависание» компьютера, ошибки, обнаруженные операционной системой, утечка памяти и т.д.) и синтаксические ошибки (ошибки в тексте программы, связанные с синтаксисом языка). Использование при разработке программы языков программирования высокого уровня, к числу которых относится язык Java, обычно упрощает отладку, поскольку в них содержится механизм, реагирующий на ошибки выполнения. Для отладки программы используется интегрированная среда разработки. При разработке интеллектуальной игры «Эрудит» я использовал среду разработки Intellij IDEA Community Edition 12.1.2, который нам также нужен для компиляции кода и работы с графическим интерфейсом JavaFX.

В данной разработке игрового приложения существует цикл, состоящий из нескольких частей:

  1.  Написание программы (создание исходного кода программы, его доработка, внесение новой функциональности)
  2.  Тестирование программы (запуск программы в Intellij IDEA Community Edition 12.1.2)
  3.  Отладка программы (обнаружение причины ошибок, допущенных при написании программы)
  4.  Исправление выявленных ошибок в программе (устранение ошибок в программе путем доработки исходного кода программы)
  5.  Повторное тестирование программы (повторный запуск программы в Intellij IDEA Community Edition 12.1.2).

4.1 Результаты работы программы

Рисунок 4 – стартовое окно игры «Эрудит»

Рисунок 5 – окно заданий игры «Эрудит»

Рисунок 6 – окно выигрыша в игре «Эрудит»

При запуске программы в Intellij IDEA Community Edition 12.1.2 появляется новое окно, в котором выводятся результаты работы программы.


  1.  JAR-СБОРКА И СОЗДАНИЕ ИНСТАЛЯЦИОННОГО ПАКЕТА

Первоочередная задача – создание инсталляционного пакета для того, чтобы пользователь мог установить игру «Эрудит». Перед тем, как создать инсталляционный пакет, нужно собрать проект в файл формата jar. Jar файл представляет собой обычный архив, в котором содержится программа на языке Java.

5.1 Jar-сборка проекта

Чтобы JAR файл был исполняемым, он должен содержать файл MANIFEST.MF в пакете META-INF, в котором должен быть указан главный класс программы (такой класс должен содержать метод main). Номер версии JAR задаётся параметром Manifest-Version и является обязательным. В процессе разработки приложения был создан данный файл, в котором была указана версия (1.0) и главный класс программы (MainUI).

Также jar-файл показывает явление кроссплатформенности языка программирования Java, так как этот файл можно запускать в других операционных системах.

Цикл jar-сборки проекта:

1. Создаем артефакт во вкладке Output Layout подраздела Artefacts (раздел Project Structure), задаем ему имя.

2. Во вкладке Java FX указываем заголовок, автора и класс, запускающий приложение.

3. Собираем проект (Build – Build Artefacts – Build)

Рисунок 7 – создание артефакта для jar-сборки

Рисунок 8 – конечный этап jar-сборки

Jar-файл сохранился в out директории приложения (папка artefacts).

5.2 Создание инсталляционного пакета приложения

Цикл создания инсталляционного пакета:

  1.  Открываем программу Inno Setup 5.5.4.
  2.  Создаем новый сценарий.
  3.  Указываем название программы, ее версию.
  4.  Указываем название произвольной папки, в которую устанавливается приложение, и путь к папке.
  5.  Добавляем в инсталлятор собранный jar-файл.
  6.  Указываем название программы в стартовом меню и добавляем пункт создания анинсталлера приложения.
  7.  Выбираем язык в установщике (русский).
  8.  Выбираем путь сохранения инсталляционного пакета
  9.  Запускаем приложение

После создания инсталляционного пакета программа показывает скрипт файла установки приложения. На этом цикл создания инсталляционного пакета завершается. Далее запускаем созданный инсталляционный пакет и устанавливаем игру «Эрудит».

Рисунок 9 – создание сценария в Inno Setup 5.5.4.

Рисунок 10 – добавление названия программы в Inno Setup 5.5.4.

Рисунок 11 – определение произвольной папки для установки приложения в Inno Setup 5.5.4.

Рисунок 12 – добавление собранного проекта в Inno Setup 5.5.4.

Рисунок 13 – добавление названия программы в меню инсталляционного пакета в Inno Setup 5.5.4.

Рисунок 14 – определение пути сохранения инсталляционного пакета в Inno Setup 5.5.4.

Рисунок 15 – скрипт инсталляционного пакета в Inno Setup 5.5.4.


6. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

Выбор пункта меню в интеллектуальной игре «Эрудит» осуществляется путем использования компьютерной мыши. Также можно перемещаться по пунктам приложения с помощью стрелок клавиатуры.

При запуске игры «Эрудит» появится первое диалоговое окно. Пользователю будет дана возможность начать игру, нажав мышью или клавишей Enter кнопку «Начать» и выйти из игры, нажав кнопку «Выйти».

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

ЗАКЛЮЧЕНИЕ

В данной курсовой работе был описан процесс разработки игры «Эрудит» на языке программирования Java, а именно:

  1.  Процесс постановки задачи на разработку программы в рамках курсовой работы (суть идеи компьютерной игры «Эрудит», обоснованность выбора языка программирования Java для решения задачи, средства, использованные в процессе разработки программы).
  2.  Методы решения задач (описание задач, поставленных в каждом классе программы и методы их решения).
  3.  Описание программы (описание основных операций в классах программы).
  4.  Методика отладки программы (описание процесса отладки программы, цикла разработки приложения, результаты работы программы).
  5.  Сборка проекта (запись проекта в jar-файл и создание инсталляционного пакета).
  6.  Руководство пользователя (инструкция пользования игрой, правила игры, средства ввода данных)

Целевая аудитория игры – подростки 13–16 лет, имеющие потребность в развитии своего кругозора. Игра предназначена на проверку общеобразовательных знаний пользователя.

Подводя итог, можно сделать вывод, что язык программирования Java является наиболее удобным и оптимальным для создания игровых приложений для компьютера. С помощью Java можно также заниматься разработкой приложений под операционную систему для смартфонов и  планшетных компьютеров Android, а также десктопного и серверного программного обеспечения.

СПИСОК ЛИТЕРАТУРЫ

Основная литература

  1.  Тимур Машнин. JavaFX 2.0. Разработка RIA–приложений – БХВ–Петербург, 2012г.
  2.  Кэти Сиерра, Берт Бейтс. Изучаем Java. – Эксмо, 2012г.

Интернет ресурсы

  1.  Создание игры на Java без сторонних библиотек, часть первая [Электронный ресурс] URL: http://habrahabr.ru/post/145433/ (дата обращения: 09.03.2014г.)
  2.  JavaRush – обучение программированию на Java в форме игры квеста. [Электронный ресурс] URL: http://javarush.ru/course.html (дата обращения: 09.04.2014г.)
  3.  Что такое технология Java и каково ее применение? [Электронный ресурс] URL: http://www.java.com/ru/download/faq/whatis_java.xml (дата обращения: 15.04.2014г.)
  4.  "Большая книга интеллектуальных игр и занимательных вопросов для умников и умниц" – Баландин Бронислав Борисович – ЛитМир.net [Электронный ресурс] URL: http://www.litmir.net/br/?b=128688 (дата обращения: 20.03.2014г.)
  5.  Вопросы для викторин [Электронный ресурс] URL: http://pandarina.com/text/questions_for_quiz (дата обращения: 30.05.2014г.)


ПРИЛОЖЕНИЕ А

Схема программы


Приложение А.1 – методы класса MainUI

Приложение А.2 – методы класса TasksViewStage

Приложение А.3 – Методы класса SuccessStage

ПРИЛОЖЕНИЕ Б

Исходный код программы


public Task(String id, String question, List<String> answers, String rightAnswer) {

this.id = id;

this.question = question;

this.answers = answers;

this.rightAnswer = rightAnswer;}

Приложение Б.1 – класс Task

if(answer.endsWith("!!!")) {

answer = answer.replaceAll("!","");

correct = answer;}

……………

if (storage == null) {

storage = new TaskStorage();}

return simpleTasks;

Приложение Б.2 – класс TaskStorage

public boolean isRight() {

if (answer != null && answer.equals(task.getRightAnswer())) {

return true;}

return false;}

Приложение Б.3 – класс TestItem

//проверяем, верный ли ответ дал пользователь

public boolean setAnswer(String answer) {

if (currentIndex >= 0) {

items.get(currentIndex).setAnswer(answer);

}

return  items.get(currentIndex).isRight();}

//возвращаем следующий вопрос для вывода на экран

public TestItem nextItem() {

if (currentIndex == items.size() – 1) {

return null; //если текущий вопрос был последним возвращаем null

}

return items.get(++currentIndex);

}

public String getSuccess() {

return "Ваш выигрыш составил " + getPrize() + " очков";} //вывод выигрыша на экран

………………

private String getPrize() { //расчет выигрыша

if(isExitOnError == false) {

return prizeMapping.get(currentIndex);      //если все ответы правильные  – приз согласно prizeMapping

} else {

int index = currentIndex/5;

index = index * 5;

return prizeMapping.get(index);}}

Приложение Б.4 – класс TestManager

HBox hbox = new HBox();

hbox.getChildren().addAll(exitButton, goButton);

hbox.setPadding(new Insets(5, 5, 5, 5)); //формируем горизонтальную панель и кладем на нее две объявленные кнопки

BorderPane root = new BorderPane();

Scene scene = new Scene(root);

primaryStage.setScene(scene);

root.setBottom(hbox); //помещаем полученную панель на наш главный виджет

…………

private void handleGoButton() { //обработчик нажатия кнопки

final TasksViewStage stage = new TasksViewStage(new TestManager());

stage.show();//показываем окно с вопросами

stage.setMinWidth(stage.getWidth());

stage.setMinHeight(stage.getHeight());

this.primaryStage.close();}//закрываем текущее окно

public static void main(String[] args) {

launch(args);} //запуск первого окна

Приложение Б.5 – класс MainUI

VBox vbox = new VBox();

vbox.setPadding(new Insets(10, 10, 10, 10));

vbox.getChildren().addAll(prizeLabel, okButton)

BorderPane root = new BorderPane(); //вертикальное расположение текста с выигрышем и кнопки "ОК"

Scene scene = new Scene(root);

setScene(scene); //запускаем JavaFX

Приложение Б.6 – класс SuccessStage

Label question = new Label();

Button exitButton = new Button("Завершить игру");

Button nextButton = new Button("Ответить");

ToggleGroup answerGroup = new ToggleGroup();

List<RadioButton> answerButtons = new ArrayList<RadioButton>();

VBox answerBox = new VBox();//вывод на экран нового вопроса

…………

if (result == true) {

TestItem item = tm.nextItem(); //если больше вопросов нет – значит мы ответили на все вопросы

if (item == null) {

new SuccessStage(tm).show();

this.close();

return;} // выходим и выводим выигрыш

for (RadioButton rb : answerButtons) {

answerBox.getChildren().remove(rb);}

answerButtons.clear(); //если вопросы еще есть обновляем окно новым вопросом         

…………

} else {

tm.setExitOnError();

new SuccessStage(tm).show();

this.close();}//если ответ неправильный завершаем игру и выводим выигрыш на экран

…………

List<String> answers = item.getTask().getAnswers();

Collections.shuffle(answers);   //делаем рандомный вывод возможных ответов на экране

for (String str : answers) {

RadioButton rb = new RadioButton(str);

answerButtons.add(rb);

}

Приложение Б.7 – класс TasksViewStage


ПРИЛОЖЕНИЕ В

Пример сгенерированной документации


Приложение В.1 – Сгенерированная документация класса TasksViewStage

Приложение В.2 – Сгенерированная документация класса MainUI


 

А также другие работы, которые могут Вас заинтересовать

97. Исследование электрических цепей при переходных процессах первого и второго родов 699.5 KB
  Составляем схему свободной составляющей и определяем корень характеристического уравнения. Составляем выражение для входного сопротивления и график на основе математических расчётов.
98. Особенности строительства новой современной железной дороги 570 KB
  Проектирование организации строительства новой железнодорожной линии. Характеристика района строительства искусственных сооружений. Составление схемы участка и распределения объемов работ.
99. Розробка двосекційного шестеренного насосу 600 KB
  Установка, що спрямована на створення ізоляційного шару на будь-яких поверхнях і будь-якої складності конфігурації поверхні. Не відмінною перевагою установки є простота, як у її використанні, так й у готуванні робочого середовища.
100. Проектирование электрической части ТЭЦ 628.5 KB
  Расчет токов короткого замыкания, выбор аппаратов и токоведущих частей схемы ТЭЦ. Выбор аппаратов и токоведущих частей электроустановок. Определение расчетной мощности для выборов трансформаторов связи с системой.
101. Создание синтетических финансовых инструментов. Трансформирование инструментов 768.92 KB
  Создание синтетических форвардного и фьючерсного контрактов. Трансформирование сроков погашения инвестиций. Практическое применение исследуемых методов и стратегий. Трансформирование обязательств с плавающей ставкой.
102. Расчет строительства жилого помещения и его энергосбережение 309 KB
  Эффективность действия отопительных установок обеспечивается путём оптимизации проектных решений с применением ЭВМ, придания установке надежности в эксплуатации автоматического поддержания необходимой температуры теплоносителя.
103. Санітарно-гігієнічні вимоги до планування, благоустрою, експлуатації загальноосвітніх шкіл 174 KB
  Більшість дітей дотримуються тих гігієнічних вимог, що є необхідними для даного віку. Гігієнічна оцінка фізичного розвитку і стану здоров`я учнів. Складання плану гігієнічного виховання учнів класу.
104. Организация работ по строительству производственного цеха по ремонту механизмов 827.5 KB
  Определение продолжительности строительства, объёмов и трудоёмкости работ. По конструктивному решению здание представляет собой рамную, каркасную конструкцию. Прямые затраты на выполнение проекта.
105. Технические характеристики электропогружчиков логистического предприятия 339 KB
  Определение потребности в ресурсах при проведении работ по разгрузке и приемке товара. Выводы по состоянию охраны труда на предприятии и предложения по улучшению организации службы охраны труда. Напольное, стеллажное и мелкоячеистое хранение.