Чтобы игра была работоспособной, необходимо каждой ячейки массива каждый тик таймера присваивать значения, соответствующие областям поля. Т.к. количество ячеек велико (их 360), удобно было использовать циклические конструкции. Это позволило сократить программный код и количество ошибок в нем. Для этих целей был использован оператор for (Листинг 1).
Краткосрочной целью игры тетрис является полное заполнение фигурами горизонтали для последующей ее очистки и получении очков. Для этого необходимо было внести в программу функцию проверки заполнености горизонтали. Для массива это представляется как проверка ячеек каждой строки на одинаковость значений. данную задачу решает условная конструкция. В данной работе был использован оператор if (Листинг 1).
Математическая часть алгоритма строится на минимальном числе элементов: двумерный массив, таймер, логическая переменная, циклическая конструкция и условная конструкция (Листинг 1). Синтаксис записи этих элементов в языке C# прост, что делает алгоритм достаточно простым.
GDH+ - интерфейс графических устройств. Приложения с графикой, игры, Computer Aided Design/Computer Aided Manufacture (CAD/CAM - проектирование/производство с помощью компьютера), программы для рисования, для создания графиков и многие другие типы приложений требуют от разработчиков написания кода для работы с графикой. Использование создаваемых пользователем управляющих элементов также предполагает работу с графикой. Посредством своей библиотеки классов компания Microsoft сделала написание кода для работы с графикой как никогда простым.
Возможности GDI +:
· Работу с отдельными частями рисунков
· Рисование изображения
· Вывод на печать
· Предварительный просмотр
· Пространство имен Drawing2D
· Пространство имен Imaging
В классе Graphics инкапсулированы поверхности рисования GDI+. Есть три основных типа поверхностей рисования:
· Окна и управляющие элементы на экране
· Страницы, посылаемые на принтер
· Растровые изображения в памяти
Игра тетрис требует изображение областей поля в виде в квадратов. Для этого была использована структура языка C# Rectangle (прямоугольник). Для ее описания необходимы координаты верхнего левого угла прямоугольника (что соответствует значениям вертикали и горизонтали поля игры), а также его размеры. Структура Region позволяет объединять разные изображения в одно.
Для заполнения определенной области рисунка цветом возможно использование класса Brush. Класс Brush - это абстрактный класс. Для создания экземпляра класса Brush исользуются классы, производные от класса Brush, такие как SolidBrush, TextureBrush и LinearGradientBrush. Класс Brush находится в пространстве имен System. Drawing. Классы TextureBrush и LinearGradientBrush находятся в пространстве имен System. Drawing. Drawing2D. Вот что позволяет делать каждый из этих классов:
· SolidBrush заполняет фигуру сплошным цветом.
· TextureBrush позволяет заполнять фигуру рисунком, хранящемся в двоичном представлении. При создании такой кисти требуется также задавать обрамляющий прямоугольник и режим обрамления. Обрамляющий прямоугольник определяет, какую порцию рисунка мы должны использовать при рисовании, - использовать весь рисунок целиком совершенно необязательно. Для режима обрамления существует несколько возможностей, включая Tile (черепица) - TileFiipx, TileFiipY и TileFiipXY, позволяющих последовательно разбивать изображение на Отдельные квадраты. С помощью TextureBrush можно создавать очень интересные и весьма впечатляющие эффекты.
· LinearGradientBrush содержит кисть, которая позволяет рисовать плавный переход от одного цвета к другому, причем первый цвет переходит во второй под определенным углом. Углы при этом задаются в градусах. Угол, равный 0, означает, что переход от одного цвета к другому осуществляется слева направо. Угол, равный 90°, означает, что переход от одного цвета к другому осуществляется сверху вниз.
Принцип построения изображения поля игры прост. С помощью циклической и условной конструкций проверяется ячейки массива на одинаковые логические значения. Т.к. каждой ячейки соответствует определенная минимальная область поля игры, то зная значение строки и столбца массива возможно построение структуры Rectangle. Объединяя структуры Rectangle одного типа, можно получить два типа Region. Закрашивая эти два Region разными видами "кистей" получаем изображение поля (Листинг 2).
Так как игра тетрис построена на использовании фактора времени, необходимо постоянно графически обновлять поле этой игры. Для этого каждый тик таймера будет происходить приведенный выше принцип построения изображения поля игры.
При разработки программы предполагалось использование среды Microsoft Visual C# 2008 Express Edition. Эта среда разработки программного обеспечения содержит набор шаблонов, которые часто используют при разработки программ. В программе я использовался ряд шаблонов:
· Button
· Label
· PictureBox
· TextBox
· ContextMenuStrip
· Timer
Это облегчило задачу в написании программы, так как часть кода была сгенерирована автоматически.
Приведенные выше принципы и элементы стали основой алгоритма.
Для реализации данного курсовой работы был выбран язык программирования Visual C#. Язык основан на строгой компонентной архитектуре и реализует передовые механизмы обеспечения безопасности кода. Язык программирования C# объединил лучшие черты целого ряда предшественников, а именно ветви языков B - C - C++.
От языка программирования C++ языком C# унаследованы следующие механизмы: "перегруженные" операторы, небезопасные арифметические операции с плавающей точкой, а также ряд других особенностей синтаксиса.
Несмотря на весьма существенные различия между компонентной объектной моделью COM (основного стандарта Microsoft для компонентного проектирования и реализации программного обеспечения) и моделью Java Beans, базовым стандартом Sun Microsystems для компонент (зависимой от языка реализации), язык программирования C# имеет довольно много общего с языком Java.
Перечислим наиболее характерные черты сходства языков программирования C# и Java. Прежде всего, оба языка относятся к категории объектно-ориентированных и предполагают единственность наследования. Другими важными особенностями, которые сближают языки программирования C# и Java, являются механизмы интерфейсов, обработки исключительных ситуаций, а также процессов или "нитей" (threads). "Сборка мусора" и пространства имен реализованы в этих двух языках сходным образом. Оба языка программирования характеризуются сильной (строгой) типизацией и динамической загрузкой кода при выполнении программы.
Но несмотря на то, что целый ряд конструктивных синтаксических механизмов и особенностей реализации унаследован языком программирования C# от прародителей (C++ и Java), возможности этого нового языка программирования не ограничиваются суммой возможностей его исторических предшественников.
К числу принципиально важных решений, которые реализованы корпорацией Microsoft в языке программирования C#, можно отнести следующие:
· компонентно-ориентированный подход к программированию (который характерен и для идеологии Microsoft.net в целом);
· свойства как средство инкапсуляции данных (характерно также в целом для ООП);
· обработка событий (имеются расширения, в том числе в части обработки исключений, в частности, оператор try);
· унифицированная система типизации (соответствует идеологии Microsoft.net в целом);
· делегаты (delegate - развитие указателя на функцию в языках C и C++);
· индексаторы (indexer - операторы индекса для обращения к элементам класса-контейнера);
· перегруженные операторы (развитие ООП);
· оператор foreach (обработка всех элементов классов-коллекций, аналог Visual Basic);
· механизмы boxing и unboxing для преобразования типов;
· атрибуты (средство оперирования метаданными в COM-модели);
· прямоугольные массивы (набор элементов с доступом по номеру индекса и одинаковым количеством столбцов и строк).
Приведенные выше особенности языка C# повлияли на выбор языка программирования и соответственно среды.net для программы.
При создании программного алгоритма "Тетриса" на начальном этапе была разработана блок-схема игры. В ней было описана последовательность работы алгоритма игры (Рис.2).
Рис.2
При запуске приложения "Тетрис" происходит объявления двумерного массива, с последующим его заполнением пустыми значениями. Игра начинается при запуске таймера. Далее происходит выбор фигуры с помощью генератора случайных чисел. В соответствии с выбранной фигурой происходит заполнение первых двух строк массива. Затем происходит вход в цикл падения фигуры. Тело цикла представляет собой сдвиг фигуры на одну строку ниже и проверка на нажатие кнопок "Вправо", "Влево", "Поворот" (при нажатии этих кнопок происходит сдвиг фигуры вправо, влево и поворот вокруг своей оси соответственно). Условие окончания цикла - отсутствие свободного места под фигурой. После выхода из цикла начинается проверка полностью заполненных строк. Если такие имеются, то происходит их очистка и сдвиг всех строк, находящихся выше. Далее происходит новый выбор фигуры и повторение алгоритма. Если же заполненных строк нет, то происходит проверка на свободное место в третьей строке. Если третья строка свободна, то происходит выбор фигуры и выполнение алгоритма цикла. При заполненности третьей строки происходит остановка таймера и вывод результатов игры. Затем происходит выход из игры.
Одной из самых важных функций любого языка программирования является предоставление возможностей для управления программой в ручную. Это подразумевает создание пользовательского интерфейса.