close

Вход

Забыли?

вход по аккаунту

Бушев Андрей Альбертович. Разработка программного обеспечения системы автоматизации проведения интеллектуальных игр

код для вставки
АННОТАЦИЯ
ВКР 79 с., 22 рис., 2 табл., 22 источника, 1 прил.
АВТОМАТИЗАЦИЯ,
ЧАТ
–
БОТ,
WEB-ПРИЛОЖЕНИЕ,
ИГРЫ,
ИНТЕЛЛЕКТУАЛЬНЫЕ ИГРЫ, РАЗВИТИЕ.
Выпускная квалификационная работа посвящена разработке системы
автоматизации проведения интеллектуальных игр.
В первой главе выпускной квалификационной работы приведено описание
видов и типов интеллектуальных игр. Проведен сравнительный анализ
существующих решений. Выявлены функциональные и нефункциональные
требования к системе.
Во второй главе была разработана архитектура системы автоматизации
проведения
Составлена
интеллектуальных
диаграмма
игр.
состояний
Составлена
переходов
функциональная
системы
модель.
проведения
интеллектуальных игр. Произведено проектирование базы данных.
В третьей главе приведена структура ПО. Разработаны модули диалога с
пользователем, создания игр и администрирования, описан механизм их
взаимодействия.
Спроектированы
алгоритмы
и
описаны
использованные
структуры данных.
В четвертой главе представлена программная реализация основных
механизмов автоматизированной системы проведения интеллектуальных игр, а
так же проведено тестирование системы.
Графическая
часть
выпускной
квалификационной
работы
включает
иллюстрации, таблицы, которые объединены в презентацию PowerPoint.
Библиографическая часть выпускной квалификационной работы включает в
себя 22 источника.
4
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
6
1 ИССЛЕДОВАНИЕ ПРОЦЕССОВ ПРЕДМЕТНОЙ ОБЛАСТИ
АВТОМАТИЗИРОВАННОЙ СИСТЕМЫ ПРОВЕДЕНИЯ
ИНТЕЛЛЕКТУАЛЬНЫХ ИГР
8
1.1
Описание предметной области
8
1.2 Функциональные требования
12
1.3 Нефункциональные требования
12
1.4 Обзор аналогов
13
2 ПРОЕКТИРОВАНИЕ СИСТЕМЫ АВТОМАТИЗИРОВАННОГО
ПРОВЕДЕНИЯ ИНТЕЛЛЕКТУАЛЬНЫХ ИГР
18
2.1 Архитектура системы
18
2.2
Функциональное моделирование
18
2.3
Диаграмма переходов состояний
21
2.4
Проектирование базы данных
22
3 РАЗРАБОТКА АВТОМАТИЗИРОВАННОЙ СИСТЕМЫ ПРОВЕДЕНИЯ
ИНТЕЛЛЕКТУАЛЬНЫХ ИГР
27
3.1 Структура ПО
27
3.1.1 Модуль диалога с пользователем
27
3.1.2 Модуль создания игр и администрирования
28
3.2 Проектирование алгоритмов
29
3.2.1 Алгоритм регистрации пользователей
29
3.2.2 Алгоритм отправления вопросов
32
3.2.3 Алгоритм считывания вопросов
33
3.2.4 Алгоритм проверки пользовательских ответов
35
3.3 Проектирование пользовательского интерфейса
37
3.4 Проектирование логики диалога с пользователем
37
3.5 Проектирование структур данных
39
4 РЕАЛИЗАЦИЯ АВТОМАТИЗИРОВАННОЙ СИСТЕМЫ ПРОВЕДЕНИЯ
ИНТЕЛЛЕКТУАЛЬНЫХ ИГР
41
4.1 Выбор инструментальных средств разработки
41
4.2 Реализация механизма регистрации
43
4.3 Реализация механизма проведения игры
45
5
4.4 Реализация механизма проверки игровых данных.
47
4.5 Тестирование автоматизированной системы проведения интеллектуальных
игр
49
ЗАКЛЮЧЕНИЕ
51
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
52
ПРИЛОЖЕНИЕ А ЛИСТИНГ МОДУЛЯ ВЗАИМОДЕЙСТВИЯ С
ПОЛЬЗОВАТЕЛЕМ
54
УДОСТОВЕРЯЮЩИЙ ЛИСТ №140037
77
ИНФОРМАЦИОННО-ПОИСКОВАЯ ХАРАКТЕРИСТИКА ДОКУМЕНТА НА
ЭЛЕКТРОННОМ НОСИТЕЛЕ
78
6
ВВЕДЕНИЕ
За последние несколько лет особенно стал актуальным вопрос личностного
образования и роста. Стало очевидным, что успех каждого человека зависит не
только от профессиональных качество, но и от развития личностных и духовных
ценностей. Большой частью развития этих ценностей стали интеллектуальные
игры.
Интеллектуальная игра – вид игры, основывающейся на применении своей
эрудиции и интеллекта; коллективное или индивидуальное выполнение заданий,
требующих применения быстрого мышления в условиях ограниченного времени.
Основной функцией таких игр является развитие мышления, командной работы,
процессов анализа, обобщения и классификации, логики. Игровая деятельность,
наряду с коммуникативной, трудовой, образовательной имеет немаловажное
значение в развитии личности человека. Являясь одной из форм организации
досуговой деятельности, интеллектуальные игры уже вошли в непосредственную
практику работы школ, вузов, общественных организаций, видом проведения
корпоративного отдыха и сплочения коллектива. Интеллектуальная играэффективная форма познания нестандартных знаний и умений, что так же
дополняет спектр её целевых направлений.
В
настоящее
время
набирают
популярность
различные
виды
интеллектуальных игр и олимпиад, как коммерческих так и любительских.
Однако, большинство их проводится вручную, про помощи подручных средств и
минимальных средств организации проведения.
На конференции Microsoft Build 2017 была высказана мысль, которая в наше
время стала еще более актуальной – по мере того, как общение с компьютером
становится более приближенным к общению с человеком, возрастает роль диалога на
естественном языке. Исходя из этого, было принято решение переложить часть
работы с человека на бота , который взаимодействует с пользователем на
естественном языке.
7
Актуальность разработки системы автоматизированного проведения игр
обусловлена следующими факторами:

проведение игр в бумажной форме имеет высокую трудоемкость и
время подготовки;


время игры в большинстве случаев затягивается из-за ручного сбора и
подсчета ответов.


результаты игры каждый раз требуется вручную вводить в систему и
выводить на экран;


при ручном подсчете ответов велика вероятность ошибки вследствие
человеческого фактора.
Целью данной работы является повышение эффективности и уменьшение
трудоемкости проведения интеллектуальных игр и конкурсов за счет уменьшения
времени обработки данных, получаемых от пользователя и уменьшения расходов
на раздаточные материалы. Для достижения данной цели необходимо решить ряд
задач:
1)
провести анализ предметной области;
2)
осуществить анализ существующих видов и принципов проведения
интеллектуальных игр;
3)
построить функциональную модель и определения;
4)
определить функциональные и не функциональные требования к
разрабатываемой системе;
игр.
5)
разработать модель базы данных;
6)
спроектировать схему логики диалога с пользователем;
7)
выбрать средства для разработки системы;
8)
реализовать систему автоматизации проведения интеллектуальных
8
1
ИССЛЕДОВАНИЕ ПРОЦЕССОВ ПРЕДМЕТНОЙ ОБЛАСТИ
АВТОМАТИЗИРОВАННОЙ СИСТЕМЫ ПРОВЕДЕНИЯ
ИНТЕЛЛЕКТУАЛЬНЫХ ИГР
1.1 Описание предметной области
Интеллектуальные игры – это логические либо стратегические игры, в
которых успех игрока напрямую зависит от умений, навыков и способностей
делать
верные
ходы
согласно
правилам.
Интеллектуальные
игры
дают
возможность проявить лучшие интеллектуальные качества. В некоторых играх
шансы игроков изначально равны, но есть игры, где игроки задают себе
различные условия, ставя цель выиграть любыми способами.
Самыми древними интеллектуальными играми принято считать шахматы,
шашки, нарды, го и маджонг. Игроки демонстрируют свои способности
запоминать, анализировать расклады, ситуации, оперировать фигурами и
комбинациями. Некоторые из этих игр – шашки и шахматы, попали в разряд
спортивных, включенных в олимпиады и спартакиады.
Настольная экономическая игра «Монополия» с элементами стратегии и
опоры на финансово-экономические знания остается популярной игрой для людей
любого
возраста.
«Морской
бой»
-
также
может
считаться
игрой
интеллектуального плана: игрокам следует строить догадки о местонахождении
кораблей противника. Здесь демонстрируется не только способность размышлять
логически, но и опираться на психологию соперника.
К интеллектуальным играм относят и развлечение на тему угадывания чеголибо: игроки пытаются догадаться, образ какого персонажа книги, фильма,
картины, любого известного произведения пытается изобразить один из
участников.
Интеллектуальные игры могут использоваться не только в виде развлечения
для молодежи и старше, но и для обучения детей школьного и дошкольного
возраста. Человек по своей природе существо весьма любопытное. Этому есть
физиологическое объяснение – срабатывает средний мозг с древним
9
ориентировочным рефлексом, рефлексом на нечто новое. Именно поэтому игры
вызывают интерес у учащихся и дошкольников. В игре должно быть интересно
начало, процесс и ее завершение.
Викторины заслуживают отдельного внимания. Эти конкурсы с вопросами
стали популярным времяпрепровождением в кругах обычных людей и среди
интеллектуальной элиты. В любом общеобразовательном учреждении принято
организовывать несложные викторины на лучшего знатока какого-либо предмета.
Викторины могут быть математическими, литературными, историческими,
связанными с химией, физикой, географией, астрономией и т.д. Они повсеместно
используются как неотъемлемый и эффективный элемент развивающего
обучения. Студенты и взрослые с удовольствием играют в викторины посложнее:
вопросы становятся более разнообразными и требуют глубоких знаний темы. В
последнее время особое место занимают телевикторины с участием звезд шоубизнеса. Знатоки и эрудиты составляют прочный костяк знаменитой викторины
«Что? Где? Когда?». Эту телеигру взяли за основу разработчики других, не менее
интересных онлайн-викторин.
Любая интеллектуальная игра дает неограниченные возможности для
развития знаний, углубления каких-либо навыков. Это отличная тренировка
разума в любом возрасте.
Наибольшей популярностью в данный момент пользуются:



спортивная версия игры «Что? Где? Когда?»;

викторины;

бар-олимпиады.
Известная
миллионам
интеллектуальная
игра
«Что? Где? Когда?»,
бессменно выходящая на одном из федеральных каналов, уже давно стала
спортивной.
Клубы спортивного ЧГК существуют не только в странах бывшего СССР и
Болгарии, но и во многих западных странах (Германии, Израиле, США,
Великобритании, Канаде, Финляндии, Чехии, Нидерландах), где участниками
являются в основном эмигранты из русскоязычных стран. В некоторых
10
существуют варианты игры на местных языках (например, в Германии «Was?
Wo? Wann?»).
В отличие от элитарного клуба, в одной игре спортивной версии принимает
участие сразу несколько команд. Команды находятся в равных условиях и
одновременно отвечают на один и тот же вопрос. Правильный ответ не приносит
ни команде ни конкретному игроку денег, но добавляет баллы к итоговому
рейтингу коллектива. Команда, оказавшаяся к концу игры на верхней строчке
рейтинга, считается победителем. Все как в стрелковых видах спорта, только
вместо патрона или стрелы — вопрос, а вместо попадания — правильный ответ.
Основным отличием от классических спортивных дисциплин является то,
что регламент ограничивает только максимальное количество игроков, и за
неявку полного состава не предусматривается штрафа или дисквалификации.
На данный момент виды игры разделают на синхронную ,очную и онлайн
версии.
Соревнуясь в очном виде игры, все участники располагаются в одном
помещении, вопросы зачитывает один ведущий. Так например проходят местные
кубки и студенческие чемпионаты.
В синхронной игре одни и те же вопросы в одно и то же время зачитывают
разные ведущие, а команды, соответственно, и находятся в пределах нескольких
игровых арен (например в разных городах).
В онлайн версии подразумевает общение между ведущими и игроками
через любой доступный канал связи: телефонную конференцию или Skype.
Однако такой вид игры не может считаться «спортивным», в частности из-за
возможности команд пользоваться техническими средствами для поиска ответа и
невозможности контролировать реальное количество участников в команде.
Различают несколько видов спортивного ЧГК:



Даугавпилс;

Эрудит-квартет;

индивидуальное ЧГК;
11



интеллектуальное многоборье;

интеллектуальный Марафон;

Ворошиловский стрелок;
Правила командной своей игры похожи на правила телевизионной версии.
Играют одновременно все команды.
Игра состоит из нескольких раундов. В начале каждого раунда объявляются
темы и стоимость вопросов (количество баллов, которые можно получить при
правильном ответе на вопрос). Одна из команд выбирает тему и стоимость
вопроса, после чего ведущий зачитывает соответствующий вопрос. Время на
обсуждение составляет 15 секунд. По истечении 15-ти секунд по сигналу команды
записывают свой вариант в бланк ответа и отдают ведущему, при этом, если
команда не уверена, то ответ можно вообще не сдавать. В одном раунде 5 тем и 5
различных стоимостей вопросов (т.е. всего 25 вопросов).
По правилам игры в каждом раунде каждая команда один раз выбирает
вопрос. Таким образом, если в игре участвует, например, 15 команд, то разыграно
будет ровно 15 вопросов из 25 возможных. Порядок, в котором команды
выбирают вопросы, определяется ведущим перед началом раунда.
В случае правильного ответа команда получает количество очков, равное
стоимости вопроса. В случае неправильного ответа команда теряет количество
очков, равное стоимости вопроса. Если команда вообще не дает ответа, то ничего
не происходит [8].
Викторина — игра, заключающаяся в ответах на вопросы из различных
областей знания и логики.
Викторины
определяющими
в
основном
очерёдность
отличаются
хода,
тип
и
друг
от
сложность
друга
правилами,
вопроса,
определения победителей, вознаграждение за правильный ответ.
порядок
12
1.2 Функциональные требования
Разрабатываемая система должна обеспечивать пользователю простой
механизм регистрации и авторизации, а так же отправки сообщений. При этом,
наличие справки упрощает использование пользователем, не имеющим опыта
работы с приложением.
Для
разрабатываемой
системы
были
сформулированы
следующие
функциональные требования:





возможность регистрации команд и пользователей;

возможность создания собственных турниров;

в системе должно быть разграничение прав пользователей;

авторизация капитана команды в системе;

вывод на экран текущего вопроса и общей турнирной сетки.
1.3 Нефункциональные требования
Для разрабатываемой системы проведения интеллектуальных игр можно
выделить следующие нефункциональные требования:


использование архитектуры «клиент-сервер» ;

поддержка целостности и безопасности данных, обусловленные
нарушениями в работе серверов и баз данных;


обеспечение
кроссплатформенности
(поддержка
мобильных
операционных систем ios, android, поддержка настольных операционных систем
windows, linux) ;




доступа;



сервер.
обеспечение удобочитаемой справки и поддержки;
пользователи не должны изменять данные, к которым не имеют
возможность работы как на lan – соединении так и через удаленный
13
1.4 Обзор аналогов
Чтобы выделить преимущества разрабатываемой системы необходимо
рассмотреть аналоги, в качестве которых выступают различные онлайновые и
офлайновые системы проведения игр [9].
Мобильное и десктопное приложение «Своя игра» – проект, посвященный
одноименной телевизионной игре. Приложение реализовано в виде мобильной
игры под ОС Android и приложения под ОС Windows. Игра представлена только в
одном виде и формате и требует установки дополнительного ПО, а так же
микротранзакций для отключения рекламы. Поддержка мобильной версии
производится до сих пор, поддержка и обновления win-приложения остановлена в
2017 году. Исходные данные в мобильной версии берутся из открытой базы
вопросов, что исключает создание собственных турниров и игр. Исходные данные
десктопной версии формируются как с помощью редактора вопросов, так и с
помощью генератора из сети интернет. Игра по локальной сети и сети интернет
реализована только в настольной версии, в мобильной производится только с
участием псевдоботов. Примеры из этих систем представлены на рисунках 1.1 и
1.2
Рисунок 1.1– Пример приложения «Своя игра»
14
Рисунок 1.2 – Пример мобильного приложения «Своя игра»
Тривиадор
–
интеллектуальная
онлайн-игра
со
стратегическими
элементами, созданная в 2002 году. Представляет собой поединок между двумятремя игроками за условные игровые территории. База вопросов формируется, в
основном, из вопросов, присланных самими игроками, и редактируется
модераторами и другими игроками. На данный момент большинство вопросов
отсеиваются по причине повторений, несоответствия форматов, чрезмерной
сложности и простоты. В связи с этим обработка вопросов производится с
существенной задержкой. Так как количество модераторов ограничено и
существует большой процент «отсева» вопросов, возникает проблема частого
повторения одних и тех же вопросов. Русская версия игры прекратила
существование в 2013 году. В 2015 году игра произвела неудачный ребрендинг, и
в связи с этим был замечен большой отток игроков. Пример из этой системы
представлен на рисунках 1.1 и 1.3
15
Рисунок 1.3 – Пример веб-приложения «Тривиадор»
Локальные синхронные чемпионаты по спортивному «Что? Где? Когда?» –
еженедельно проводимые турниры по спортивной версии игры «Что? Где?
Когда?». Формула проведения турниров предусматривает 3-4 тура, в каждом из
них по 9-12 вопросов. Места команд в таблице определяются по количеству
взятых вопросах во всех турах. База вопросов формируется сообществом авторов,
и проверяется советом Международной Ассоциации клубов. Формат проведения
включает в себя присутствие команд на какой-либо площадке, зачитывание вслух
вопросов и занесение ведущим ответов в систему рейтинга команд и игроков.
Недостатком данного вида проведения является сложность в организации
большого числа людей, проблемы с поиском подходящей площадки, а так же
человеческий фактор при подсчете ответов и занесении их в систему рейтинга.
Интеллектуальные марафоны и турниры – один из подвидов проведения
синхронных чемпионатов, включающие в себя одновременно несколько форматов
и видов игр. Турниры, обычно проводятся в несколько дней и являются нелегким
испытанием как для новичков, так и для профессионалов. При проведении
16
марафонов остро встает вопрос о скорости и, особенно, трудозатратности
проведения, так как формат требует сдачи большого количества ответов от
большого количества команд, что влечет за собой большие траты на наемный
персонал, раздаточный материал и бланки ответов.
Бар-олимпиады и квизы – популярные в данный момент виды проведения
интеллектуальных игр. Получили популярность в 2013-2014 годах. Усредненная
формула проведения включает в себя 7 туров в различных областях знаний. База
вопросов формируется закрытым сообществом авторов и не подвергаются
модерации и тестированию. Формат проведения заключается в сборе множества
команд на одной площадке, сдаче вопросов в письменном виде и ручном подсчете
ответов. Из этого возникают недостатки, а именно:





высокая трудоемкость подсчета правильных ответов;

высокая времязатратность;

необходимость длительного ожидания подсчета;

большое время сбора ответов;

человеческий фактор во время подсчета и записи правильных

ответов [6];
Таким образом, на сегодняшний день существует множество разных
форматов и видов интеллектуальных игр [8]. Некоторые из них достаточно
автоматизированы, но остальные проводятся практически вручную. Кроме того,
некоторые системы обладают редактором вопросов, что позволяет каждому
написать и провести свою собственную игру. Часть видов условно- бесплатны, а
некоторые полностью на платной основе. На основе приведенного исследования
существующих решений можно провести их сравнительный анализ, чтобы
выделить их достоинства и недостатки. Можно выделить следующий перечень
основных критериев:



кроссплатформенность;

наличие редактора вопросов;

стоимость;
17


наличие рейтинга команд;

удобный интерфейс ввода ответов.
По этим критериям был произведен анализ игр, результаты которого
представлены в таблице 1.1
Таблица 1.1 Анализ аналогов
Система
Кроссплат
Редактор
Стоимость
Рейтинг
Удобный
форменность
вопросов
1
2
3
4
5
6
Своя игра
-
-
Бесплатная -
+
-
+
Бесплатная -
+
«Тривиадор»
+
+
Бесплатная +
-
Синхронные
+
-
Низкая
+
-
+
-
Средняя
+
-
Разработанная +
+
Бесплатная +
+
интерфейс
мобильная
Своя игра
десктопная
чемпионаты
Баролимпиады
система
18
2
ПРОЕКТИРОВАНИЕ СИСТЕМЫ АВТОМАТИЗИРОВАННОГО
ПРОВЕДЕНИЯ ИНТЕЛЛЕКТУАЛЬНЫХ ИГР
2.1 Архитектура системы
Архитектура системы проведения интеллектуальных игр представляет один
из
видов
клиент
-
серверной
архитектуры.
Основными
компонентами
архитектуры являются:

клиент, использующий интерфейс пользователя, выполняющий
запросы к серверу, получающий от него ответы и выполняющий логику системы;


сервер, управляющий базами данных, выполняющий запросы клиенты

и делегирующий права доступа к нему;

сеть, осуществляющая взаимодействие между сервером и клиентом.
Для
реализации
системы
проведения
интеллектуальных
игр
такая
архитектура предпочтительна, так как она удовлетворяем требованиям к
вычислительным мощностям клиентов, а именно, снижает сетевой трафик при
выполнении
запросов,
обеспечивает
поддержку
малых
вычислительных
мощностей на стороне клиента, легко масштабируема, быстро приспосабливается
к увеличению объема баз данных и количества пользователей, обеспечивает
защищенность данных.
Для корректной работы системы требуется спроектировать два режима
работы системы: режим игры и режим администратора.
Режим пользователя представляет собой диалог с пользователем, на основе
выбранной игры и команды.
Что
касается
режима
администратора,
то
происходит
упразднение
компонентов, связанных с режимом пользователя, так как на этом этапе
подразумевается что база ответов уже заполнена и готова к обработке.
2.2 Функциональное моделирование
Для описания модели функционирования системы построим диаграмму
IDEF0. Эта методология предписывает построение иерархической системы
19
диаграмм – описаний фрагментов системы [12]. Для начала можно провести
описание системы в целом и ее взаимодействие с внешней средой (контекстная
диаграмма), а затем необходимо осуществить функциональную декомпозицию –
систему разбить на подсистемы, каждую из которых описать отдельно(диаграммы
декомпозиции).
В
качестве
основного
моделируемого
процессе
возьмем
проводимая игра. На рисунке 2.1 представлена контекстная диаграмма.
Рисунок 2.1 – Контекстная диаграмма
Вводными
данными
для
начала
работы
являются
выбранный
администратором пакет вопросов и команды, зарегистрированные на игру.
Управляющими являются набор команд ввода данных и обучающая информация,
которую пользователь должен изучить перед взаимодействием с системой.
Механизмами будут являться администратор, пользователь и непосредственно
управляющая система.
Декомпозиция блока А0 (рисунок 2.2) включает процессы:

регистрация игры;
20




регистрация команды;

начало игры;

игра;

получение итоговых результатов;
Рисунок 2.2 – Декомпозиционная диаграмма блока А0
Регистрация игры заключается в регистрации администратором новой
игры и внесении в редактор нужных вопросов. Этот уровень является входным
для процесса «Регистрация команды». Каждая игра включает в себя туры и
вопросы.
Регистрация команды заключается в указание капитаном команды названия
и игроков и передача этих данных в базу, после чего команды ожидают начла
игры, которое оповещается сообщением, приходящим за сутки до игры и за пять
минут до начала первого тура.
В результате получаются список вопросов и список команд, которые
необходимо запустить(процесс «Запуск игры»). После запуска игры система
переходит к процессу «Игра», в процессе которого пользователи присылают свои
ответы в систему, и система регистрирует их в базу данных.
После окончания игры, администратор производит подсчет правильных и
неправильных ответов и система формирует итоговую таблицу(процесс
21
«Получение итоговой таблицы». В итоге, после формирования и вывода итоговой
таблицы на экран, пользователи ознакамливаются с ней и система прекращает
работу.
2.3 Диаграмма переходов состояний
Для того чтобы охарактеризовать программу и её поведение в разные
моменты времени и показать как она будет работать, можно построить диаграмму
переходов состояний [11]. Переходы между состояниями осуществляются при
выполнении в системе определенных действий. В системе можно выделать
несколько основных состояний:






окно приветствия;

регистрация команды;

просмотр справки;

начало игры;

проведение игры;

проверка результатов.
Построенная диаграмма переходов состояний изображена на рисунке 2.3
Рисунок 2.3 – Диаграмма переходов состояний
Из начального состояния осуществляется переход в состояние «Окно
приветствия». Если пользователь выбирает команды просмотра справки, то
22
осуществляется переход в состояние «Просмотр справки». Если справка
просмотрена и пользователь хочет продолжить работу с системой, то он
возвращается в предыдущее состояние, иначе работа с программой завершается.
При
переходе
в
состояние
«Регистрация
команды»
происходит
инициализация диалога регистрации. Пользователь увидит информацию и в
соответствии с ним должен ввести необходимые данные и параметры. После
этого система переходит в состояние «Начало игры», или, если нет текущей
работа с программой завершается.
При переходе в состояние «Начало игры» происходит формирование списка
команд и отправка уведомительного сообщения всему этому списку. После этого
система сразу же переходит в состояние «Отправление вопроса»
Состояние «Проведение игры» запускает сценарий отправления вопросов.
На каждый отправленный вопрос он ожидает один ответ от каждой команды.
После ожидания система переходи в состояние «Получение ответа».
Если вопросы закончены, или команды больше не присылают ответы, то
система после получения последнего ответа переходит в состояние «Проверка
результатов».
При переходе в состояние «Проверка результатов» формируется список
ответов пользователей, после чего эксперт проверяет их и формирует итоговую
таблицу, которая доступна для просмотра всем командам и эксперту. После этого
работа с программой завершается.
2.4 Проектирование базы данных
Спроектируем базу данных, которая будет использоваться в системе. Было
принято решение использовать реляционную модель хранения данных ввиду её
наглядности и простоты, а так же простоты преобразования сущностей и связей в
схему базы данных[13].
Для проектирования реляционной базы данных необходимо описать
сущности, которые отражают предметную область. Для базы данных можно
выделить следующие основные сущности:
23






игроки;

команда;

игра_has_команда;

ответы;

игра;

вопросы.
Каждая таблица содержит ключевое поле – первичный ключ, который будет
обеспечивать уникальность записей. Так же таблицы содержат внешние ключи –
необходимые для обеспечения связей между таблицами.
Перейдем к описанию самих сущностей. Сущность «Игроки» будет
включать в себя следующие данные:




идентификатор (первичный ключ) ;

имя;

фамилия;

команда (внешний ключ) .
Рисунок 2.4 - Атрибуты сущности «Игроки»
Сущность «Команда» будет включать в себя следующие данные:



идентификатор(первичный ключ) ;

название команды;

телеграм_id.
Рисунок 2.5 - Атрибуты сущности «Команда»
Сущность «Игра_has_Команда» будет включать в себя следующие данные:
24


игра_id(внешний ключ) ;

команда_id (внешний ключ).
Рисунок 2.6 - Атрибуты сущности «Игра_has_Команда»
Сущность «Игра» будет включать в себя следующие данные:



идентификатор (первичный ключ);

название игры;

дата проведения.
Рисунок 2.7 - Атрибуты сущности «Игра»
Сущность «Ответы» будет включать в себя следующие данные:



ответ;

вопросы_id(внешний ключ);

команда_id (внешний ключ).
Рисунок 2.8 - Атрибуты сущности «Команда»
Сущность «Вопросы» будет включать в себя следующие данные:




идентификатор (первичный ключ) ;

вопрос;

тур;

игра (внешний ключ).
25
Рисунок 2.9 – Атрибуты сущности «Вопросы»
Теперь рассмотрим связи между описанными сущностями. В одной команде
может содержаться множество игроков, следовательно между сущностями
«Команда» и «Игроки» будет проходить связь «один ко многим». В
зарегистрированной игре может участвовать множество команд, причем одна
команда может играть в нескольких играх, поэтому целесообразно создать
промежуточную таблицу «Игра_has_команда», которая соответствует связи
«многие-ко-многим». У каждой команды в каждой игре есть собственные,
уникальные ответы, которые будут храниться в сущности «Ответы», которая
является промежуточной таблицей.
Таблица «Ответы» так же является связью «многие-ко-многим » между
сущностями «Команда» и «Вопросы» У каждой команды на игре должно быть
множество ответов, следовательно между сущностями «Команды» и «Ответы»
будет проходить связь «один ко многим».
Рассмотрим сущности, относящиеся непосредственно к игре. В каждой игре
имеется множество вопросов, которые разделены по турам. Вопросы уникальны,
и не могут повторятся в течении одной или нескольких игр. Туры принадлежат
игре, а в каждом туре содержится множество вопросов. Таким образом, связь
«один ко многим» будет связывать сущности «Туры» и «Игра».
Немаловажным при проектировании базы является рассмотрение вопроса о
целостности данных. Поддержание целостности данных может рассматриваться
как защита данных от ошибочных изменений с помощью определенных правил.
Целостность
базы
данных обеспечивает
непротиворечивость
и
точность
хранимых данных
Ограничение базы данных – правило, которое задается для двух или более
связанных таблиц. Одним из видов обеспечения целостности является ссылочная
26
целостность. Введение ограничения предполагает, что значение атрибута
существует в ссылочной таблице. Для обеспечения целостности базы была
выбрана стратегия обновления и удаления CASCADE.
Стратегия CASCADE предполагает преобразование записей в связанной
таблице таким образом, что база данных оставалось корректной при удалении
некоторых данных. Стратегия CASCADE при модификации записей материнской
таблицы изменяются соответствующие значения в дочерней таблице на новые
значения. При удалении записей материнской таблицы подразумевает удаление
связанных записей зависимой таблицы.
Описав атрибуты сущностей и их типы данных, построим полную
логическую модель базы данных и визуализируем ее как диаграмму.
Конечная схема базы данных со всеми сущностями, атрибутами и связями
представлена на рисунке 2.10.
Рисунок 2.10 – Схема базы данных
27
3 РАЗРАБОТКА АВТОМАТИЗИРОВАННОЙ СИСТЕМЫ ПРОВЕДЕНИЯ
ИНТЕЛЛЕКТУАЛЬНЫХ ИГР
3.1 Структура ПО
Для создания системы проведения интеллектуальных игр была принято
использовать модульную структуру.
Модульная структура – организация проекта, которое позволяет удобно
разделить работу программы между отдельными модулями, а так же проводить
всю ресурсоемкую работу через интерфейсы, чтобы скрыть внутреннюю логику
от пользователя.
Модули взаимодействуют между собой при помощи общей базы данных,
которая обеспечивает целостность информации, а так же позволяет использовать
разные языки программирования и избавляет от лишних ссылок.
Систему было принято разделить на два модуля:
1)
модуль взаимодействия с пользователем;
2)
модуль создания игр и администрирования.
3.1.1 Модуль диалога с пользователем
Взаимодействие с пользователем – это диалог программного средства с
пользователем [4]. Диалог осуществляет двустороннее взаимодействие
с
пользователем, сообщая ему какую- либо информацию и ожидая ответа от него. В
рамках данного модуля диалог с пользователем заключается в регистрации,
оповещении, принятия сообщений от пользователя и отправки ему ответов.
Среди методов данного модуля можно выделить:

инициализация диалогового бота. Модуль выполняется при каждом
запуске модуля и останавливается только при его отключении;


регистрация пользователя в системе. Пользователь при помощи
специальных команд отправляет на сервер информацию о команде и её членах;


пользовательская справка. Справка позволяет новым пользователям
сориентироваться в системных командах;
28

отправка вопросов пользователям. Система загружает из базы
информацию о турах и вопросах и каждые 60 секунд отправляют их каждому
пользователю;


получение ответов от пользователей. Система ожидает ответов от
пользователей 50 секунд, после чего отсылает следующий вопрос.
3.1.2 Модуль создания игр и администрирования
Администрирование
–
комплекс
мер
по
запуску
и
поддержанию
работоспособности системы. Регулярное администрирование и наполнение
системы информацией позволяет привлекать новых и поддерживать старых
пользователей.
Вследствие работы данного модуля осуществляется добавление новых игр и
поддержка текущих и прошедших ивентов. Можно выделать следующие методы:

авторизация пользователя. Метод инициирует проверку авторизации
пользователя, чтобы проверить права доступа к проверке игры;


получение данных из базы. Модуль с помощью формирования
запросов получает необходимую информацию из базы, для последующей её
обработки;


отправка результатов проверки в базу данных. После обработки
информации администратором, информация снова поступает в базу, где уже
доступна для окончательного чтения;


блокировка команд. Блокировка команды необходима для пресечения
нарушений правил и нечестной игры;


создание новых игр. Происходит формирование новых полей в базу,
куда в дальнейшем будет импортироваться большая часть игровой информации;

Загрузка вопросов в игру. В локальную базу данных, в
соответствующие поля добавляются новые вопросы и туры.
29
3.2 Проектирование алгоритмов
В соответствии с функциональными требованиями разрабатываемая
система
проведения
интеллектуальных
игр
представлена
совокупностью
следующих алгоритмов:




регистрация пользователя;

отправление вопросов;

считывание вопросов;

проверка пользовательских ответов. 
3.2.1 Алгоритм регистрации пользователей
Работа алгоритма начинается при вводе соответствующей команды
пользователем, желающим зарегистрировать свою команду на игру. После ввода
команды проводится поиск записей игры в базе данных. Если в базе нет
соответствующих записей, или пользователь не ввел никакую информацию,
алгоритм завершает свою работу. Каждая существующая запись БД, относящаяся
к игре, загружается в скрипт и отправляется пользователю в формате: (номер
игры, название игры, дата игры). После получения списка игр пользователь
должен выбрать соответствующую запись и вернуть системе номер игры. Если
пользователь не вернул номер или прекратил работу с системой, алгоритм
завершает свою работу. После выбора игры система переходит в режим ожидания
названия команды. Пользователь должен ввести название команды и отправить
его в систему. Если пользователь не вернул номер или прекратил работу с
системой, алгоритм завершает свою работу. После этого название команды
проходит фильтр цензуры. Если цензурный фильтр пройдет, то система проводит
проверку на совпадение с раннее зарегистрированными командами. Если
проверка не пройдена, то система переходит в состояние ожидания названия.
Если все проверки пройдены, то пользовательская часть завершает свою работу, а
на серверной стороне формируются запросы обновления или вставки в базу
данных. Для успешного завершения работы алгоритма необходимо сформировать
два запроса: на обновление таблицы «Команды» и на вставку в таблицу
30
«Команда». Это необходимо для ведения учета команд как в текущей игре, так и в
общеигровой статистике. Если результат выполнения запроса удовлетворительны,
то алгоритм завершает свою работу.
Основная задача алгоритма регистрации пользователей – это облегчение
распределения вопросов и ответов, а так же облегчения ведения учета статистики
и общеигрового прогресса.
Если
регистрация
прошла
успешно,
то
в
последующем
зарегистрированному пользователю будет предоставлен автоматический вход в
соответствии с введенными данными.
Автоматический вход реализован посредством проверки id пользователя,
хранящегося в базе данных и id пользователя, который производит вход в
систему. Если соответствие найдено, то вход производится, иначе система не
производит отклика.
Все шаги алгоритма спроектированы таким образом, что пользователь
изолирован от работы алгоритма и при корректном
введении данных
обеспечивается точные инъекции, данные в базу данных, что повышает
безопасность системы и увеличивает защищенность конфиденциальных данных.
На рисунке 3.1 представлена блок - схема алгоритма регистрации
пользователей.
31
Рисунок 3.1 – Алгоритм регистрации пользователей
32
3.2.2 Алгоритм отправления вопросов
Алгоритм начинает свою работу при отправлении соответствующей
команды администратором игры. Если команду вводит не администратор, то
алгоритм завершает свою работу.
Если пройдена проверка администратора, то на сервере происходят запросы
к базе данных, откуда на сервер загружаются список туров и повопросный список.
Если в игре нет вопросов, или при запросе данных произошла ошибка – алгоритм
завершает работу. При успешной загрузке, всем участником данной игры
отправляется оповещение о начале игры.
Начало игры сопровождается запуском циклов туров и вопросов. После
отправки каждого вопроса запускается таймер, который отсчитывает стандартные
60 секунд. После 50 секунды всем игрокам отправляется оповещение о времени.
Если от пользователя не последовало ответа, то цикл отправляется на следующую
итерацию, и данное действие повторяется пока не кончатся ответы и туры.
На рисунке 3.2 представлена схема алгоритма отправки вопросов.
Рисунок 3.2 – Схема алгоритма отправки вопросов, лист 1
33
Рисунок 3.2, лист 2
3.2.3 Алгоритм считывания вопросов
Алгоритм считывания вопросов это один из элементов общего алгоритма
диалога с пользователем. Алгоритм начинает свою работу после получения
34
пользователем
вопроса.
Алгоритм
в
общем
виде
представляет
собой
детерминированный конечный автомат [3]. В конечном автомате существуют
переходы и состояния. Под состоянием в данном случае будем понимать
следующее ожидаемое действие от пользователя. Автомат имеет возможность
определять текущее
состояние
пользователя,
подбирать соответствующие
сообщения, а также дожидаться нужного ответа. Автомат имеет 4 состояния и 5
переходов и работает следующим образом: изначально автомат находится в
состоянии «Ожидание» и ожидает ввода пользовательского сообщения. Если
сообщение приходит, то бот переходит в состояние «Ввод ответа» и происходит
ввод пользовательского сообщения в хранилище, после чего автомат снова
переключается в состояние «Ожидание». На рисунке 3.3 изображен конечный
автомат алгоритма.
Рисунок 3.3 - Конечный автомат алгоритма считывания вопросов
Система должна помнить все сохраненные состояния даже при экстренной
перезагрузке,
поэтому
сохраненные
состояния
хранятся
в
отдельной,
изолированной от других компонентов системы, однофайловой базе данных. В
качестве ключа принимается пользователь, а в качестве значения его состояние.
Алгоритм завершается, когда заканчивается цикл отправления вопросов,
т.е. автомат переходит в состояние «конец». На рисунке 3.4 изображена схема
алгоритма считывания вопросов.
35
Рисунок 3.4 – Алгоритм считывания вопросов
3.2.4 Алгоритм проверки пользовательских ответов
Алгоритм проверки пользовательских ответов достаточно прост, так как
построен на базовых функциях и запросах к базе данных. Алгоритм начинает
свою работу по переходу на соответствующую страницу. Первым шагом
алгоритма является проверка прав пользователя. Если пользователь авторизован
как администратор, то алгоритм переходит ко второму шагу, иначе его работа
прекращается.
Вторым шагом алгоритма является формирование запросов к базе данных
из выбранной игры и создание из полученных данных списка ответов с полями
отметки.
36
На третьем шаге администратор проверяет пользовательские ответы и при
помощи группированных кнопок формирует запрос на обновление базы данных,
тем самым подтверждая правильность или неправильность ответа.
Алгоритм прекращает работу по выполнению запросов или закрытию
страницы проверки ответов. На рисунке 3.5 представлена схема алгоритма
проверки пользовательских ответов.
Рисунок 3.5 - Алгоритм проверки пользовательских ответов
37
3.3 Проектирование пользовательского интерфейса
Интерфейс
пользователям.
пользователя
При
–
часть
проектировании
программы,
интерфейса
которая
необходимо
доступна
учитывать
специфику тех пользователей, которые будут работать с разрабатываемой
системой. Так как потенциальные пользователи могут иметь разный опыт работы
с подобными приложениями и системами, интерфейс должен быть максимально
понятен и интуитивен. Интерфейс для администратора и пользователя будет
различным и представлять следующее:

форма проверки пользовательских ответов. Содержит поля проверки
ответов и кнопку отображения финальной таблицы;


форма создания игры. Содержит поля ввода информации об игре, а
так же кнопку и форму импортирования вопросов;


диалоговая форма регистрации. Содержит текстовый диалог с
пользователем, пошагово объясняющий последовательность действий;


диалоговая форма отправления ответов. Форма содержит
автоматическую систему общения с пользователем, которая запускается командой
и останавливается только по окончанию работы программы;


Справка. Содержит общую информацию о пользовательских командах

и системе.
3.4 Проектирование логики диалога с пользователем
Одним из наиболее простых и удобных способов отражения логики диалога
является простая транзитивная сеть. При таком подходе состояния системы
отображаются в виде окружностей, соединяющихся дугами. Сверху дуги
называются согласно обратной связи или входным сигналам , снизу – действие,
которое система должна выполнить при переходе из одного состояния в другое по
определенному входному сигналу. На рисунке 3.6 представлена транзитивная сеть
логики диалога с пользователем.
38
Описание состояний:
S0 – начат диалог с ботом
S1 – открыта пользовательская справка
S2 – открыта регистрация
S3 – открыта игра
S4 – ожидание вопроса
Рисунок 3.6 – Транзитивная сеть логики диалога с пользователем
В таблице 3.1 приведены обозначение переходов, соответствующие им
сигналы и действия транзитивной сети логика диалога с пользователем.
39
Таблица 3.1 – Обозначения переходов транзитивной сети логики диалога с
пользователем.
Обозначение
Сигнал
Действие
1
2
3
Ввод команды помощи
Переход
1
в
меню
справки
2
Ввод команды возврата
Переход
к
выбору
к
диалогу
команд
3
4
Ввод
команды Переход
регистрации
регистрации
Ввод данных команды
Переход
к
выбору
к
игровому
команд
Ввод
команды начала Переход
игры
диалогу
6
Окончание игры
Выход из подсистемы
7
Получение вопроса
Переход
5
к
вводу
вопроса
8
Конец игры
Переход к результатам
игры
9
Ввод ответа
Переход
к получению
вопроса
3.5 Проектирование структур данных
На основе анализа данных было принято решение использовать для
редактора вопросов такого формата данных, как CSV (Comma-Separated values),
который часто применяется для представления табличных и упорядоченных
данных.
CSV является основным форматом для связи между собой разнородных
систем, имеет встроенные средства разбора и генерации во многих языках
40
программирования, а так же хорошо понятен не только программистам, но и
рядовым пользователям. CSV – файлы используются для преобразования строк в
объекты базы данных, которые можно использовать во всех частях программы. В
рамках данной работы CSV файлы будут распознаваться на стороне сервера для
последующего сохранения в базу данных или обработки администратором.
Использование такого формата так же обусловлено тем, что одна из
крупнейших открытых баз вопросов использует его как для экспорта вопросов,
так и импорта повопросных данных турниров.
Формат такого файла можно рассмотреть на примере одного из туров,
содержащий несколько вопросов.
{
1; вопрос1;1;
2; вопрос2;1;
3; вопрос3;1;
4; вопрос4;1;
5; вопрос5;1;
6; вопрос6;1;
7; вопрос7;1;
8; вопрос1,2:
}
Помимо того, что функции для обработки такого формата данных
существуют практически во всех скриптовых языках программирования,
информация понятна и удобно читаема пользователем, даже не знакомым с этим
форматом файлов, что облегчает поиск ошибок и редактирование данных.
41
4 РЕАЛИЗАЦИЯ АВТОМАТИЗИРОВАННОЙ СИСТЕМЫ ПРОВЕДЕНИЯ
ИНТЕЛЛЕКТУАЛЬНЫХ ИГР
4.1 Выбор инструментальных средств разработки
Для реализации разрабатываемой системы предполагается использование
языков программирования PHP,Python, СУБД MYSQL, WAMP комплекса
XAMPP и CASE-средств, способствующих упрощению комплекса разработки.
PHP,
рекурсивный
акроним
PHP:
Hypertext
Preprocessor
–
это
распространённый скриптовый язык с открытым исходным кодом. PHP создан
специально для ведения Web-разработок и может внедрятся напрямую в HTML
разметку. При этом, скрипт на PHP интерпретируется сервером, а результат его
работы отображается в браузере в виде HTML-страницы.
К числу основных преимуществ PHP можно отнести:



высокая производительность;

интеграция с разными СУБД;

наличие множества встроенных библиотек. В настоящее время в PHP
насчитывается более 5000 функций, а так же множество фреймворков и
подключаемых библиотек;

популярность. В настоящее время занимает 9 место по актуальности и
частоте использования, в 2009-2010 годах занимал 1 место в рейтинге
популярности;


простота освоения;


объектно-ориентированный
и
процедурный
подходы
к
программированию. PHP предоставляет двойной интерфейс программисту.
Поддерживаются как процедурная, так и объектно-ориентированная парадигмы
программирования;

кроссплатформенность. Кроссплатформенность PHP позволяет не
беспокоится о переносимости скриптов на другие ОС. Это говорить о том, что
42
можно писать и отлаживать скрипты на
платформе
Windows,
а
при
необходимости перенести на Linux или на хостинг-провайдер;
Python - высокоуровневый язык программирования общего назначения,
ориентированный на повышение производительности разработчика и читаемости
кода. Синтаксис ядра Python минималистичен. В то же время стандартная
библиотека включает большой объём полезных функций.
Python поддерживает несколько парадигм программирования, в том числе
структурное,
объектно-ориентированное,
функциональное,
императивное
и
аспектно-ориентированное. Основные архитектурные черты — динамическая
типизация, автоматическое управление памятью, полная интроспекция, механизм
обработки исключений, поддержка многопоточных вычислений и удобные
высокоуровневые структуры данных. Код в Python организовывается в функции и
классы, которые могут объединяться в модули (они в свою очередь могут быть
объединены в пакеты).
К числу основных преимуществ Python можно отнести [5]:

динамическая типизация. В Python не нужно заранее объявлять типы
переменных;


поддержка модульности. В некоторых случаях для написания
программного средства достаточно найти нужные модули и правильно их
скомбинировать;


интеграция с другими языками. Если возможностей Python
недостаточно, то возможно интегрировать код С/С++;


автоматический сборщик мусора;

лаконичный и понятный синтаксис. Удобная система функций
позволяет создавать код, в котором просто разобраться другому программисту в
случае необходимости. Так же это облегчает чтение и использование сторонних
модулей;


кроссплатформенность.
43
В качестве основного средства разработки базы данных была выбрана
СУБД MYSQL.
MySQL – свободная система управления базами данных. Разработку и
поддержку MySQL осуществляет компания Oracle, которая ранее приобрела
шведскую компанию MySQL АВ. Продукт распространяется как под GNU General
Public License, так и под собственной коммерческой лицензией. Помимо этого
разработчики создают функциональность по заказу лицензионных пользователей,
именно благодаря такому заказу почти в самых ранних версиях появился
механизм репликации [1].
MySQL считается
хорошим
решением
для
небольших и
средних
приложений. Входит в состав серверов WAMP, LAMP , ХАМРР. Обычно, MySQL
используется в качестве сервера, к которому обращаются локальные либо
удалённые покупатели, но в комплекс вступает библиотека внутреннего сервера,
позволяющая подключать MySQL в независимый приложения.
PhpMyAdmin-приложение, созданное на языке PHP и дающее возможность
работы с базой данных как через командную строку, так и через веб-интерфейс.
Так как PhpMyAdmin позволяет создавать элементы базы не используя команды
SQL, то работа с базой становится значительно легче и проще, если даже
программист мало знаком с MySQL.
4.2 Реализация механизма регистрации
Для регистрации пользователя в системе существует несколько методов,
описанных ранее. В программном коде, представленном ниже происходит
считывание данных пользователя. Метод срабатывает при получении команды
«/register». Для начала из базы достается список игр и заносится в структуру.
После этого список проверяется и пользователю отправляется игры, доступные на
данный момент. После выбора программа ожидает сообщение, проходящее по
шаблону
регулярного
выражения,
соответствующего
типу
Integer.
Если
сообщение получено, то программа переходит в состояние ожидания сообщения
текстового шаблона. Вся реализация механизма регистрации завязана на
44
заголовках и шаблонах сообщений, а так же на инъекциях в базу данных. На
рисунке 4.1 представлен пример регистрации команды.
@bot.message_handler(commands=["register"])
def help_msg(message):
bot.send_message(message.chat.id,'Привет. Выберите игру, на которую хотите
зарегистрироваться.')
getgame = """SELECT * FROM game """
cursor.execute(getgame)
games=cursor.fetchall()
for game_check in games:
gId,gName,gDate = game_check
gmInfo=str(gId)+' '+gName+' '+str(gDate)
bot.send_message(message.chat.id,gmInfo)
@bot.message_handler(regexp="^\d+$")
def get_game(message):
global _game
_game= message.text
bot.send_message(message.chat.id,'Введите название
следующем сообщении.
команды
в
В названии команды не должно содержаться
нецензурных слов или выражений.')
@bot.message_handler(content_types=["text"])
def get_name(message):
print(_game)
flag = 1
# INSERT INTO `team` (`id`, `name`, `telegram_id`) VALUES (NULL,
'testtest', '111');
sql = """SELECT * FROM team """
cursor.execute(sql)
data = cursor.fetchall()
45
Рисунок 4.1 – Регистрация команды на ближайшую игру
4.3 Реализация механизма проведения игры
Чтобы пользователю отправить текущий вопрос используем два цикла, цикл
тура
и
цикл
вопросов.
После
отправки
сообщения
конечный
автомат
переключается в состояние «S_WAITING» и ожидает ответа пользователя.
Параллельно с этим начинается отсчет таймера и посекундная проверка отзыва.
Если ответ получен, то конечный автомат переключается
в состояние
«SENDING», таймер сбрасывается, а внутренний цикл принудительно переходит
на следующую итерацию.
После окончания игры формируется список вопросов и игравших команд.
Чтобы внести их в базу данных используем цикл, а так же механизм исключений
и обработки ошибок. На каждой итерации цикла администратору видны ответы,
которые формируют запрос на вставку в базу. Если запрос выполнен, цикл
переходит на следующую итерацию, иначе выдается ошибка и инъекция
прекращается. На рисунке 4.2 представлен пример проведения тестовой игры.
46
for qst in questions:
qsst = qst
for i in range(len(questions)):
bot.send_message(message.chat.id,questions[i])
now = datetime.datetime.now()
print(_answers)
dbworker.set_state(message.chat.id, config.States.S_
S_WAITING.value)
_Flag=0
#print(_Flag)
while _Flag == 0 :
now1 = datetime.datetime.now()
now1=now1-now
#print(now1.seconds)
if now1.seconds==50:
bot.send_message(message.chat.id,'Прошло 50 секунд')
if now1.seconds==60:
bot.send_message(message.chat.id,'Время истекло')
break
@bot.message_handler(func=lambda
message:
True,content_types=["text"])
def get_answer(message):
dbworker.set_state(message.chat.id,
config.States.SENDING.value)
nonlocal _answers
_answers.append(message.text)
nonlocal _Flag
#print(_Flag)
_Flag=1
for i in range(len(_answers)):
print(_answers[i])
try:
cursor.execute(""" INSERT INTO `answers` (`id`, `answer`,
`team`) VALUES (%s,%s,%s) """,('',_answers[i],team))
db.commit()
47
Рисунок 4.2 – Процесс проведения игры
4.4 Реализация механизма проверки игровых данных.
После того как игра проведена, администратор должен проверить ответы.
Для реализации проверки ответов был выбран язык PHP, так как он позволяет
динамически формировать блок ответов, независимо от их количества [2]. Ниже
приведен программный код контроллера, отвечающего за связь базы данных и
представления отображения ответов. На рисунке 4.3 представлен процесс
проверки ответов.
48
<?php
require_once("../database.php");
require_once("../models/game.php");
$link=db_connect();
$answers = answers_all($link);
$teams= teams_all($link);
$arr=[];
$itog=[];
$q=0;
foreach ($teams as $t){
$arr[$q]=$t["id"];
$q++;
}
for ($i=0;$i<count($arr);$i++){
$sum=0;
foreach($answers as $a) {
if ($a["team"]==$arr[$i]){
$sum+=$a["correct"];
}
}
$itog[$i]=$sum;
$itogg=[];
$n=0;
foreach ($teams as $t){
$itogg[$t["name"]][email protected]$itog[$n];
$n++;
}
}
include("../views/result.php")
?>
49
Рисунок 4.3 – Процесс проверки пользовательских ответов
4.5 Тестирование автоматизированной системы проведения
интеллектуальных игр
Чтобы
оценить
насколько
успешно
будет
проводится
внедрения
разрабатываемой системы в уже существующие форматы проведения игр, была
проведена тестовая игра формата спортивного «Что? Где? Когда» на базе
студенческого клуба интеллектуальных игр ОГУ им И.С.Тургенева.
В
ходе проведения тестовой игры были выявлены следующие
преимущества и недостатки разработанной системы:
Преимущества:

Значительное ускорение проведения игры. До внедрения средняя игра
из 20 вопросов проходила 1час 30 минут, после внедрения – 50 минут.
50

Уменьшение трудозатратности ведущего и игроков. Ведущему не
приходится вручную собирать бланки ответов и вносить их в ведомость, система
делает это автоматически.


Удешевление прохождения игры. После интеграции системы отпала
необходимость в распечатывании бланков ответов, ведомостей и расходного
материала.
Недостатки:

Необходимость
установки
нужного
программного
обеспечения
командам. В процессе интеграции обнаружилось, что требуемое ПО( Telegram)
установлено только у 80% игроков(4/6 человек), что затратило время на установку
и настройку ПО.

Необходимость вложения денежных средств в хостинг серверов.
Тестовая игра проходила на локальном сервере с использованием одной сети wifi. Однако, при увеличении числа пользователей или расширении площадки
локальная сеть перестанет удовлетворять требованиям, и качество сигнала будет
снижено.
Таким образом, внедрение системы в реально существующую игру показало
сильные и слабые стороны данного продукта. Результаты тестирования можно
считать
успешными,
пользовательского
и
можно
удостовериться
администраторского
в
модулей.
корректной
Так
же
работе
результаты
тестирования на тестовой игре показали существенное уменьшение времени
проведения игр, уменьшение трудозатратности и возможности интеграции в
более крупные форматы проведения интеллектуальных игр.
51
ЗАКЛЮЧЕНИЕ
Задача
автоматизации
проведения
интеллектуальных
игр
является
актуальной, так как области и возможности ее применения весьма велики. В
рамках данной выпускной квалификационной работы система осуществляет
проведение и подготовку игр с целью дальнейшего внедрения в проводимые
турниры и лиги.
В ходе выполнения данной работы были выполнены все поставленные
задачи. Проведен анализ предметной области, выявлены критерии и виды
проведения игр. Был проведен сравнительный анализ и обзор систем-аналогов, с
помощью которого были рассмотрены достоинства и недостатки существующих
систем и предметной области.
На основании выявленных требований были сформулированы и описаны
спецификации
и
требования,
рассмотрены
особенности
проведения
интеллектуальных игр.
Далее было проведено проектирование базы данных автоматизированной
системы проведения интеллектуальных игр, построена схема базы данных,
описаны сущности и связи.
На
этапе
спроектированы
проектирования
модули,
была
проведена
построена
разработка
структура
алгоритмов
системы,
регистрации,
считывания и отправления вопросов, проверки пользовательских ответов.
Проведено проектирование пользовательских интерфейсов и рассмотрены
структуры данных, использованных в системе.
На завершающем этапе работы были выбраны программные средства
реализации системы проведения интеллектуальных игр, были реализованы
алгоритмы регистрации, проведения игр и подсчета пользовательских данных.
Таким образом, можно сделать вывод о том, что поставленная цель была
достигнута.
52
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
1. Зандстра М., PHP: объекты, шаблоны и методики программирования, 3-е
издание = PHP Objects, Patterns and Practice, Third Edition — М.: «Вильямс», 2010.
— С. 560. — ISBN 978-5-8459-1689-1.
2. Суэринг С., Конверс Т., Джойс П. PHP и MySQL. Библия программиста,
2-е издание = PHP 6 and MySQL 6 Bible — М.: «Диалектика», 2010. — 912 с. —
ISBN 978-5-8459-1640-2
3.
Кнут Д. Искусство программирования, том 1. Основные алгоритмы
= The Art of Computer Programming, vol.1. Fundamental Algorithms — 3-е изд. —
М.: «Вильямс», 2006. — С. 720. — ISBN 0-201-89683-4
4.
Буркхардт Т. Хуфнагель, Взаимодействие с пользователем: тайное
исскуство, которые у всех на виду [Электронный ресурс] Режим доступа:
https://msdn.microsoft.com/ru-ru/library/ee914375.aspx (Дата обращения 10.03.2018)
5.
Mark Lutz. Learning Python, 3rd Edition. O’Reilly Media, Inc, 2007.
6.
Автоматизация бизнес-процессов – светлое будущее отечественных
компаний [Текст] / В. Андреев // Директор информационной службы. – 2008. №1. – С. 68-71.
7.
Сун Л. Интеллектуальная игра дебаты: формы организации
и особенности проведения // Наука и школа. - 2012. - № 5. - С. 58-61.
8.
Методические рекомендации по подготовке и проведению
деловых игр. – М. : Изд-во ИМХО , 2004. - 89 с.
Свердловская ОУНБ; КХ; Формат С; Инв. номер 2263363-КХ
9.
Бушев А.А. Автоматизация проведения интеллектуальных игр в
универститах //Наука, образование, общество глазами молодых: Материалы 11
Международной научно-практической конференции студентов и молодых
ученых. – Украина, Ровно: РВВ РДГУ. - 2018 - 351c
10. Путляева, Л. О развитии мышления / Л. Путляева //
Дошкольное воспитание. – 2006. - № 5. – С. 35-38.
53
11. Бабич, А. В. UML. Первое знакомство. Пособие для подготовки к
сдаче теста UMO-100 (OMG Certified UML Professional Fundamental) (+ CD-ROM)
/ А.В. Бабич. - М.: Бином. Лаборатория знаний, 2008. - 176 c.
12. Буч, Грейди Язык UML. Руководство пользователя / Грейди Буч ,
Джеймс Рамбо , Айвар Джекобсон. - М.: ДМК, 2015. - 432 c.
13.
Шилин, К. Ю. Макропроектирование компьютерных обучающих
систем / К.Ю. Шилин. - М.: Издательский дом "Дело" РАНХиГС, 2013. - 184 c.
14. Лутц, М. Программирование на Python, I том / М. Лутц. - СПб.:
Символ-плюс, 2015. - 992 c.
15. Ю.Г.Карпов Теория автоматов: Учебник для вузов. - 1-е издание. –
СПб: Издат. дом ПИТЕР, 2003 год. - 208с.
16. Гецци, Карло Основы инженерии программного обеспечения / Карло
Гецци , Мехди Джазайери , Дино Мандриоли. - М.: БХВ-Петербург, 2005. - 832 c.
17. Зелковиц, М. Принципы разработки программного обеспечения / М.
Зелковиц, А. Шоу, Дж. Гэннон. - М.: Мир, 1982. - 368 c.
18. Мацяшек, Л.А. Практическая программная инженерия на
основе учебного примера / Л.А. Мацяшек. - М.: Бином. Лаборатория
знаний, 2013. - 424 c.
19. Кулагина, И. Ю. Возрастная психология : Развитие человека от
рождения до поздней зрелости : Учеб. пособие / И. Ю. Кулагина, В. Н. Колюцкий.
– М. : ТЦ «Сфера», при участии «Юрайт-М», 2001. – 464 с. (88.8 К-90
К821566ч/з)
20. Никсон Р. Создаем динамические веб-сайты с помощью PHP, MySQL
и JavaScript. Спб.: Питер, 2011 – 496 с.
21. Пьюривал С. Основы разработки веб-приложений. СПб: Питер, 2015 –
272 с.
22. Гарнаев, Андрей WEB-программирование на Java и JavaScript /
Андрей Гарнаев Сергей Гарнаев. - М.: БХВ-Петербург, 2005. - 822 c.
54
ПРИЛОЖЕНИЕ А
(обязательное)
Листинг модуля взаимодействия с пользователем
import json
import telebot
import config
from telebot import apihelper
from datetime import datetime
import MySQLdb
import time
import dbworker
import datetime
bot = telebot.TeleBot(config.token)
apihelper.proxy = {'https': '66.70.147.197:3128'}
db = MySQLdb.connect(host="localhost", user="root", passwd="", db="diplom",
charset='utf8')
cursor = db.cursor()
@bot.message_handler(commands=["help"])
def help_msg(message):
bot.send_message(message.chat.id,'Привет. Вы вызвали пользовательскую
справку. Чтобы зарегистрировать команду на игру Введите команды
/register и следуйте дальнейшим инструкциям. Для связи с
администратором писать @andbush.')
@bot.message_handler(commands=["register"])
def help_msg(message):
bot.send_message(message.chat.id,'Привет. Выберите игру, на которую
хотите зарегистрироваться.')
getgame = """SELECT * FROM game """
cursor.execute(getgame)
games=cursor.fetchall()
for game_check in games:
gId,gName,gDate = game_check
55
gmInfo=str(gId)+' '+gName+' '+str(gDate)
bot.send_message(message.chat.id,gmInfo)
@bot.message_handler(regexp="^\d+$")
def get_game(message):
global _game
_game= message.text
bot.send_message(message.chat.id,'Введите название команды в
следующем сообщении. В названии команды не должно содержаться
нецензурных слов или выражений.')
@bot.message_handler(content_types=["text"]) def get_name(message):
print(_game)
flag = 1
# INSERT INTO `team` (`id`, `name`, `telegram_id`) VALUES (NULL,
'testtest', '111');
sql = """SELECT * FROM team """
cursor.execute(sql)
data = cursor.fetchall()
for team in data:
nid,name,tid =
team #print(name)
if message.text==name: bot.send_message(message.chat.id,'Ошибка,
такая команда
уже зарегистрирована.')
flag = 0
if flag == 1:
bot.send_message(message.chat.id,'Вы успешно зарегистрированы
на ближайшую игру.')
try:
cursor.execute("""INSERT INTO team
VALUES (%s,%s,%s)""",('',message.text,message.from_user.id))
db.commit()
except:
db.rollback()
sql = """SELECT id FROM team WHERE name= '{}'
""".format(message.text)
print(sql)
cursor.execute(sql)
data1 = cursor.fetchall()
56
for qid in data1:
nid = qid
if flag == 1:
try:
cursor.execute(""" INSERT INTO `teams` (`id`,
`team`, `game`) VALUES (%s,%s,%s) """,('',nid,_game))
db.commit()
except:
db.rollback()
@bot.message_handler(commands=["test"])
def test(message):
get_toures=""" SELECT id FROM toures """
cursor.execute(get_toures)
toures=cursor.fetchall()
print (toures)
for k in toures:
get_quest= """ SELECT question FROM questions WHERE tour={}
""".format(x)
print(get_quest)
@bot.message_handler(commands=["start"])
def game(message):
get_toures=""" SELECT id FROM toures """
cursor.execute(get_toures)
touress=cursor.fetchall()
print (touress)
for k in touress:
toures=k
toures= str(toures)[1:2]
print(toures)
#question=0
get_team =""" SELECT id FROM team WHERE telegram_id={}
""".format(message.from_user.id)
cursor.execute(get_team)
team = cursor.fetchall()
57
#print(team)
get_quest= """ SELECT question FROM questions WHERE tour={}
""".format(toures)
print(get_quest)
bot.send_message(message.chat.id,'Game is start')
cursor.execute(get_quest)
questions = cursor.fetchall()
_answers= []
for qst in questions:
qsst = qst
for i in range(len(questions)):
bot.send_message(message.chat.id,questions[i])
now = datetime.datetime.now()
print(_answers)
dbworker.set_state(message.chat.id,
config.States.S_WAITING.value)
_Flag=0
#print(_Flag)
while _Flag == 0 :
now1 = datetime.datetime.now()
now1=now1-now
#print(now1.seconds)
if now1.seconds==50:
bot.send_message(message.chat.id,'Прошло 50 секунд')
if now1.seconds==60:
bot.send_message(message.chat.id,'Время истекло')
break
@bot.message_handler(func=lambda message:
True,content_types=["text"])
def get_answer(message):
dbworker.set_state(message.chat.id,
config.States.SENDING.value)
nonlocal _answers
_answers.append(message.text)
nonlocal _Flag
#print(_Flag)
_Flag=1
print(_answers)
for i in range(len(_answers)):
print(_answers[i])
58
try:
cursor.execute(""" INSERT INTO `answers` (`id`, `answer`,
`team`) VALUES (%s,%s,%s) """,('',_answers[i],team))
db.commit()
except:
db.rollback()
if __name__ == '__main__':
bot.polling(none_stop=True)
from enum import Enum
token ='555433952:AAFAMEWM5hJGvnnbeVW1EXpABpVwaoPl4Ts'
db_file = "database.vdb"
class States(Enum):
S_START = "0"
S_WAITING = "1"
S_SENDING = "2"
S_END = "3"
Листинг создания базы данных
CREATE TABLE Команда (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
Название VARCHAR NULL,
Телеграм_id VARCHAR NULL,
PRIMARY KEY(id)
);
CREATE TABLE Игра (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
Название TEXT NULL,
Дата DATE NULL,
PRIMARY KEY(id)
);
CREATE TABLE Игроки (
59
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
Команда_id INTEGER UNSIGNED NOT NULL, Имя
VARCHAR NULL,
Фамилия VARCHAR NULL,
PRIMARY KEY(id),
INDEX Игроки_FKIndex1(Команда_id)
);
CREATE TABLE Вопросы (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
Игра_id INTEGER UNSIGNED NOT NULL, Вопрос
VARCHAR NULL,
Тур INTEGER UNSIGNED NULL,
PRIMARY KEY(id),
INDEX Вопросы_FKIndex1(Игра_id)
);
CREATE TABLE Ответы (
Команда_id INTEGER UNSIGNED NOT NULL,
Вопросы_id INTEGER UNSIGNED NOT
NULL, Ответ VARCHAR NULL,
PRIMARY KEY(Команда_id, Вопросы_id),
INDEX Команда_has_Вопросы_FKIndex1(Команда_id),
INDEX Команда_has_Вопросы_FKIndex2(Вопросы_id)
);
CREATE TABLE Игра_has_Команда (
Игра_id INTEGER UNSIGNED NOT NULL,
Команда_id INTEGER UNSIGNED NOT NULL,
PRIMARY KEY(Игра_id, Команда_id),
INDEX Игра_has_Команда_FKIndex1(Игра_id),
INDEX Игра_has_Команда_FKIndex2(Команда_id)
);
Листинг модуля администрирования
<?php
if(isset($_POST['submit'])){
if(!empty($_POST['data'])) {
// Counting number of checked checkboxes.
// Loop to store and display values of individual checked
checkbox. $s=$_POST['data'];
60
print_r($s);
foreach($_POST['data'] as $selected) {
echo "<p>".$selected ."</p>";
}
}
else{
echo "<b>Please Select Atleast One Option.</b>";
}
}
?>
<?php
require_once("../database.php");
require_once("../models/game.php");
$link=db_connect();
$answers = answers_all($link);
$teams= teams_all($link);
if (isset($_GET['action']))
$action =$_GET['action'];
else
$action="";
if ($action== "add"){
if (!empty($_POST)){
answers_update($link,$_POST['data']);
header("location:index.php");
#include("../views/gametest.php");
}
}else if($action=="watch"){
header("location:res.php");
exit;
}
61
include("../views/game.php")
?>
<?php
require_once("../database.php");
require_once("../models/game.php");
$link=db_connect();
$answers = answers_all($link);
$teams= teams_all($link);
$arr=[];
$itog=[];
$q=0;
foreach ($teams as $t){
$arr[$q]=$t["id"];
$q++;
}
for ($i=0;$i<count($arr);$i++){
$sum=0;
foreach($answers as $a) {
if ($a["team"]==$arr[$i]){
$sum+=$a["correct"];
}
}
$itog[$i]=$sum;
$itogg=[];
$n=0;
foreach ($teams as $t){
$itogg[$t["name"]][email protected]$itog[$n];
$n++;
}
62
}
include("../views/result.php")
?>
<?php
function answers_all($link){
$query = "SELECT * FROM answers ";
$result = mysqli_query($link, $query);
if (!$result)
die(mysqli_error($link));
$n= mysqli_num_rows($result);
$answers = array();
for ($i= 0; $i< $n; $i++)
{
$row = mysqli_fetch_assoc($result);
$answers[] = $row;
}
return $answers;
}
function answers_update($link,$data){
// $filename = 'test.txt';
// $dt= serialize($data);
// file_put_contents($filename, $dt);
foreach($data as $d) {
$sql = "UPDATE answers SET correct=1 WHERE answers.id ='%s'";
$query=sprintf($sql,$d);
$result = mysqli_query($link,$query);
if (!$result)
die(mysqli_error($link));
}
}
function teams_all($link){
$query = "SELECT t.id,tt.name from team AS tt
LEFT JOIN teams as t on t.id=tt.id LEFT JOIN
answers as a on a.id=t.id
WHERE t.id is NOT null
";
63
$result = mysqli_query($link, $query);
if (!$result)
die(mysqli_error($link));
$n= mysqli_num_rows($result);
$teams = array();
for ($i= 0; $i< $n; $i++)
{
$row = mysqli_fetch_assoc($result);
$teams[] = $row;
}
return $teams;
}
?>
<?php
function articles_all($link){
$query = "SELECT * FROM team ORDER BY id
DESC"; $result = mysqli_query($link, $query); if
(!$result)
die(mysqli_error($link));
$n= mysqli_num_rows($result);
$articles = array();
for ($i= 0; $i< $n; $i++)
{
$row = mysqli_fetch_assoc($result);
$articles[] = $row;
}
return $articles;
}
?>
<?php
function game_all($link){
$query = "SELECT * FROM game ";
$result = mysqli_query($link, $query);
if (!$result)
die(mysqli_error($link));
$n= mysqli_num_rows($result);
$game = array();
for ($i= 0; $i< $n; $i++)
64
{
$row = mysqli_fetch_assoc($result);
$game[] = $row;
}
return $game;
}
<?php
require_once("../database.php");
require_once("../models/newGame.php");
$link=db_connect();
#$articles = articles_all($link);
include("../views/newGame.php");
if (isset($_GET['action']))
$action =$_GET['action'];
else
$action="";
if ($action== "add"){
header("location:selectGame.php");
}
?>
<?php
require_once("../database.php");
require_once("../models/newGame.php");
require_once("index.php");
$link=db_connect();
$games = game_all($link);
include("../views/selectgame.php");
if (isset($_GET['action']))
$action =$_GET['action'];
else
$action="";
65
if ($action== "select"){
include("../views/enterQuest.php");
}
if(isset($_POST["Import"])){
$filename=$_FILES["file"]["tmp_name"];
if($_FILES["file"]["size"] > 0)
{
$file = fopen($filename, "r");
while (($getData = fgetcsv($file, 10000, ",")) !== FALSE)
{
$sql = "INSERT into qustions (id,question,tour,game,)
values ('".$getData[0]."';'".$getData[1]."';'".$getData[2]."';'".$getData[3].")";
$result = mysqli_query($con, $sql);
if(!isset($result))
{
echo "<script type=\"text/javascript\">
alert(\"Invalid File:Please Upload CSV
File.\");
window.location = \"index.php\"
</script>";
}
else {
echo "<script type=\"text/javascript\">
alert(\"CSV File has been successfully
Imported.\");
window.location = \"index.php\"
</script>";
}
}
fclose($file);
}
}
66
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dA
iS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93h
XpG5KkN" crossorigin="anonymous"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
integrity="sha384ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0
b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
integrity="sha384JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVC
mYl" crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<form action="../newGame/selectGame.php" method="post"
name="upload_excel" enctype="multipart/form-data"> >
Выберите файл: <input name="myFile"
type="file"> <br>
<button type="submit" id="submit" name="Import" class="btn btn-primary
button-loading" data-loading-text="Loading...">Загрузить</button>
</form>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
67
<meta charset="utf-8">
<title></title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dA
iS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93h
XpG5KkN" crossorigin="anonymous"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
integrity="sha384ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0
b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
integrity="sha384JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVC
mYl" crossorigin="anonymous"></script>
</head>
<body>
<!-- NAVBAR
================================================== -->
<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="../index.php">Редактор
игр</a> </li>
<li class="nav-item">
<a class="nav-link" href="#">Текущая игра</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../newGame/">Добавить игру</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../admin">Админпанель</a> </li>
68
</ul>
</nav>
<br>
<div class="container">
<form method= "post" action ="index.php?action=add">
<table class="table">
<?php foreach($answers as $a): ?>
<tr>
<td>Команда:
<?php foreach($teams as $t): ?>
<?php if ($a["team"]== $t["id"]) {
echo($t["name"]);
} ?>
<?php endforeach ?>
</td>
<td>Ответ: <?=$a["answer"] ?> </td>
<td>
<input type='checkbox' name='data[]' class='checkord' value="<?php echo
$a["id"];?>">
</td>
</tr>
<?php endforeach ?>
</table>
<input type="submit" value="Сохранить" class="btn">
</form>
<br>
<form method= "post" action ="index.php?action=watch">
<input type="submit" value="Вывести результаты"
class="btn"> <?php# include 'gametest.php';?> </form>
</div>
69
<!-- clock widget start -->
<script type="text/javascript"> var css_file=document.createElement("link");
css_file.setAttribute("rel","stylesheet"); css_file.setAttribute("type","text/css");
css_file.setAttribute("href","//s.bookcdn.com//css/cl/bw-cl-120x45.css");
document.getElementsByTagName("head")[0].appendChild(css_file); </script>
<div id="tw_6_1590775470"><div style="width:130px; height:45px; margin: 0
auto;"><a href="http://nochi.com/time/orel-36685">Орёл</a><br/></div></div>
<script type="text/javascript"> function setWidgetData_1590775470(data){
if(typeof(data) != 'undefined' && data.results.length > 0) { for(var i = 0; i <
data.results.length; ++i) { var objMainBlock = ''; var params = data.results[i];
objMainBlock =
document.getElementById('tw_'+params.widget_type+'_'+params.widget_id);
if(objMainBlock !== null) objMainBlock.innerHTML = params.html_code; } } }
var clock_timer_1590775470 = -1; </script> <script type="text/javascript"
charset="UTF-8"
src="https://widgets.booked.net/time/info?ver=2&domid=589&type=6&id=1590
775470&scode=124&city_id=36685&wlangid=20&mode=1&details=0&backgro
und=ffffff&color=333333&add_background=a0a1a1&add_color=08488d&head_
color=333333&border=0&transparent=0"></script>
<!-- clock widget end -->
<footer class="page-footer font-small blue pt-4 mt-4">
<!--Copyright-->
<div class="footer-copyright py-3 textcenter"> © 2018 Copyright:
<a href="https://mdbootstrap.com/material-design-for-bootstrap/">
MDBootstrap.com </a>
</div>
</footer>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
70
<title></title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dA
iS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93h
XpG5KkN" crossorigin="anonymous"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
integrity="sha384ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0
b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
integrity="sha384JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVC
mYl" crossorigin="anonymous"></script>
</head>
<body>
<!-- NAVBAR
================================================== -->
<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Редактор игр</a>
</li>
<li class="nav-item">
<a class="nav-link" href="Game">Текущая
игра</a> </li>
<li class="nav-item">
<a class="nav-link" href="newGame">Добавить игру</a>
</li>
<li class="nav-item">
<a class="nav-link" href="admin">Админпанель</a> </li>
</ul>
71
</nav>
<div class="container">
Главная страница
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dA
iS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93h
XpG5KkN" crossorigin="anonymous"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
integrity="sha384ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0
b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
integrity="sha384JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVC
mYl" crossorigin="anonymous"></script>
</head>
<body>
<!-- NAVBAR
================================================== -->
<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
<ul class="navbar-nav">
<li class="nav-item active">
72
<a class="nav-link" href="../index.php">Редактор
игр</a> </li>
<li class="nav-item">
<a class="nav-link" href="../Game">Текущая
игра</a> </li>
<li class="nav-item">
<a class="nav-link" href="#">Добавить
игру</a> </li>
<li class="nav-item">
<a class="nav-link" href="../admin">Админпанель</a> </li>
</ul>
</nav>
<br>
<div class="container">
<a href="index.php?action=add" class='btn btn-primary'> Добавить игру </a>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dA
iS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93h
XpG5KkN" crossorigin="anonymous"></script>
73
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
integrity="sha384ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0
b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
integrity="sha384JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVC
mYl" crossorigin="anonymous"></script>
</head>
<body>
<a href="../game/index.php" class='btn btn-primary'> Back </a>
<div class="container">
<table class="table">
<?php foreach($itogg as $key => $value): @$p++; ?>
<tr>
<td>Место <?=$p ?> </td>
<td>
Команда: <?=$key?>
</td>
<td>Ответов: <?=$value ?> </td>
</tr>
<?php endforeach ?>
<?php
//
// foreach($itogg as $key => $value)
// echo ("<tr>");
// {
// echo "<td>".$key. "</td>";
// echo "<td>".$value ."</td>";
// }
//echo ("</tr>");
?>
74
</div>
</table>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dA
iS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93h
XpG5KkN" crossorigin="anonymous"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
integrity="sha384ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0
b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
integrity="sha384JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVC
mYl" crossorigin="anonymous"></script>
</head>
<body>
<!-- NAVBAR
================================================== -->
<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="../index.php">Редактор
игр</a> </li>
<li class="nav-item">
<a class="nav-link" href="../Game">Текущая
игра</a> </li>
75
<li class="nav-item">
<a class="nav-link" href="#">Добавить
игру</a> </li>
<li class="nav-item">
<a class="nav-link" href="../admin">Админпанель</a> </li>
</ul>
</nav>
<script>
function check_game(id) {
var game1=document.getElementById(id);
if (game1.style.border==''){
game1.style.border="2px solid green";
}
else {
img1.style.border="";
}
var temp=id;
var image = document.getElementById(id);
document.getElementById('type1').value=test;
}
</script>
<br>
<div class="container">
<?php foreach($games as $g): ?>
<tr>
<td >Номер:<?= $g["id"]?>
</td>
<td>Название: <?=$g["name"] ?> </td>
<td>
Дата проведения: <?=$g["date"] ?>
</td>
</tr>
<?php endforeach ?>
76
<br>
Выберите игру: <select name="type" data-style="btnprimary"> <option value=""></option>
<?php foreach ($games as $g){
echo ("<option value=\" ".$g["id"]." \">".$g["name"]."</option>");
}
?>
</select>
<br>
<a href="selectGame.php?action=select" class='btn btn-primary'> Выбрать
</a>
</div>
</body>
</html>
<?php
define('MYSQL_SERVER','localhost');
define('MYSQL_USER','root');
define('MYSQL_PASSWORD','root');
define('MYSQL_DB','diplom');
function db_connect(){
$link =
mysqli_connect(MYSQL_SERVER,MYSQL_USER,MYSQL_PASSWO
RD,M YSQL_DB)
or die("error". mysqlli_error($link));
return $link;
}
?>
<?php
require_once("database.php");
require_once("models/index.php");
$link=db_connect();
$articles = articles_all($link);
include("views/index.php")
?>
78
ИНФОРМАЦИОННО-ПОИСКОВАЯ ХАРАКТЕРИСТИКА
ДОКУМЕНТА НА ЭЛЕКТРОННОМ НОСИТЕЛЕ
Наименование
группы атрибутов
атрибута
1. Описание
Обозначение документа
документа
(идентификатор(ы)
файла(ов))
Наименование документа
Класс документа
Вид документа
Аннотация
Использование
документа
2. Даты и время
3. Создатели
4. Внешние
ссылки
5. Защита
6. Характеристики
содержания
Дата и время
копирования документа
Дата создания документа
Дата утверждения
документа
Автор
Изготовитель
Ссылки на другие
документы
Санкционирование
Классификация защиты
Объем информации
документа
Характеристики документа
на электронном носителе
\Вкр_Бушев_140037.pptx
Демонстрационные плакаты
к выпускной
квалификационной работе
ЕСКД
Оригинал документа на
электронном носителе
Демонстрационный
материал, отображающий
основные этапы выполнения
выпускной
квалификационной работы
Операционная система
Windows 10, Microsoft
PowerPoint 2016
13.06.2018
17.06.2018
18.06.2018
Бушев А.А.
Бушев А.А.
Удостоверяющий лист
№ 140037
ОГУ имени И.С. Тургенева
По законодательству РФ
574000 Б
79
7. Структура
документа(ов)
Наименование плаката
(слайда) №1
Наименование плаката
(слайда) №2
Наименование плаката
(слайда) №3
Наименование плаката
(слайда) №4
Наименование плаката
(слайда) №5
Наименование плаката
(слайда) №6
Наименование плаката
(слайда) №7
Наименование плаката
(слайда) №8
Наименование плаката
(слайда) №9
Наименование плаката
(слайда) №10
Наименование плаката
(слайда) №11
Наименование плаката
(слайда) №12
Наименование плаката
(слайда) №13
Титульный лист
Цели и задачи работы
Сравнение системы с
аналогами
Функциональное
моделирования
Функциональное
моделирования
Концептуальная схема базы
данных
Диаграмма состояний
переходов
Схема алгоритма
регистрации команд
Схема алгоритма
отправления вопросов
Схема алгоритмов
считывания вопросов и
проверки ответов
Пример работы программы
Пример работы программы
Пример работы программы
1/--страниц
Пожаловаться на содержимое документа