Пояснительная записка Кафедра пмик допустить к защите зав кафедрой: проф., д т. н



Дата11.04.2017
Размер2.26 Mb.
Просмотров155
Скачиваний1
ТипПояснительная записка

Студент

Пониматко Игорь Валерьевич

/ /










Факультет

ИВТ

Группа

ПБТ-31




Руководитель

Ситняковская Елена Игоревна

/ /
































ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА БАКАЛАВРА

Разработка игрового обучающего мобильного приложения "Системы счисления"
Пояснительная записка

Кафедра ПМиК

Допустить к защите

зав. кафедрой: проф., д.т.н.


______________________ Фионов А.Н.

Федеральное агентство связи

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

высшего образования

«Сибирский государственный университет телекоммуникаций и информатики»

(СибГУТИ)

Новосибирск 2016 г.

СОДЕРЖАНИЕ





Введение 3

1Описание предметной области 5

2Постановка задачи 7

3Средства разработки 9

3.1Android 9

3.2Android Studio 10

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

4Обзор существующих аналогов. 12

5Проектирование и разработка приложения. 13

5.1Проектирование интерфейса 13

5.2Реализация приложения 16

6Руководство по использованию. 25

7Тестирование 30

Заключение. 31

Список использованных источников 33

Приложение 1. 34

Программный код функции перевода числа 34

Приложение 2. 35

Программный код функции заполнения массива цифрами. 35

Приложение 3. 38

Программный код функции btnclick. 38



Введение


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

Количество продаваемых устройств постоянно растет и смартфон уже стал неотъемлемой частью повседневной жизни многих современных людей.

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

Список функций, поддерживаемых современными мобильными устройствами, постоянно увеличивается. Это заслуга не только производителей устройств, но и разработчиков, которые создают приложения. Если устройство не содержит какого-то функционала, необходимого конкретному пользователю, этот функционал может быть получен путем скачивания необходимого приложения.

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

В настоящее время на рынке мобильных устройств представлены смартфоны, работающие на различных операционных системах, лидерами среди которых являются iOS, Android и Windows Phone. Наиболее популярной является операционная система Android для портативных устройств, о чем свидетельствуют данные о посещаемости интернет ресурсов с мобильных устройств [3], представленные в таблице 1.


Таблица 1 – Анализ посещаемости интернет ресурсов.

Период

Android

iOS

Windows Phone

SymbianOS

Август 2016

74,6 %

22,4 %

2,2 %

0,8 %

Сентябрь 2016

74,6 %

22,7 %

2 %

0,7 %

Октябрь 2016

75 %

22,4 %

2 %

0.6 %

Исходя из этих данных, можно сказать о востребованности аппаратов под ОС Android и актуальности разработки новых различных приложений для этой ОС.

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

Во введении происходит знакомство с направленностью темы и актуальностью разработки на выбранной платформе.

Первый раздел знакомит нас с самой идеей поднятой темы и ее практической значимостью.

Во втором разделе, рассматривается преследуемая цель и функциональные требования.

Третий раздел рассказывает о среде разработки, используемых языках программирования.

В четвертом разделе рассматриваются найденные аналоги и их возможности.

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

Шестой раздел - руководство и взаимодействие с пользователем.

В седьмом разделе рассказано о конечном тестировании и итоговой отладке продукта.

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

В трех приложениях приводится программный код, для ознакомления:


  • перевода числа из 10 системы счисления,

  • заполнения массива,

  • игрового процесса.


1Описание предметной области


Задача перевода чисел из одной системы счисления в другую на практике встречается довольно часто. Например, при программировании на Ассемблере для получения адреса ячейки памяти, часто необходимо преобразовать из десятичной записи в двоичную или шестнадцатеричную. В качестве другого примера можно привести методику увеличения скорости вычислений, когда числа представляются в двоичной системе счисления. Это полезно для умножения в двоичной системе счисления, т.к. чтобы ускорить нахождение результата, достаточно сдвинуть один из операндов в двоичном виде влево. При этом, сдвиг в лево должен быть осуществлен на такое число позиций, в котором стоит единица во втором операнде. Что касается использования шестнадцатеричной системы счисления, то здесь можно указать некоторые стандартные процедуры Паскаля и Си, где для подачи параметров требуется представление числа в этой системе (достаточно экономный по отношению к другим используемым системам). Отсюда можно сделать вывод, что перевод чисел из одной системы счисления в другую важен в практических приложениях.

Приведем наиболее распространенные методы перевода чисел из одной системы в другую.



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

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

  3. Перевод из произвольной позиционной системы в десятичную. Осуществляется путем умножения цифр записи, переведенных в десятичную систему на соответствующие степени основания с дальнейшим суммированием результатов.

  4. Перевод в системах с основаниями, являющимся степенями двойки, может быть осуществлен без промежуточных вычислений в десятичной системе. Например, для перевода из двоичной системы в шестнадцатеричную, двоичная запись разбивается на тетрады (при этом в старшие разряды добавляется необходимое количество нулей). Полученные тетрады преобразуются в соответствующие цифры шестнадцатеричной системы, которые записываются в том же порядке и образуют искомую запись исходного числа. Аналогично (с соответствующими поправками на степень) можно перевести из двоичной системы в любую другую, являющуюся степенью двойки и обратно.

2Постановка задачи

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



Целью дипломной работы является разработка мобильного приложения в виде тренажера по теме «Системы счисления» в форме игрового приложения под Android.
Для достижения цели поставлены следующие задачи:

  • рассмотреть доступные инструменты разработки для реализации тренажера;

  • сформулировать концепцию тренажера, формат его взаимодействия с пользователем;

  • разработать приложение;

  • протестировать приложение.

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



  • Интуитивность и простота в использовании без какого-либо обучения.

  • Графический интерфейс, который должен обладать интуитивно понятным управлением.

  • Надёжность и эффективность системы в целом.

  • Возможность работы на всех современных версиях ОС Android, версии от API(24) 4.4. и выше.

  • Хорошая производительность и быстродействие.

  • Рациональное энергопотребление и простая графика.

  • Исходной системой счисления должна являться десятеричная.

  • Должно уметь работать с системами счисления от двоичной до шестнадцатеричной, за исключением исходной.

  • Иметь несколько режимов игры: «На внимательность» и «На время».

  • В режиме «На время» при правильных решениях общее количество оставшегося времени должно увеличиваться на 5 секунд.

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


Новизна
заключается в том, что под ОС Android на данный момент не разрабатывались аналогичные приложения.

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


3Средства разработки

3.1Android


Создатель Android Энди Рубин следующим образом характеризует его [1]: Android — «Первая действительно открытая и всеобъемлющая платформа для мобильных устройств и любого программного обеспечения, предназначенного для работы на мобильном телефоне, при этом без патентных ограничений, которые сдерживали развитие портативных устройств».

Упрощенно Android можно представить, как взаимосвязь компонентов:



  • свободной операционной системы с открытыми исходными кодами;

  • среды разработки с открытыми исходными кодами для создания мобильных приложений;

  • устройств, на которых установлена ОС Android.

Согласно документации Android включает следующие взаимозависимые элементы [2]:

  • референс-дизайн аппаратного обеспечения с перечнем требований к мобильным устройствам, чтобы гарантировать совместимость с ПО;

  • ядро операционной системы Linux, которое предоставляет низкоуровневый интерфейс для управления аппаратным обеспечением, памятью и процессами, оптимизированными для работы на мобильных устройствах;

  • библиотеки с открытыми исходными кодами, предназначенными для разработки приложений SQLite, WebKit, OpenGL и медиа-менеджер;

  • среду исполнения для приложений, включающую виртуальную машину Dalvik и библиотеки ядра, а начиная с версии Android 4.4 есть альтернатива выбора другой виртуальной машины ART. Среда исполнения отличается небольшим размером, что позволяет эффективно использовать ее на мобильных устройствах;

  • набор программных компонентов, обеспечивающих доступ к системным службам на уровне приложений;

  • среди них менеджер окон и менеджер местоположения, контент - провайдеры, возможности работы с телефонией и сенсорным дисплеем;

  • набор компонентов пользовательского интерфейса для размещения и запуска приложений;

  • предустановленные приложения, поставляемые в общем программном наборе; комплект программ для разработки приложений, включающий инструменты, плагины и справочную документацию


3.2Android Studio


Для разработки приложения используется среда Android Studio. Данная среда вышла относительно недавно, в 2013 году и базируется на платформе Intellij IDEA от компании JetBrains, интеллектуальный интерфейс которой является очень удобным. Бинарные сборки существуют для Linux, Mac OS X и Windows. Среда дает возможность разрабатывать приложения не только для смартфонов и планшетов, но и для носимых устройств на базе Android Wear, очков Google Glass, автомобильных информационно-развлекательных систем (Android Auto) и телевизоров (Android TV). Для приложений изначально разрабатываемых с использованием Eclipse и ADT Plugin подготовлен инструмент для автоматического импорта существующего проекта в Android Studio. На рисунке 3.1 представлен интерфейс приложения.

Рисунок 3.1 – Интерфейс приложения.


На рисунке 3.2 представлена возможность тестирования программ на совместимость с различными версиями платформы приложений, работающих на устройствах с различными разрешениями экрана.

Помимо возможностей, присутствующих в Intellij IDEA, в Android Studio есть ряд дополнительных возможностей [4]:



  • унифицированная подсистема сборки, тестирования и развертывания приложения с помощью Gradle;

  • интегрированная поддержка оптимизатора кода ProGuard с встроенными средствами генерации цифровой подписи;

  • интерфейс для управления переводами на другие языки.


Рисунок 3.2 – Тестирование программ на различных устройствах.


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


Основным языком разработки приложений под Android является Java. Java — объектно-ориентированный язык программирования разработанный компанией Sun. Главным плюсом данного языка является то, что приложение транслируется в байт-код, который можно запустить на любой Java-машине вне зависимости от архитектуры железа. Так же преимущества языка Java заключается в привычном синтаксисе C/C++ и в прозрачности модели безопасности, что дает ориентацию на Internet задачи, сетевые приложения. Средством разработки приложений является jdk, которое не содержит никаких текстовых редакторов, а работает только с java-файлами. Для компиляции приложений есть утилита под названием Java compiler. В случае с Android все приложения запускаются на виртуальной машине Dalvik, а с версии Android 4.4 появилась возможность запуска приложений на виртуальной машине ART. Вся компиляция приложений использует инструмент SDK, который разработала компания Google.

4Обзор существующих аналогов.


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

В результате поиска подобных приложений для мобильных устройств было найдено только одно, работающее под операционной системой iOS. Оно называется 10101100 и на рисунке 4.1 показан интерфейс данного приложения[5]. Как можно заметить, в данном приложении есть только режим перевода чисел из десятичной системы в двоичную и нет режима в котором можно было бы не торопясь закрепить навыки перевода чисел из одной системы в другую.


Рисунок 4.1 – Аналог приложения на iOS.


Аналогичных приложений работающих под ОС Android найти не удалось.

5Проектирование и разработка приложения.

5.1Проектирование интерфейса


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

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

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

  3. Поле среднего размера, 5х5 клеток. Позволяет разместить на поле несколько вариантов решения в зависимости от представленной задачи, минимизировать рассеяности внимания пользователя для поиска оптимального решения, а так же отсутствие излишних трудозатрат устройства.

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


На основе функциональных требований были выделены необходимые страницы. Для каждой страницы были определены необходимые элементы интерфейса, кнопки и меню.
Описание интерфейса приложения:

  1. После запуска приложения появляется меню выбора основания системы счисления (рисунок 5.1).


Рисунок 5.1 – Меню выбора системы счисления.




  1. Меню выбора режима игры (рисунок 5.2):

  1. На время – режим с ограниченным временем на решение одного из примеров.

  2. На внимательность – режим с неограниченным количеством времени на решение одного из примеров.


Рисунок 5.2 – Меню выбора режима игры.




  1. Основной экран игры – поле заполненное массивом знаков в выбранной системе счисления (рисунок 5.3).



Рисунок 5.3 – Основной экран игры.
Данное поле является основной составляющей тренажера, для получения необходимого результата (решения примера), необходимо отметить имеющиеся знаки в определенной последовательности. По мере выполнения примеров сложность постепенно повышается.

5.2Реализация приложения


Визуально тренажер для перевода чисел из одной системы в другую представляет таблицу размерности 5х5, в каждой клетке которой расположена одна цифра. Участнику предлагается число в десятичной записи, а так же разрядность числа в новой системе счисления. Он должен быстро перевести заданное число в необходимую систему счисления с соблюдением указанной разрядности и выделить в этой таблице в нужном порядке соответствующую запись. При этом нужно учитывать, что запись может быть расположена в таблице в форме не самопересекающейся «змейки», в которой каждый следующий разряд расположен рядом с предыдущим по горизонтали или по вертикали.

Перед началом игры участник может выбрать основание системы, в которую будет переводить, а так же один из двух режимов: «на время» и «на внимательность». Для реализации выбора системы счисления были использованы MainActivity (активность) и открываемый из нее layout-файл.

В общем случае Activity (активность) — это потомок класса Activity, который отображает форму приложения и, как правило, занимает весь экран. Чтобы создать активность, ее нужно унаследовать от класса Activity и создать метод onCreate(). Более простыми словами, активность это одна страница браузера, которую в текущий момент просматривается в Интернете. С помощью такой конструкции можно получить пустой экран, который без layout-файла не представляет интереса.
Листинг 5.1 – Класс Activity
public class MainActivity extends Activity {

©Override

public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);

}

}
Layout — это компоновка, или макет отображаемой страницы, которая хранится в формате xml-файла. Такое разделение на layout и активность дает разработчику возможность, не изменяя код, скорректировать внешний вид отображаемой страницы. Таким образом можно регулировать ориентацию и размер экрана, а так же язык интерфейса.

Далее приведен layout-файл (листинг 5.2), который используется для создания главного экрана приложения.


Листинг 5.2 – Layout-файл, главного экрана.
xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_column="0">

<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_gravity="center_horizontal"
android:textAlignment="gravity"
android:inputType="number"
android:ems="10"
android:layout_marginTop="@dimen/abc_action_bar_stacked_tab_max_width"
android:gravity="center"
android:layout_weight="0" />

<Button
android:id="@+id/btnstart"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Далее"
android:layout_gravity="center_horizontal"
android:layout_weight="0" />


LinearLayout>
В данном файле создается линейный layout и два виджета EditText и Button с некоторым параметрами. Главным из данных параметров является имя элемента, которое записывается следующим образом android: id="@+id/ суть которого заключается в возможности вызова в Activity данного layout-файла и его виджетов.

Далее необходимо получить доступ к упомянутому layout-файлу, для чего используется метод setContentView(). Доступ к виджетам Button и EditText производится через программный код, что в конечном итоге приводит к тому, что MainActivity выглядит так, как показано на рисунке 5.4.


Рисунок 5.4 – Виджет MainActivity.

Button — класс, унаследованный от TextView, один из самых распространенных в программировании, используется для получения заданной реакции при нажатии. EditText — это текстовое поле, которое можно редактировать, данный класс наследуется от класса TextView.

Для отображения следующей страницы требуется создать новую активность (options), которая является потомком MainActivity. Для вызова активности (options) с нужными параметрами обрабатывается нажатие кнопки «Далее». При этом создается переменная класса Intent и передается параметр в новую активность (options). Этот параметр (хранящий основание новой системы счисления) считывается из переменной класса EditText.

Intent (намерение) — механизм для совершения какой-либо одной из операций таких как: «отправить письмо», «открыть страницу в браузере» или как в данном случае «открыть новую активность».

При вызове активности (options) появляется окно, содержащее две кнопки «на время» и «на внимательность», которые заранее были созданы в layout- файле новой активности (листинг 5.3). При помощи активности (options), нажав на одну из упомянутых кнопок можно выбрать соответствующий режим тренировки.


Листинг 5.3 – Layout-файл, выбор режима игры.
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<Button
android:id="@+id/btntime"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:text="На время"
android:layout_gravity="center"
android:layout_weight="10" />

<Button
android:id="@+id/btnalert"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:text="Внимательность"
android:layout_gravity="center"
android:layout_weight="0" />


LinearLayout>

Для создания активности «на время» (notation) или «на внимательность» (alert) необходим layout-файл, где основным компонентом является табличный layout. Далее программно создается двумерный массив кнопок размерности 5х5. Помимо этого используются переменные класса TextView для отображения случайного числа, которое нужно перевести, разрядов вводимого ответа, а так же суммарного результата и таймера.

TextView — один из самых распространенных виджетов, позволяющий отображать текст, без права редактирования пользователем.

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

На рисунке 5.4 представлен пример заполнения матрицы в двоичной системе счисления.

Пользователю нужно найти в данной матрице число 24, при переводе в двоичную систему запись которого имеет вид 11000. Матрица была сгенерирована таким образом, что в ней имеется несколько правильных решений. Например, последовательный ввод ячеек с адресами (1,4);(0,4);(0,3);(0,2);(0,1) или (1,1);(1,0);(2,0);(3,0);(4,0) будут правильными ответами для этой задачи.



Рисунок 5.4 – Заполнение массива в двоичной системе счисления.

На рисунке 5.5 представлен пример заполнения матрицы в восьмеричной системе счисления.

Пользователю нужно найти в данной матрице число 1180, при переводе в восьмеричную систему запись которого имеет вид 2234. Матрица была сгенерирована таким образом, что в ней имеется единственное правильное решение. Последовательный ввод ячеек с адресами (1,3);(2,3);(3,3);(3,4) будет правильным решением для этой задачи.


Рисунок 5.5 – Заполнение массива в восьмеричной системе счисления.


На рисунке 5.6 представлен пример заполнения матрицы в шестнадцатеричной системе счисления.

Пользователю нужно найти в данной матрице число 28896, при переводе в восьмеричную систему запись которого имеет вид 70Е0. Матрица была сгенерирована таким образом, что в ней имеется два варианта правильного решения. Последовательный ввод ячеек с адресами (2,0);(3,0);(4,0);(4,1) либо (2,0);(3,0);(3,1);(4,1) будет являться правильным решением для этой задачи.



Рисунок 5.6 – Заполнение массива в шестнадцатеричной системе счисления.


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

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

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

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

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

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


Листинг 5.4 – всплывающее окно AlertDialog.
public void onFinish() {
Context context = Activity_notation.this;
txt1[2].setText("0");
String title = "Выберите дальнейшее действие";
String btnstr1 = "Выбрать С.С.";
String btnstr2 = "Начать заново";
ad = new AlertDialog.Builder(context);
ad.setTitle(title);
ad.setPositiveButton(btnstr1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
strvib = "time";
perehod();
}
}).setNegativeButton(btnstr2, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
strvib = "alert";
perehod();
}
});
ad.setCancelable(true);
ad.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
strvib = "exit";
}
});
ad.show();
}

6Руководство по использованию.


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

Рисунок 6.1 – Выбор системы счисления.


При подтверждении выбора (нажатии кнопки «Далее») пользователь попадает в следующее меню, где ему необходимо выбрать один из режимов игры (рисунок 6.2). После чего открывается основное окно игры.

Рисунок 6.2 – Выбор режима.


Режим на внимательность - пользователю предоставляется поле размером 5х5 клеток заполненных определенным массивом знаков (в двоичной системе счисления это 0 и 1), число в десятичной системе счисления(которое и необходимо перевести в новую систему счисления) и разрядность числа в новой системе счисления (рисунок 6.3).

Рисунок 6.3 – Описание содержимого основного экрана игры.


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

Рисунок 6.4 – Пример решения.


Режим на время – существенным отличием от предыдущего режима является ограниченное время выдаваемое пользователю на решение одной задачи. Изначально дается 20 секунд на нахождение правильного ответа, за каждый верный ответ добавляется по 5 секунд к оставшемуся времени. По истечению времени пользователю предлагается начать заново или же изменить систему счисления (рисунок 6.5). Данный режим будет интересен опытным пользователям, которые освоили быстрый счет в уме, а так же в соревновательных целях с друзьями.

Рисунок 6.5 – Меню при завершении времени, в режиме «на время».



7Тестирование


Тестирование приложения это один из важных этапов, на котором проверяется общая стабильность программы, выявляются различные ошибки при вычислениях и т.д. при работе приложения на реальных задачах.

За основу для тестирования разработанного приложения был взят эмулятор устройства Samsung Galaxy Note 5. Версия API для данного устройства 4.4., которая называется KitKat. Так же было произведено тестирование на всех современных версиях ОС, таких как Lollipop(5.0), Lollipop(5.1), Marsmallow(6.0).

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

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


Заключение.


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

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

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

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

В результате разработки приложения были получены навыки программирования на языке Java с использованием среды разработки Android Studio. Был получен опыт разработки мобильных приложений для устройств под управлением ОС Android

Самым трудоемким этапом разработки стал алгоритм, гарантирующий наличие в исходной матрице как минимум одного решения (приложение 2, листинг 2.1).

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

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

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

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



Список использованных источников





  1. Official Google Blog: Wheres my Gphone? [Электронный ресурс]. - https://googleblog.blogspot.ru/2007/11/wheres-my-gphone.html

  2. Рето Майер. Android 2, Программирование приложений, для планшетных компьютеров и смартфонов. / Рето Майер. — Москва : [б. и.], 2011.— 670 с

  3. Статистика сайта «Сайты рунета» [Электронный ресурс]. — URL: http://www.liveinternet.ru/stat/ru/oses.html?slice=mobile

  4. OpenNews: Релиз свободной среды разработки Android Studio 1.0 [Электронный ресурс]. — URL: http://www.opennet.ru/opennews/art.shtml?num=41218

  5. Магазин электронных приложений для мобильных устройств Apple [Электронный ресурс]. — URL: https://itunes.apple.com/ru/app/10101100/id909071508?l=en&mt=8



Приложение 1.

Программный код функции перевода числа


Листинг 1.1 – Функция perevch
private String perevch(int a, int b) {
String str = "";
String str1 = "";
int c = 0;
while (a >= b) {
c = a % b;
if (c < 10) {
str += Integer.toString(c);
} else {
if (c == 10) str += "A";
else if (c == 11) str += "B";
else if (c == 12) str += "C";
else if (c == 13) str += "D";
else if (c == 14) str += "E";
else if (c == 15) str += "F";
}
a /= b;
}
if (a < 10) {
str += Integer.toString(a);
} else {
if (a == 10) str += "A";
else if (a == 11) str += "B";
else if (a == 12) str += "C";
else if (a == 13) str += "D";
else if (a == 14) str += "E";
else if (a == 15) str += "F";
}
for (int i = str.length() - 1; i >= 0; i--) {
str1 += str.charAt(i);
}
return str1;
}


Приложение 2.

Программный код функции заполнения массива цифрами.


Листинг 2.1 – Функция array_bool
private void array_bool(int a) {
ArrayList varchar = new ArrayList();
int x;
int y;
int cons;
String str3 = "";
number++;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
buttons[i][j].setBackgroundResource(R.drawable.button_base);
buttons[i][j].setTextColor(Color.BLACK);
}
for (int i = 0; i < n + 2; i++) {
for (int j = 0; j < m + 2; j++) {

if (i == 0 || i == n + 1 || j == 0 || j == m + 1) b[i][j] = true;
else
b[i][j] = false;
}
}
result = (int) Math.pow(notation, a);
result = (int) (Math.random() * result);
int kolpr = 0;
bin_str = perevch(result, notation);
if (bin_str.length() < a) {
str = "";
for (int i = 0; i < a - bin_str.length(); i++) {
str += "0";
}
str += bin_str;
bin_str = str;
str = "";
}
x = (int) (Math.random() * n);
y = (int) (Math.random() * m);
int kol = 1;
str = "";

txt[0].setText(Integer.toString(result));
for (int i = 0; i < bin_str.length(); i++) {
str += "- ";
}
txt[1].setText(str);
str = "";
str3 += bin_str.charAt(0);
buttons[x][y].setText(str3);
str3 = "";
b[x + 1][y + 1] = true;
while (kol != bin_str.length()) {
cons = (int) (Math.random() * 4);
if (b[x][y + 1] == true && b[x + 2][y + 1] == true && b[x + 1][y] == true && b[x + 1][y + 2] == true && !stack1.isEmpty()) {
kolpr = 0;
for (int u = stack1.size(); u >= 0; u -= 2) {
x = stack1.get(u - 2);
y = stack1.get(u - 1);
if (b[x][y + 1] == true && b[x + 2][y + 1] == true && b[x + 1][y] == true && b[x + 1][y + 2] == true && !stack1.isEmpty()) {
kolpr += 2;
} else {
u = -1;
}
}
for (int u = 0; u < kolpr; u += 2) {
int x2, y2;
x2 = stack1.get(stack1.size() - 2) + 1;
y2 = stack1.get(stack1.size() - 1) + 1;
b[x2][y2] = false;
buttons[x2 - 1][y2 - 1].setText("");
stack1.remove(stack1.size() - 1);
stack1.remove(stack1.size() - 1);
x = stack1.get(stack1.size() - 2);
y = stack1.get(stack1.size() - 1);
}
kol -= (kolpr / 2);
} else if (cons == 0 && x != 0 && b[x][y + 1] == false) {
x = x - 1;
str3 += bin_str.charAt(kol);
buttons[x][y].setText(str3);
str3 = "";
b[x + 1][y + 1] = true;
kol = kol + 1;
stack1.add(x);
stack1.add(y);
} else if (cons == 1 && x != n - 1 && b[x + 2][y + 1] == false) {
x++;
str3 += bin_str.charAt(kol);
buttons[x][y].setText(str3);
str3 = "";
b[x + 1][y + 1] = true;
kol++;
stack1.add(x);
stack1.add(y);
} else if (cons == 2 && y != 0 && b[x + 1][y] == false) {
y--;
str3 += bin_str.charAt(kol);
buttons[x][y].setText(str3);
str3 = "";
b[x + 1][y + 1] = true;
kol++;
stack1.add(x);
stack1.add(y);
} else if (cons == 3 && y != m - 1 && b[x + 1][y + 2] == false) {
y++;
str3 += bin_str.charAt(kol);
buttons[x][y].setText(str3);
str3 = "";
b[x + 1][y + 1] = true;
kol++;
stack1.add(x);
stack1.add(y);
}
//}

}
varchar.add("0");
varchar.add("1");
varchar.add("2");
varchar.add("3");
varchar.add("4");
varchar.add("5");
varchar.add("6");
varchar.add("7");
varchar.add("8");
varchar.add("9");
varchar.add("A");
varchar.add("B");
varchar.add("C");
varchar.add("D");
varchar.add("E");
varchar.add("F");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (b[i + 1][j + 1] == false) {
b[i + 1][j + 1] = true;
x = (int) (Math.random() * notation);
for (int h = 0; h < notation; h++) {
if (h == x) {
buttons[i][j].setText(varchar.get(h));
}
}
}
}
}

Приложение 3.

Программный код функции btnclick.


Листинг 3.1 – Функция btnclick
private void btnclick(int i, int j) {
//txt[4].setText(bin_str);
if (b[i + 1][j + 1]) {
String str1 = txt[1].getText().toString(), str2 = "";
if (stack2.isEmpty()) {
stack2.add(i);
stack2.add(j);
b[i + 1][j + 1] = false;
buttons[i][j].setBackgroundResource(R.drawable.fon);
buttons[i][j].setTextColor(Color.WHITE);
str += buttons[i][j].getText();
for (int h = 0; h < str.length(); h++) {
str2 += str.charAt(h) + " ";
}
for (int h = 0; h < category - str.length(); h++) {
str2 += "- ";
}
txt[1].setText(str2);
str2 = "";
} else {
if (provcoordinate(i, j)) {
stack2.add(i);
stack2.add(j);
b[i + 1][j + 1] = false;
buttons[i][j].setBackgroundResource(R.drawable.fon);
buttons[i][j].setTextColor(Color.WHITE);
str += buttons[i][j].getText();
str2 = "";
for (int h = 0; h < str.length(); h++) {
str2 += str.charAt(h) + " ";
}
for (int h = 0; h < category - str.length(); h++) {
str2 += "- ";
}
txt[1].setText(str2);
str2 = "";
if (str.equals(bin_str)) {
score += Integer.parseInt(bin_str, notation);
txt[3].setText(Integer.toString(score));
Toast.makeText(this, "Next", Toast.LENGTH_SHORT).show();
//txt[2].setText("0");
stack2.clear();
if (number % 5 == 0)
category++;
for (int e = 0; e < n + 2; e++)
for (int w = 0; w < m + 2; w++)
b[e][w] = true;
for (int e = 0; e < n; e++)
for (int w = 0; w < m; w++)
buttons[e][w].setText("");
counttim = Integer.parseInt(txt1[2].getText().toString() + "000") + 5000;
tim.cancel();
txt1[2].setText("");
tim = new CountDownTimer(counttim, 1000) {
public void onTick(long millisUntilFinished) {
txt1[2].setText("" + (millisUntilFinished / 1000));
}

public void onFinish() {
Context context = Activity_notation.this;
txt1[2].setText("0");
String title = "Выберите дальнейшее действие";
String btnstr1 = "Выбрать С.С.";
String btnstr2 = "Начать заново";
ad = new AlertDialog.Builder(context);
ad.setTitle(title);
ad.setPositiveButton(btnstr1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
strvib = "time";
perehod();
}
}).setNegativeButton(btnstr2, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
strvib = "alert";
perehod();
}
});
ad.setCancelable(true);
ad.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
strvib = "exit";
}
});
ad.show();
}

};
tim.start();


array_bool(category);
} else {
if (str.length() == bin_str.length()) {
score -= (Integer.parseInt(bin_str, notation) / 2);
txt[3].setText(Integer.toString(score));
for (int e = 0; e < n; e++)
for (int w = 0; w < m; w++) {
buttons[e][w].setBackgroundResource(R.drawable.button_base);
buttons[e][w].setTextColor(Color.BLACK);
}
for (int e = 0; e < n + 2; e++)
for (int w = 0; w < m + 2; w++)
b[e][w] = true;
str = "";
for (int e = 0; e < category; e++) {
str += "- ";
}
stack2.clear();
txt[1].setText(str);
str = "";
Toast.makeText(this, "Wrong", Toast.LENGTH_SHORT).show();
}
}
}
}
} else {
if (i == stack2.get(stack2.size() - 2) && j == stack2.get(stack2.size() - 1)) {
String str1 = txt[1].getText().toString(), str2 = "";
buttons[i][j].setBackgroundResource(R.drawable.button_base);
buttons[i][j].setTextColor(Color.BLACK);
b[i + 1][j + 1] = true;
stack2.remove(stack2.size() - 1);
stack2.remove(stack2.size() - 1);
int pr = 0;
str2 = "";
for (int h = 0; h < str.length() - 1; h++) str2 += str.charAt(h);
str = str2;
str2 = "";
for (int h = 0; h < str.length(); h++) {
str2 += str.charAt(h) + " ";
}
for (int h = 0; h < category - str.length(); h++) {
str2 += "- ";
}
txt[1].setText(str2);
}
}
}


Поделитесь с Вашими друзьями:


База данных защищена авторским правом ©nethash.ru 2017
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал