Аналитический обзор игровых приложений

 

Содержание

 

Введение………………………………………………………………………...4

Актуальность и значение темы………………………………………………..4

Формулировка целей курсового  проекта…..…………………………………6

Аналитический обзор игровых  приложений…….…………………………...7

Описание процесса разработки………………………………………………..9

Руководство пользователя……………………………………………………15

Заключение……………………………………………………………………20

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

Приложения…………………………………………………………………...22

Приложение 1…………………………………………………………………22

 

Введение

Актуальность и значение темы

 

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

И в то же время — психологический  феномен, не иначе! — большинство  пользователей в этой любви не признаются. Существует какое-то предубеждение, не позволяющее человеку сказать: да, меня интересуют игры! Более того, чем  старше человек, тем сильнее он стесняется своего неравнодушного отношения к  «игрушкам». Зачастую противник компьютерных игр на самом деле оказывается  безнадежным игроманом.

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

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

Вообще-то пора, наконец, отдать играм должное: ведь если бы не они, персональный компьютер никогда  не стал бы таким, каким он является сегодня.

• Звуковая карта.

• Колонки.

• Мощные видеокарты с трехмерной графикой.

• Устройства «виртуальной реальности»

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

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

Как известно, нет лучшего  способа заставить человека обновить свой компьютер, как выпустить на рынок новую, особо требовательную игру. Практически никогда человек  не купит новый компьютер из-за желания установить новую версию текстового редактора. А вот для  новой игры — сколько угодно. В нашей стране это смотрится  особо комично: пользователь выкладывает 300—400 долл., оптимизируя компьютер  под...  пиратскую версию Quake за 10000 рублей.

Пожалуй, на этом отрицательные  черты игр заканчиваются и  начинаются положительные, которые  напрямую зависят от жанра. Игры бывают самыми разными, но условно их принято  делить на стратегии, 3D-Action и квесты.

Стратегии развивают способность  логически мыслить. 3D-Action и симуляторы развивают реакцию. Квесты — находчивость и нестандартное мышление. Кроме  того, любая игра дает человеку возможность  попробовать себя в новой роли, открыть в себе новые, неведомые  ранее качества... И в этом смысле польза может быть от любой игры.

В своей работе я рассмотрю  разработку несложной игры под названием  “Угадай слово”, которая не только является безобидной в противовес вышесказанному, но и отвлекает от повседневной суеты. Суть игры заключается в следующем: пользователь пытается отгадать слово  из 5-ти букв. На это у него есть 5 попыток.

 

Формулировка целей

 

Целью данного курсового  проекта является создание программного продукта, представляющего собой  игру. Область применения: досуг  и развитие словарного запаса пользователя.

Программный продукт должен реализовывать следующие функции:

   * Случайный выбор  слова из файла

   * Интуитивно понятный  механизм распознавания ошибок  пользователя

   * Учет очков для  данного пользователя 

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

   * Изменение уровня  сложности

   * Возможность выведения  подсказок при определенных условиях 

   * Возможность узнать  значение данного слова (используя  такие поисковые системы как: google.com или wordnet.princeton.edu)

Разработка будет вестись  на языке C#, платформа Microsoft .NET Framework. 

Microsoft .NET Framework – это, предложенная  компанией Microsoft, программная технология, основной задачей которой является  предоставление разработчику набора  очень удобных средств для  разработки как простых программ, так и web приложений.

В C#, за счёт наличия встроенных средств событийного программирования скрывает от разработчика детали обработки  событий и некоторые другие моменты, облегчая разработку интерфейса. На платформе .NET изначально широко использовались визуальные построители интерфейса. Всё это даёт возможности для  быстрой разработки интерфейса настольных приложений.

 

Аналитический обзор игровых  приложений

 

Первые примитивные компьютерные игры были разработаны в 1950-х и 1960-х  годах. Они работали на таких платформах, как университетские мейнфреймы и компьютеры EDSAC. Самой первой компьютерной игрой стал симулятор ракеты, созданный  в 1942 году Томасом Голдсмитом Младшим  и Истл Рей Менном.

На сегодняшний день компьютерные игры могут быть классифицированы по нескольким признакам:

   * Жанр: игра может  принадлежать как к одному, так  и к нескольким жанрам, а в  уникальных случаях — открывать  новый или быть вне всяких  жанров;

   * Количество игроков  и способ их взаимодействия: игра  может быть однопользовательской  — рассчитанной на игру одного  человека, или многопользовательской  — рассчитанной на одновременную  игру нескольких человек; а  также вестись на одном компьютере, через интернет, электронную почту,  или массово;

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

   * Платформа: игра  может принадлежать как к одной  платформе, так и быть мультиплатформенной.

 

Вследствие того, что критерии принадлежности игры к тому или иному  жанру не определены однозначно, классификация  компьютерных игр недостаточно систематизирована, и в разных источниках данные о  жанре конкретного проекта могут  различаться. Тем не менее, существует консенсус, к которому пришли разработчики игр, и принадлежность игры к одному из основных жанров почти всегда можно  определить однозначно. Эти наиболее популярные жанры (которые объединяют в себе множество поджанров) перечислены  ниже. экшен - игры с динамичным сюжетом, когда игроку приходится часто и  быстро нажимать на клавиши;

   * приключения - игры  построены на определённой истории;

   * стратегии - игры  с нетривиальными вариантами  выбора;

   * имитации - упражнения  на оптимизацию и координацию;

   * головоломки - игры  на развитие аналитического мышления;

   * забавы - программы,  предназначенные исключительно  для развлечения;

   * образовательные  - игры, построенные на принципе  обучения через игру.

 

Описание процесса разработки

 

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

Листинг класса MyFadeLabel предоставлен в приложении 1.

 

Следующим образом был  реализован основной функционал приложения.

private void StartGame()

        {

            Random r = new Random(DateTime.Now.Millisecond);

            randomPos1 = r.Next(0, WordLength);

            randomPos2 = r.Next(0, WordLength - 1);

            if (randomPos2 == randomPos1)

            {

                randomPos2++;

            }

            wordIndex = r.Next(0, words.Count);

            while (!IsWordMatchForDifficultyLevel(words[wordIndex], gameDifficulty))

            {

                wordIndex = r.Next(0, words.Count);

            }

            _currentPuzzleWord = words[wordIndex].Substring(2);

            ResetGrid();

            initLayout.Controls[randomPos1].Text = CurrentPuzzleWord[randomPos1] + "";

            initLayout.Controls[randomPos2].Text = CurrentPuzzleWord[randomPos2] + "";

            SetLetterToolTip(initLayout.Controls[randomPos1], true);

            SetLetterToolTip(initLayout.Controls[randomPos2], true);

            MyFadeLabel fl = initLayout.Controls[randomPos1] as MyFadeLabel;

            fl.FadeToForeColor = Color.White;

            fl.FadeToBackColor = Color.CornflowerBlue;

            fl.Font = bold;

            fl.FadeDuration = fl.MaxTransitions;

            fl.Fade();

            fl = initLayout.Controls[randomPos2] as MyFadeLabel;

            fl.FadeToForeColor = Color.White;

            fl.FadeToBackColor = Color.CornflowerBlue;

            fl.Font = bold;

            fl.FadeDuration = fl.MaxTransitions;

            fl.Fade();

            currentAttempt = GameState.FirstAttempt;

            guess.Text = "";

            history.Clear();

            history.Add(guess.Text);

            historyIndex = 1;

            solved[randomPos1] = solved[randomPos2] = true;

            definitionLink.Visible = false;

            bonusScore = MaximumBonusScore;

            bonusTimer.Start();

            helpGiven = false;

            guess.ForeColor = TextBox.DefaultForeColor;

        }

 

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

Далее выбирается 2 буквы  из слова и отображаются на игровую  область.

С помощью функционала  класса MyFadeLabel реализовано корректное отображение как слова, так и  ошибок пользователя.

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

if (e.KeyChar != (char)Keys.Enter && guess.SelectionLength == 0)

{

return;

}

if (guess.SelectionLength != 0)

{

e.Handled = false;

return;

}

if (!IsValidWord(guess.Text))

{

errorLabel.Visible = true;

guess.SelectAll();

messageLabel.Text = null;

for (int i = 0; i < WordLength; i++)

{

layout.Controls[currentAttempt*WordLength + i].Text = guess.Text[i] +"";

layout.Controls[currentAttempt * WordLength + i].BackColor = Color.Gainsboro;

if (solved[i] && currentAttempt < GameState.LastAttempt)

{

layout.Controls[(currentAttempt+1)*WordLength+i].Text=CurrentPuzzleWord[i]+"";

}

}

currentAttempt++;

return;

}

              else

{

               errorLabel.Visible = false;

if (history[historyIndex - 1] != guess.Text)

                    {

                        history.Add(guess.Text);

                        historyIndex = history.Count;

                    }

}

DisplayCorrectLetters();

DisplayProbableLetters();

currentAttempt++;

}

 

private void DisplayProbableLetters()

        {

            int labelPosition = 0;

            for (int i = 0; i < WordLength; i++)

            {

                if (marked[i] && guess.Text[i] == CurrentPuzzleWord[i])

                {

                    continue;

                }

                for (int j = 0; j < WordLength; j++)

                {

                    if (guess.Text[i] == CurrentPuzzleWord[j])

                    {

                  if (!marked[j])

                        {

                            marked[j] = true;

                            labelPosition = currentAttempt * WordLength + i;

                            MyFadeLabel fl = layout.Controls[labelPosition] as MyFadeLabel;

                            fl.FadeToBackColor = Color.OrangeRed;

                            fl.FadeToForeColor = Color.WhiteSmoke;

                            fl.FadeFromForeColor = Label.DefaultBackColor;

                            fl.FadeFromBackColor = Label.DefaultBackColor;

                            fl.Fade();

                            layout.Controls[labelPosition].Font = bold;

                            SetLetterToolTip(layout.Controls[labelPosition], false);

                            break;

                        }

                        else if (CurrentPuzzleWord.Substring(j + 1).IndexOf(guess.Text[i]) >= 0)

                        {

                            continue;

                        }

                        else

                            break;

                    }

                }

            }

        }

 

private void DisplayCorrectLetters()

        {

            int labelPosition = 0;

            lock (solved)

            {

                for (int i = 0; i < WordLength; i++)

                {

                    labelPosition = currentAttempt * WordLength + i;

                    layout.Controls[labelPosition].Text = guess.Text[i] + "";

                    if (guess.Text[i] == CurrentPuzzleWord[i])

                    {

                        solved[i] = true;

                        MyFadeLabel fl = layout.Controls[labelPosition] as MyFadeLabel;

                        fl.FadeFromForeColor = Label.DefaultBackColor;

                        fl.FadeFromBackColor = Label.DefaultBackColor;

                        fl.FadeToBackColor = Color.GreenYellow;

                        fl.FadeFromForeColor = Label.DefaultForeColor;

                        fl.Fade();

                        layout.Controls[labelPosition].Font = bold;

                        SetLetterToolTip(layout.Controls[labelPosition], true);

                    }

                    if (currentAttempt < GameState.LastAttempt && solved[i])

                    {

                        layout.Controls[labelPosition + WordLength].Text = CurrentPuzzleWord[i] + "";

                        SetLetterToolTip(layout.Controls[labelPosition + WordLength], true);

                    }

                    marked[i] = (guess.Text[i] == CurrentPuzzleWord[i]);

                }

            }

        }

 

Если введенное пользователем  слово не существует, то программы  выделяет его серым цветом и пользователь теряет свою попытку.

Если же оно существует, то программы определяет буквы, существующие в загаданном слове, сверяет их с  пользовательской попыткой и решает, какие буквы выделить как правильные. Если буква слова находится на верной позиции, то она выделяется зеленым  цветом (DisplayCorrectLetters()). Если буква пользовательского  слова существует в ключевом слове, но находится на другой позиции –  она будет подсвечена красным (DisplayProblableLetters()). Затем пользователю предоставляется  следующая попытка.

 

if (guess.Text == CurrentPuzzleWord)

{

guess.Text = "Correct!";

for (int i = 0; i < WordLength && currentAttempt < GameState.MaximumAttemptsOver; i++)

{

layout.Controls[currentAttempt * WordLength + i].Text = "";

}

definitionLink.Text = "What's " + CurrentPuzzleWord + "?";

definitionLink.Visible = true;

UpdateScore();

currentAttempt = GameState.ViewingWord;

helpLetterTimer.Stop();

return;

}

 

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

 

Для более интересной игры введен механизм начисления баллов:

 

private void UpdateScore()

{

score += (GameState.MaximumAttemptsOver - currentAttempt + 1) * 100 + bonusScore;

scoreLabel.Text = string.Format("{0:#,###,###}", score);

bonusTimer.Stop();

messageLabel.Text = null;

}

 

Алгоритм программы выглядит следующим образом:

 

Листинг программы представлен  в приложении 1.

Руководство пользователя

 

Для начала игра необходимо нажать Enter.

 

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

 

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

 

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

 

При нажатии на клавише Escape текущая игра будет закончена, а  в панели «Your guess» будет показано загаданное слово. Также в низу формы  появится ссылка на сервис со значением  ключевого слова.

 

По нажатию на правую кнопку мыши откроется меню со следующими возможностями:

   * Выбор уровня сложности  – easy, medium и hard

   * Отображение окна  помощи

   * Выход из программы

 

По нажатию на пункт About появится следующее окно:

 

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

 

Так же существует возможность  узнать значение слова:

 

По нажатию на ссылку «What’s while» будет открыт интернет-браузер  и открыт сайт со значением данного  слова:

 

Заключение

 

В ходе выполнения данного  курсового проекта мне удалось  реализовать игровую программу. В ней реализованы все функции, которые были описаны в разделе  «Формулировка целей курсового  проекта». А именно:

программный продукт реализовывает  следующие функции возможности:

   * Случайный выбор  ключевого слова из файла

   * Интуитивно понятный  механизм распознавания ошибок  пользователя

   * Учет очков для  данного пользователя 

   * Изменение уровня  сложности

   * Возможность выведения  подсказок при определенных условиях 

   * Возможность узнать  значение данного слова (используя  такие поисковые системы как: google.com или wordnet.princeton.edu)

 

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

Для подготовки курсового  проекта были использованы следующие  материалы:

Троелсен. Э.  С# И Платформа .NET. Библиотека Программиста.

Фаронов В.В. Программирование на языке С#

http://www.esate.ru/page/uroki-OpenGL-c-sharp/

 

Приложения

Приложение 1 (Листинг программы)

Класс MyFadeLabel.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace word_guess

{

    /// <summary>

    /// A label that supports fading transition

    /// between specified back and fore colors

    /// </summary>

    public class MyFadeLabel : Label

    {

        private Color _fadeFromBackColor = DefaultBackColor;

        /// <summary>

        /// The back color from which to start fading from

        /// </summary>

        public Color FadeFromBackColor

        {

            get { return _fadeFromBackColor; }

            set

            {

                _fadeFromBackColor = value;

                BackColor = value;

            }

        }

 

        private Color _fadeFromForeColor = DefaultForeColor;

        /// <summary>

        /// The fore color from which to start fading from

        /// </summary>

        public Color FadeFromForeColor

        {

            get { return _fadeFromForeColor; }

            set

            {

                _fadeFromForeColor = value;

                ForeColor = value;

            }

        }

 

        private Color _fadeToForeColor = DefaultForeColor;

        /// <summary>

        /// The fore color to which the label

        /// should fade to

        /// </summary>

        public Color FadeToForeColor

        {

            get { return _fadeToForeColor; }

            set

            {

                _fadeToForeColor = value;

            }

        }

 

        private Color _fadeToBackColor = DefaultBackColor;

        /// <summary>

        /// The back color to which the label

        /// should fade to

        /// </summary>

        public Color FadeToBackColor

        {

            get { return _fadeToBackColor; }

            set

            {

                _fadeToBackColor = value;

            }

        }

 

        private int _fadeDuration = 2000;

        /// <summary>

        /// The duration over which the fade

        /// effect has to happen

        /// </summary>

        public int FadeDuration

        {

            get { return _fadeDuration; }

            set

            {

                _fadeDuration = value;

            }

        }

 

        private int _maxTransitions = 64;

        /// <summary>

        /// The number of transitions that make up

        /// the fade effect

        /// </summary>

        public int MaxTransitions

        {

            get { return _maxTransitions; }

            set

            {

                _maxTransitions = value;

            }

        }

 

        /// <summary>

        /// The interval for the timer

        /// </summary>

        private int FadeTimerInterval

        {

            get

            {

                int interval = (int)((float)FadeDuration / (float)MaxTransitions);

                return interval == 0 ? 1 : interval;

            }

        }

 

        private Timer FadeTimer = new Timer();

        private int CurrentTransition = 0;

        private delegate void PerformActivityCallback();

        private Color[] BackColorMap;

        private Color[] ForeColorMap;

 

        public MyFadeLabel()

            : base()

        {

            FadeFromBackColor = Label.DefaultBackColor;

            ForeColor = Label.DefaultBackColor;

            FadeTimer.Tick += new EventHandler(fadeTimer_Tick);

        }

 

        /// <summary>

        /// Handles the fade timer tick

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void fadeTimer_Tick(object sender, EventArgs e)

        {

            if (this.InvokeRequired)

            {

                PerformActivityCallback d = new PerformActivityCallback(FadeControl);

                this.Invoke(d);

            }

            else

            {

                FadeControl();

            }

        }

 

        /// <summary>

        /// Fades the control

        /// </summary>

        private void FadeControl()

        {

            BackColor = BackColorMap[CurrentTransition];

            ForeColor = ForeColorMap[CurrentTransition];

            CurrentTransition++;

 

            // If we are done with the transition

            // stop the timer

            if (CurrentTransition == MaxTransitions)

            {

                FadeTimer.Stop();

            }

        }

 

        /// <summary>

        /// Fades the control between

        /// the fade from and fade to colors specified

        /// </summary>

        public void Fade()

        {

            CreateColorMaps();

            CurrentTransition = 0;

            FadeTimer.Interval = FadeTimerInterval;

            FadeTimer.Start();

        }

 

        /// <summary>

        /// Stops the fading

        /// </summary>

        public void StopFading()

        {

            FadeTimer.Stop();

        }

 

        /// <summary>

        /// Resets the back and fore colors to their

        /// respective fade from colors

        /// </summary>

        public void Reset()

        {

            ForeColor = FadeFromForeColor;

            BackColor = FadeFromBackColor;

        }

 

        /// <summary>

        /// Computes the color maps required during fade

        /// transition

        /// </summary>

        private void CreateColorMaps()

        {

            float aDelta, rDelta, gDelta, bDelta;

            int a, r, g, b;

            BackColorMap = new Color[MaxTransitions];

            ForeColorMap = new Color[MaxTransitions];

 

            // Create the color maps for the back color

            aDelta = (FadeToBackColor.A - FadeFromBackColor.A) / (float)MaxTransitions;

            rDelta = (FadeToBackColor.R - FadeFromBackColor.R) / (float)MaxTransitions;

            gDelta = (FadeToBackColor.G - FadeFromBackColor.G) / (float)MaxTransitions;

            bDelta = (FadeToBackColor.B - FadeFromBackColor.B) / (float)MaxTransitions;

 

            BackColorMap[0] = FadeFromBackColor;

            for (int i = 1; i < MaxTransitions; i++)

            {

                a = (int)(BackColorMap[i - 1].A + aDelta);

                r = (int)(BackColorMap[i - 1].R + rDelta);

                g = (int)(BackColorMap[i - 1].G + gDelta);

                b = (int)(BackColorMap[i - 1].B + bDelta);

 

                if (a < 0 || a > 255) a = FadeToBackColor.A;

                if (r < 0 || r > 255) r = FadeToBackColor.R;

                if (g < 0 || g > 255) g = FadeToBackColor.G;

                if (b < 0 || b > 255) b = FadeToBackColor.B;

 

                BackColorMap[i] = Color.FromArgb(a, r, g, b);

            }

 

            // Create the color maps for the fore color

            aDelta = (FadeToForeColor.A - FadeFromForeColor.A) / (float)MaxTransitions;

            rDelta = (FadeToForeColor.R - FadeFromForeColor.R) / (float)MaxTransitions;

            gDelta = (FadeToForeColor.G - FadeFromForeColor.G) / (float)MaxTransitions;

            bDelta = (FadeToForeColor.B - FadeFromForeColor.B) / (float)MaxTransitions;

            ForeColorMap[0] = FadeFromForeColor;

            for (int i = 1; i < MaxTransitions; i++)

            {

                a = (int)(ForeColorMap[i - 1].A + aDelta);

                r = (int)(ForeColorMap[i - 1].R + rDelta);

                g = (int)(ForeColorMap[i - 1].G + gDelta);

                b = (int)(ForeColorMap[i - 1].B + bDelta);

 

                if (a < 0 || a > 255) a = FadeToForeColor.A;

                if (r < 0 || r > 255) r = FadeToForeColor.R;

                if (g < 0 || g > 255) g = FadeToForeColor.G;

                if (b < 0 || b > 255) b = FadeToForeColor.B;

 

                ForeColorMap[i] = Color.FromArgb(a, r, g, b);

            }

        }

    }

}

 

Класс Guess.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Configuration;

using System.Data;

using System.Drawing;

using System.Text;

using System.IO;

using System.Threading;

using System.Windows.Forms;

using System.Reflection;

using System.Runtime.InteropServices;

using System.Timers;

 

namespace word_guess

{

    /// <summary>

    /// The word guess game form

    /// </summary>

    public partial class WordGuess : Form

    {

 

        #region Properties and fields

 

        #region Word list related

        /// <summary>

        /// The index of the word to guess

        /// </summary>

        private int wordIndex;

 

        /// <summary>

        /// The list of words in the puzzle

        /// </summary>

        private List<string> words = new List<string>();

        #endregion

 

        #region History related

        /// <summary>

        /// The index of the last word added to the hisory list

        /// </summary>

        private int historyIndex;

 

        /// <summary>

        /// The list of words attempted in a game

        /// </summary>

        private List<string> history = new List<string>();

        #endregion

 

        #region UI related

        private Font bold = new Font("Georgia", 12F, FontStyle.Bold);

        private Font regular = new Font("Georgia", 12F, FontStyle.Regular);

        #endregion

 

        #region Scoring related

        /// <summary>

        /// The user's score

        /// </summary>

        int score;

 

        /// <summary>

        /// The timer for the bonus score

        /// </summary>

        System.Timers.Timer bonusTimer = new System.Timers.Timer();

 

        /// <summary>

        /// The bonus score available

        /// </summary>

        int bonusScore;

 

        /// <summary>

        /// Delegate to enable displaying the bonus score

        /// in a thread safe manner

        /// </summary>

        delegate void PerformActivityCallback();

 

        /// <summary>

        /// The maximum possible bonus at a time

        /// </summary>

        const int MaximumBonusScore = 1000;

 

        /// <summary>

        /// The bonus timer interval

        /// </summary>

        const int BonusTimerInterval = 100;

 

        /// <summary>

        /// A color map

        /// </summary>

        Color[] ColorMap = new Color[100];

 

        /// <summary>

        /// Color map index factor used to set

        /// the color of the score

        /// </summary>

        float ColorMapIndexFactor = 0.1F;

 

        #endregion

 

        #region Letter processing related

 

        /// <summary>

        /// The length of a word

        /// </summary>

        private const int WordLength = 5;

 

        /// <summary>

        /// Holds which all letters have been solved so far

        /// </summary>

        private bool[] solved = new bool[WordLength];

 

        /// <summary>

        /// Indicates whether a letter has been accounted for

        /// while highlighting letters in the guess that are not

        /// in the correct position

        /// </summary>

        private bool[] marked = new bool[WordLength];

        #endregion

 

        #region Game state related

 

        /// <summary>

        /// The state of the current attempt

        /// </summary>

        public int currentAttempt;

 

        static class GameState

        {

            /// <summary>

            /// Indicates the last attempt at solving a word

            /// </summary>

            public const int LastAttempt = 4;

 

            /// <summary>

            /// Indicates the first attempt at solving a word

            /// </summary>

            public const int FirstAttempt = 0;

 

            /// <summary>

            /// The maximum number of attempts

            /// </summary>

            public const int MaximumAttemptsOver = 5;

Аналитический обзор игровых приложений