ТЕХНОЛОГИИ, МЕТОДЫ, СТРУКТУРЫ, ПРИНЦИПЫ ПОЛОЖЕННЫЕ В ОСНОВУ АЛГОРИТМА
Схема работа программы: Рисунок 2.1 – Схема работы программы Visual Studio 2010 позволяет программисту разрабатывать программы, которые могут выводить графику: схемы, чертежи, иллюстрации. Программа выводит графику на поверхность объекта (формы или, как в нашем случае, компонента PictureBox). Поверхности объекта соответствует свойство Graphics. Для того чтобы вывести на поверхность объекта графический элемент (прямую линию, окружность, прямоугольник и т. д.), необходимо применить к свойству Graphics этого объекта соответствующий метод. Перечень основных методов, которые потребуются при разработке файлового программного игрового приложения «Snake»: void Graphics.DrawImage(Image image, int x, int y)
Метод DrawImage Синтаксис: Объект.DrawImage (Image image, int x, int y); Где: Объект — имя объекта (компонента), на поверхности которого выполняется вычерчивание, x, y — координаты x и y положения рисунка, image – картинка, которая будет прорисована. Метод DrawImage рисует изображение, содержащееся в объекте, указанном параметром Image, сохраняя исходный размер изображеня в его источнике и перенося изображение в область объекта Graphics, верхний левый угол которой определяется параметрами x и y. Источник изображения может быть битовой матрицей, пиктограммой или метафайлом. void Graphics.DrawString(String s, Font font, Brush brush, PointF point)
Метод DrawString Синтаксис: Объект.DrawString(String s, Font font, Brush brush, PointF point); Где: Объект — имя объекта (компонента), на поверхности которого выполняется рисование, s – строка для рисования, font – объект, определяющий формат текстовой строки, brush – объект, определяющий цвет и текстуру создаваемого текста, PointF – структура, задающая верхний левый угол создаваемого текста. Метод DrawString рисует строку, содержащееся в параметре s, сохраняя исходный размер строки в его источнике и перенося ее в область объекта Graphics, формат строки определяется параметром font, цвет и текстура задается параметром brush, место рисования строки задается верхним левым углом, который описан в параметре point. При разработке программы основным компонентом является Timer, который вызывает событие через определенные интервалы времени. Этот компонент предназначен для среды Windows Forms, в которой и разрабатывалось данное приложение. Длина интервалов определяется свойством Interval, значение которого исчисляется в миллисекундах. Когда компонент включен, событие Tick вызывается через каждый интервал. В этом месте следует добавить выполняемый код. Ключевыми методами компонента Timer являются Start и Stop, которые включают и выключают таймер. При выключении таймера его параметры сбрасываются; приостановить компонент Timer нельзя. При разработке программы было решено отказаться от массивов, а вместо них использовать List<T> - класс. Данный класс представляет строго типизированный список объектов, доступных по индексу. Поддерживает методы для поиска по списку, выполнения сортировки и других операций со списками. Класс List<T> является универсальным эквивалентом класса ArrayList. Он реализует универсальный интерфейс IList<T> с помощью массива, размер которого динамически увеличивается по мере необходимости. Класс List<T> использует компаратор проверки на равенство и компаратор упорядочения. Такие методы, как Contains, IndexOf, LastIndexOf и Remove, используют компаратор проверки на равенство для элементов списка. Компаратор проверки на равенство, используемый по умолчанию для типа T, определяется следующим образом. Если тип T реализует универсальный интерфейс IEquatable<T>, в качестве компаратора проверки на равенство используется метод Equals(T) этого интерфейса; в противном случае по умолчанию используется метод Object.Equals(Object). Такие методы, как BinarySearch и Sort, используют компаратор упорядочения для элементов списка. Компаратор, используемый по умолчанию для типа T, определяется следующим образом. Если тип T реализует универсальный интерфейс IComparable<T>, в качестве компаратора по умолчанию используется метод CompareTo(T) этого интерфейса; в противном случае, если тип T реализует неуниверсальный интерфейс IComparable, в качестве компаратора по умолчанию используется метод CompareTo(Object) этого интерфейса. Если тип T не реализует ни один из интерфейсов, компаратор по умолчанию не определяется; в этом случае компаратор или делегат сравнения должен быть задан явным образом. Сортировка списка List<T> is не гарантируется. Необходимо отсортировать List<T> до выполнения операций (таких, как BinarySearch), для которых требуется отсортированный список List<T>. Доступ к элементам этой коллекции осуществляется с помощью целочисленного индекса. Индексы в этой коллекции начинаются с нуля. Для очень больших List<T> объекты, можно увеличить максимальную емкость до 2 миллиарда элементов в системе путем установки обновления 64 (sp2) enabled атрибут gcAllowVeryLargeObjects элемент конфигурации true в такой среде выполнения. Объект List<T> принимает null в качестве допустимого значения для ссылочных типов и разрешает дублирование элементов. Особенности производительности Делая выбор между классами List<T> и ArrayList, предлагающими сходные функциональные возможности, следует помнить, что класс List<T> в большинстве случаев обрабатывается быстрее и является типобезопасным. Если в качестве типа T класса List<T> используется ссылочный тип, оба класса действуют идентичным образом. Однако если в качестве типа T используется тип значений, необходимо принять во внимание особенности, связанные с реализацией и упаковкой. Если в качестве типа T используется тип значений, компилятор генерирует реализацию класса List<T> специально для этого типа значений. Это означает, что элемент списка List<T> не требует упаковки перед его использованием, и после создания примерно 500 элементов списка объем памяти, сэкономленной за счет отказа от их упаковки, превысит объем памяти, используемой для генерации реализации класса. Необходимо убедиться, что тип значений, используемый в качестве типа T, реализует универсальный интерфейс IEquatable<T>. В противном случае такие методы, как Contains, должны будут вызывать метод Object.Equals(Object), который осуществляет упаковку соответствующего элемента списка. Если тип значений реализует интерфейс IComparable и исходный код принадлежит вам, следует также реализовать универсальный интерфейс IComparable<T>, чтобы избежать упаковки элементов списка методами BinarySearch и Sort. Если исходный код принадлежит не вам, передайте объект IComparer<T> в методы BinarySearch и Sort. Использование реализации класса List<T>, определяемой конкретным типом, является предпочтительным по сравнению с использованием класса ArrayList или самостоятельным составлением коллекции со строго типизированной оболочкой. Дело в том, что собственная реализация должна выполнять все функции, которые уже автоматически предоставляются в.NET Framework, и к тому же общеязыковая среда выполнения может использовать общие метаданные и код MSIL, что невозможно обеспечить в собственной реализации.
Программное приложение <Snake> написано на объектно-ориентированном языке C# и соответствует принципам концепции ООП: Концепция ООП возникла в середине 80-х годов. Главная ее идея в том, что программное приложение, как и окружающий нас мир, должно состоять из объектов, обладающих собственными свойствами и поведением. ООП объединяет исполняемый код программы и ее данные в объекты, что упрощает создание сложных программных приложений. Например, можно организовать коллективную работу над проектом, где каждый участник создает собственный класс объектов, который становится доступным другим участникам проекта. При объектно-ориентированном подходе программные задачи распределяются между объектами программы. Объекты обладают определенным набором свойств, методов и способностью реагировать на события (нажатие кнопок мыши, интервалы времени и т.д.). В отличие от процедурного программирования, где порядок выполнения операторов программы определяется порядком их следования и командами управления, в ООП порядок выполнения процедур и функций определяется, прежде всего, событиями. Чтобы проект можно было считать объектно-ориентированным, объекты должны удовлетворять некоторым требованиям. Этими требованиями являются инкапсуляция, наследование и полиморфизм. Инкапсуляция — означает, что объекты скрывают детали своей работы. Инкапсуляция позволяет разработчику объекта изменять внутренние принципы его функционирования, не оказывая никакого влияния на пользователя объекта. В VB этот принцип реализуется, в основном, за счет применения описаний Private и Public. Наследование — означает, что новый объект можно определить на основе уже существующих объектов, при этом он будет содержать все свойства и методы родительского. Наследование полезно, когда требуется создать новый объект, обладающий дополнительными свойствами по сравнению со старым. Следует заметить, что VB не поддерживает наследования в строгом смысле этого понятия. Полиморфизм — многие объекты могут иметь одноименные методы, которые могут выполнять разные действия для разных объектов. Например, оператор "+" для числовых величин выполняет сложение, а для текстовых — склеивание. В ООП центральным является понятие класса. Класс – это шаблон, по которому создаются объекты определенного типа. Класс объединяет в себе данные и методы их обработки. Объекты — это экземпляры определенного класса. Например, кнопки или текстовые поля, устанавливаемые на форме являются экземплярами соответствующих стандартных классов VB. Создать собственный класс в VB можно с помощью модуля класса. Модуль класса состоит из элементов трех типов: свойств, методов, событий, оформляемых в виде описаний, процедур и функций внутри контейнера — модуля. У модуля класса нет собственного пользовательского интерфейса — формы, однако он может использовать контейнер формы, для чего должен содержать соответствующие методы. Элементы управления — это объекты, используемые при разработке пользовательского интерфейса. ООП характеризуется следующими принципами (по Алану Кею): · все является объектом; · вычисления осуществляются путем взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие; объекты взаимодействуют, посылая и получая сообщения; сообщение -- это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия; · каждый объект имеет независимую память, которая состоит из других объектов; · каждый объект является представителем класса, который выражает общие свойства объектов данного типа; · в классе задается функциональность (поведение объекта); тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия; · классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования; память и поведение, связанное с экземплярами определенного класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.
|