Социальная интеллектуальная игра «ЗаБотань!»

Автор работы: Пользователь скрыл имя, 18 Декабря 2013 в 18:34, курсовая работа

Описание работы

Идея совместить популярные игровые механики и интеллектуальное развитие пришла ко мне ещё в 8-ом классе. Для реализации мечты не хватало опыта и единомышленников. БГУИР дал мне и то, и то другое. Я знал, что проект должен быть прост в реализации, а порог входа на выбранный рынок должен быть как можно ниже. И я выбрал рынок социальных игр.

Содержание работы

Введение 3
Классификация игры, сюжет и миссия 4
Структура программы 5
Диаграмма классов 6
Основные алгоритмы 7
Описание игрового процесса 9
Описание игровых вещей Ошибка! Закладка не определена.12
Описание игрового баланса Ошибка! Закладка не определена.13
Заключение 14
Литература 15
Исходный код…………………………………………….…………………………………………….16

Файлы: 1 файл

Пояснительная записка Заботань!.docx

— 739.55 Кб (Скачать файл)

МИНИСТЕРСТВО  ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

Учреждение  Образования 

«Белорусский  Государственный Университет Информатики  и Радиоэлектроники»

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

 

 

 

 

 

 

 

 

 

 

 

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

 

к курсовому проекту по курсу «Объектно-ориентированное  программирование»

 

Тема: Социальная интеллектуальная игра «ЗаБотань!»

 

 

 

 

 

 

Выполнил студент гр. 052002

Грицовец Б.Д.

 

Проверил

Галковский А.В.

 

 

 

 

 

Минск 2012

 

 

Оглавление

Введение 3

Классификация игры, сюжет и миссия 4

Структура программы 5

Диаграмма классов 6

Основные алгоритмы 7

Описание игрового процесса 9

Описание игровых  вещей Ошибка! Закладка не определена.12

Описание игрового баланса Ошибка! Закладка не определена.13

Заключение 14

Литература 15

Исходный код…………………………………………….…………………………………………….16  

 

 

 

 

 

 

 

 

 

 

 

 

 

Введение

 

Идея совместить популярные игровые механики и интеллектуальное развитие пришла ко мне ещё в 8-ом классе.  Для реализации мечты  не хватало опыта и единомышленников. БГУИР дал мне и то, и то другое. Я знал, что проект должен быть прост в реализации, а порог входа на выбранный рынок должен быть как можно ниже. И я выбрал рынок социальных игр.

Что такое социальная игра (игра для соц. сетей)? Вот какой ответ даёт Википедия:

Игры для социальных сетей — разновидность онлайн игр, которые распространяются преимущественно через социальные сети, в большинстве случаев являются многопользовательскими. Игры в социальных сетях в основном браузерные, они не требуют установки на компьютер пользователя и доступны со многих устройств, через которые доступна конкретная социальная сеть. Игры в социальных сетях — одни из лидеров по популярности во всем мире, некоторые имеют десятки миллионов игроков. Mafia Wars, FarmVille и FrontierVille — пример популярных игр в Facebook.

Технологии, используемые для  разработки игр для социальных сетей, те же, что и для подобных казуальных онлайн игр — Adobe Flash, PHP или JavaScript, для разработки некоторых игр используются все технологии в комплексе.

Игры в социальных сетях  имеют много сходств с традиционными  компьютерными играми, тем не менее  они имеют ряд отличительных  особенностей:

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

 

Классификация игры

Название  игры: «ЗаБотань!» 
Жанр: социальная интеллектуальная игра

Классификация по количеству пользователей: многопользовательская игра.

Сюжет

«ЗаБотань» - это маленький мирок, где Знания решают всё. Игроки сражаются за место под Солнцем, используя исключительно свои Мозги.

Миссия  игры

Делать людей образованнее и не давать им при этом соскучиться.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Структура программы

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

Рассмотрим основные классы, реализованные в программе.

public class Config

Класс содержит в себе набор  важных полей, таких как Название БД, ИП адрес сервера и другие. Данные подгружаются из xml-файла.

 

class ResultSet

partial class Database

Класс Database служит для работы с базой данных. В класс ResultSet записывается выборка данных, полученная из базы данных.

 

public static class Log

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

 

class HttpSocket

Класс содержит методы, для  работы с АПИ соц.сети. Специальный  менеджер посылает и получает данные.

 

public class MainSocket

Класс служит для настройки  соединения с клиентскими приложениями.

 

class ClientManager

После соединения сервера  с клиентским приложением, именно ClientManager работает с ним дальше, вплоть до того момента, как игрок отключается. Для каждого клиента создаётся  отдельный поток.

 

public class WorldServer

Класс содержит необходимые  данные для игрового процесса: список игроков, список вопросов, список предметов,  методы подбора подходящего противника и др.

Диаграмма классов

 

 

 

 

 

 

 

Основные  алгоритмы

Логика подбора противника

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

        public static Client GetEnemy(Client old)

        {

            try

            {

                int brain = old.GetAllBrains;

                IEnumerable<Client> enemy = world_players.Where(c => c.ID != old.ID && c.Flag == PlayerFlags.PVP && c.Fight.Status == FightStatus.Wait && (Math.Abs(c.GetAllBrains - brain) <= Config.RaznicaBrains));

                if (enemy.Count() == 1)

                    return enemy.ElementAt(0);

                else if (enemy.Count() > 1)

                    return enemy.ElementAt(rand_q.Next(0, enemy.Count() - 1));

                else return null;

            }

            catch(Exception ex)

            {

                Log.Write(EType.Error, "{0} GetEnemy error:{1}", old.ID, ex.ToString());

                return null;

            }

        }

Логика боя

В потоке для работы с  клиентом во время боя каждый такт происходят  3 ключевые проверки:

  • не умер ли игрок – если да, то бой окончен.
  • не ответил ли он на вопрос – если игрок ответил правильно, то в противника полетит пуля; если игрок ответил неверно – он продолжает отвечать на вопрос.
  • не словил ли он пулю противника – если да, то у него отнимется концентрация (hp)

else if (thisclient.Fight.Status == FightStatus.Fighting)

{

var enemy = thisclient.Fight.Enemy;

 

if (enemy == null || (!enemy.IsBot && !WorldServer.world_players.Contains((Client)enemy)))

{

thisclient.Fight.End();

break;

}

 

if (thisclient.Fight.TryDie())

break;

thisclient.Fight.TrySendQuestion();

 

thisclient.Fight.TryBullet();

}

        public bool TryDie()

        {

            if ((_owner.CurrentHP <= 0f || Enemy.CurrentHP <= 0f) &&

                 Bullet.Count == 0 && Enemy.Fight.Bullet.Count == 0)

            {

                End();

                return true;

            }

            return false;

        }

 

 

 

        public void TrySendQuestion()

        {

            if (SelectedQuest == null && Enemy.CurrentHP > 0f && TimeShowRespone < DateTime.Now)

            {

                _owner.SendQuestion();

            }

        }

 

 

 

        public void TryBullet(bool isManiken = false)

        {

 

            for (int j = 0; j < Bullet.Count; j++)

            {

                Bullet b = Bullet[j];

                if ((DateTime.Now - b.StartTime).TotalMilliseconds > Config.TimeForBullet)

                {

                    if (!isManiken && _owner.CurrentHP == _owner.MaxHP && Enemy.CurrentHP == Enemy.MaxHP && ResponeCounts == 1)

                    {

                        AwardsManager.UA_FirstBlood(_owner, 1);

                    }

                    Enemy.CurrentHP -= b.Dmg;

                    Bullet.RemoveAt(j);

                }

            }

        }

 

 

 

 

 

 

 

Описание игрового процесса

 

Суть игры: победить противника, правильно отвечая на вопросы.

 

 

В игре существует несколько  режимов боя:

  • Бой с манекеном (манекен не атакует – нет ограничения по времени)
  • Бой с аватаром (аватар слабо атакует игрока)
  • Бой на арене (бой с живым противником в режиме онлайн)
  • Бой с другом (бой «на интерес» с другом в режиме онлайн)

 

 

 

Рейтинг игроков по нескольким параметрам:

  • Слава
  • Знания
  • Деньги

 

 

 

 

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

 

 

Наградами можно похвастать перед друзьями.

 

 

 

 

 

Описание  игровых вещей

Кофе – прибавляет 10% концентрации игроку во время боя

Шпаргалка – убирает 2 неверных ответа.

Супер шпора – убирает все неверные ответы.

Батарейка – повышает уровень сложности вопроса.  
 
Заморозка  - «замораживает» текущую науку противника до конца боя. 
 
Перевёртыш – переворачивает буквы в вопросе и вариантах ответа противника

Билет в кино – увеличивает запас Концентрации на 10% (действует 36 часов)

 

 

 

 

 

Описание  игрового баланса

В таблице ставится соответствие значений Знаний, Концентрации (hp), Урона (damag) уровню противника.

 

 

 

 

 

 

 

 

 

 

Заключение

 

В ходе выполнения данного  курсового проекта мною была создана  компьютерная игра, сочетающая в себе концепции написания игр и  объектно-ориентированного программирования. Я более подробно изучил платформу .NET Framework. Я горжусь тем, что игра вышла на широкую аудиторию, и приносит конкретную пользу другим людям. Я считаю, что за развивающими играми – будущее нашего образования.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Литература

 

  1. Язык программирования С# 2010 и платформа .NET 4.0 5-е издание – Эндрю Троелсен, 2011
  2. А. Волосевич. Базовые технологии платформы .NET. Минск, 2011
  3. http://msdn.microsoft.com/ - Microsoft Development, Subscriptions Resources and More
  4. Сайт www.devby.ru

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Исходный  код основных классов

 

Класс ClientManager

namespace BobServ

{

    class ClientManager

    {

        private static object synObj = new object();

 

        public static bool IsRun = false;

 

        public void Start()

        {

            Thread clientManagerThread;

            IsRun = true;

            for (int i = 0; i < Config.ClientManagerThreadsCount; i++)

            {

                clientManagerThread = new Thread(new ThreadStart(Update));

                clientManagerThread.Name = "ClientManagerThread["+i+"]";

                clientManagerThread.Start();

            }

            Log.Write(EType.Notice, "[ClientManager] Загружен ({0} Потоков).",Config.ClientManagerThreadsCount);

        }

        public static void Stop()

        {

            IsRun = false;

            Log.Write(EType.Notice, "CM Stopping...");

        }

       

        private void Update()

        {

            Client thisclient;

            Stopwatch sw = new Stopwatch();

            Stopwatch sw2 = new Stopwatch();

            while (true)

            {

                    try

                    {

                        if (WorldThreads.ThreadsCalculationEnabled)

                        {

                            for (int i = 0; i < WorldServer.world_players.Count; i++)

                            {

                                thisclient = WorldServer.world_players[i];

                                sw = Stopwatch.StartNew();

 

                                string startTimerStr = thisclient.ID +"|before:" + thisclient.Flag + ", fight:" + thisclient.Fight.Status;

 

                                #region bind

                                if ((DateTime.Now - thisclient.Timers.lastBind).TotalSeconds > 10)// && thisclient.Online

                                {

                                    thisclient.Destruct("ClientManager not bind");

                                    continue;

                                }

                                #endregion

                                sw.Stop();

                                if (sw.ElapsedMilliseconds > 30)

                                    Log.Write(EType.Notice, "{0} [{1}]TIME0-->{2}, {3}, after flag:{4}, fight:{5}", thisclient.ID, Thread.CurrentThread.Name, sw.ElapsedMilliseconds, startTimerStr, thisclient.Flag, thisclient.Fight.Status);

                               

                                sw = Stopwatch.StartNew();

                                if (!thisclient.Online)

                                {

                                    //thisclient.isproccess = false;

                                    continue;

                                }

                                sw.Stop();

                                if (sw.ElapsedMilliseconds > 30)

                                    Log.Write(EType.Notice, "{0} [{1}]TIME1-->{2}, {3}, after flag:{4}, fight:{5}", thisclient.ID, Thread.CurrentThread.Name, sw.ElapsedMilliseconds, startTimerStr, thisclient.Flag, thisclient.Fight.Status);

                                sw = Stopwatch.StartNew();

 

                                #region invite fvf - если нужно - отсылаем приглашение на бой

                                if (thisclient.Fight.FriendInvite != null && thisclient.Fight.Status == FightStatus.None &&

                                    !thisclient.Fight.IsFriendInviteSend)

                                {

                                    if (thisclient.Fight.FriendInvite.Flag == PlayerFlags.FVF && thisclient.Fight.FriendInvite.Fight.Status == FightStatus.Wait)

                                    {

                                        thisclient.SendFvfInvite();

Информация о работе Социальная интеллектуальная игра «ЗаБотань!»