Учебная работа. Курсовая работа: Разработка программы для игры Тетрис

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (5 оценок, среднее: 4,80 из 5)
Загрузка...
Контрольные рефераты

Учебная работа. Курсовая работа: Разработка программы для игры Тетрис

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО (то есть программное обеспечение — комплект программ для компьютеров и вычислительных устройств) ОБРАЗОВАНИЮ

БРЯНСКИЙ ГОСУДАРСТВЕННЫЙ технический

УНИВЕРСИТЕТ

Кафедра «Компьютерные технологии и системы«

Дисциплина «Языки и системы программирования»

КУРСОВАЯ РАБОТА

Разработка программки для игры «Тетрис»

Управляющий

к. т. н., доц.

Студент гр.08-ПРО

БРЯНСК 2010

Оглавление

Задание на курсовую работу

Введение

1. Конструкторский раздел

1.1 Обоснование необходимости разработки

1.2 Обоснование и описание способа метода

1.2.1 Математическая часть метода

1.2.2 Графическая часть метода

2. Технологический раздел

2.1 Выбор языка и среды программирования

2.2 Блок-схема программки

2.3 Вводимые и выводимые данные

2.4 Разработка и отладка текста программки

2.5 Разработка интерфейса юзера

2.6 Тестирование программки

3. Управление юзера

3.1 Программно-аппаратные требования

3.2 порядок работы с программкой

Заключение

Перечень использованной литературы

Приложения



Задание
на курсовую работу

По дисциплине «Языки и системы программирования»

Студент
Шора Р.В. Группа
08-ПРО

Тема:
Разработка программки для игры «Тетрис»

Техническое задание.

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

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

Управляющий к. т. н., доц. Рощин С.М.



Введение

В данном документе описывается программка, написанная в согласовании с постановкой задачки по теме «Разработка программки для игры «Тетрис»» по дисциплине «Языки и системы программирования». Данная программка производит вывод на экран случайным образом падение разных фигур. Входными данными является ввод вариантов скорости движения фигур сверху вниз и управление падающими фигурами.

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

История игры Тетрис начинается в июне 1985 года. Тетрис был придуман Алексеем Пажитновым, а потом был интегрирован на ПК (Персональный компьютер — компьютер, предназначенный для эксплуатации одним пользователем) IBM Вадимом Герасимовым. Опосля что ига Тетрис начала распространяться по всей Москве, а потом уже и по всему миру. Поначалу она была доставлена в Венгрию, где венгерские программеры интегрировали Тетрис для Apple II и Commodore 64.

игра была увидена в мире, и несколько представителей больших компаний, обращались к создателю Тетриса, чтоб приобрести права на распространение игры. Алексей подписывает договор с Mirrorsoft UK и Spectrum Holobyte, предоставляя им права на компьютерным версии Тетрис. Опосля того, как 1-ые копии Тетриса для домашних компов были преданны, игра заполучила популярность посреди населения и стала самой продаваемой компьютерной игрой в Великобритании и США (Соединённые Штаты Америки — количество методов реализации данной программки. Их можно поделить по функциональности:

1) математическое описание движений фигур;

2) графическое отображение движений фигур;

В математической части рассматриваются главные принципы и законы движений фигур. Это важнейшая часть программки. От неё зависит верная работоспособность программки. Для её реализации можно употреблять разные методы. к примеру обрисовать движение фигуры 2-мя линейными функциями. одна будет отвечать за размещение фигуры по горизонтали, иная по вертикале. Меняя за определенные промежутки времени значения переменных этих функций, будет изменяться положение фигуры на плоскости. 3-я функция будет отвечать за чистку стопроцентно заполненных горизонталей. Главными недочетами этого метода является объявление огромного числа переменных, отвечающих за описание уже упавших фигур, и создание огромного числа доп функций, отвечающих за поворот фигур вокруг собственной оси.

иной метод математического описания движения фигур и наполнения поля тетриса — создание двумерной матрицы n*k. Через определенный просвет времени будет изменяться значения, надлежащие положению фигур на плоскости и уже упавшим фигурам. Т.е. части фигуры расположенной на n-ой горизонтали и k-ой вертикали.

Приведенные выше методы не являются единственными. Они только более популярны в реализации программки «Тетрис» посреди программистов.

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

Ещё один метод графического отображения фигур и поля тетриса — внедрение готовых частей языка программирования. Более нередко для этих целей употребляют таблицы. Изменяя цвет ячеек таблицы через определенные промежутки времени можно показать на дисплее движение фигур и заполненные области поля. Также может быть внедрение таковых частей, как клавиши, области для надписей (Label). Изменяя их цвет, также можно показать движение фигур и заполненные области. Но у такового метода есть большой минус — объявление огромного числа таковых частей.

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

При разработки программки для игры Тетрис был употреблял объектно-ориентированный язык программирования Visual C#. Математическая часть программки была сотворена при помощи двумерной матрицы. Графическое отображение было реализовано при помощи графических способностей языка Visual C#.



1. Конструкторский раздел


1.1 Обоснование необходимости разработки

В разделе «Введение» данной курсовой работы была приведена короткая история игры «Тетрис». Как видно данной для нас компьютерной игре наиболее 25 лет. Все изученные мной примеры данной для нас игры написаны на достаточно старенькых языках программирования (к примеру Basic, Pascal). В таковых играх был довольно недружественный интерфейс юзера, слабенькое графической отображение (довольно резкие цвета, малая цветовая гамма) (Рис.1).

Рис. 1. Тетрис на Basic

Основываясь на выше изложенных фактах было принято решение сделать программку игры «Тетрис».


1.2 Обоснование и описание способа метода

При разработке программки игры «Тетрис» для описания математической части метода был применен двумерный массив, размерностью 24*15. Для сотворения графической части программки использовались графические способности языка C#.



1.2.1 Математическая часть метода

Массив —
это индексированный набор объектов 1-го типа. В языке С# массивы несколько различаются от массивов в C++ и остальных языках, так как они являются объектами, что наделяет их полезными способами и качествами. В С# определен синтаксис объявления объектов типа Array. Но практически создается объект типа System. Array. Таковым образом, С# предоставляет программеру безупречные условия: за обычным синтаксисом в стиле С кроется объявление класса, дающее экземплярам массива доступ к способам и свойствам класса System. Array.

В разработке метода употреблялся массив как математический аналог поля «Тетриса». Любая ячейка массива соответствует определенной области поля игры. Любая область поля игры быть может заполнена фигурой либо быть пустой. Соответственно, любая область поля может принимать два значения. Для этих целей можно употреблять логические переменные. Любая фигура имеет определенную форму и занимает несколько областей поля игры. Как следует в массиве, ячейки, надлежащие заполненным областям поля, будут иметь логическое true

. Для ячеек соответственных пустым областям будет присвоено логическое false

. Любая горизонталь поля тетриса соответствует строке двумерного массива, а вертикаль — столбцу. движение фигур делается через равные промежутки времени, т. е происходит повторение метода через равные промежутки времени. Равные промежутки времени можно обеспечить при помощи обсчета ресурсоёмкого метода (к примеру вычисление ряда Фибоначчи) либо употреблять элемент языка С# таймер

(который был применен в данной программке). Любой тик таймера будет происходить повторение метода движения фигуры. Это представлено как последовательное изменение значений в ячейках массива.

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

Листинг 1).

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

Листинг 1).

Математическая часть метода строится на наименьшем числе частей: двумерный массив, таймер, логическая переменная, повторяющаяся система и условная система (Листинг 1). Синтаксис записи этих частей в языке C# прост, что делает метод довольно обычным.


1.2.2 Графическая часть метода

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 содержит кисть, которая дозволяет отрисовывать плавный переход от 1-го цвета к другому, при этом 1-ый цвет перебегает во 2-ой под определенным углом. Углы при всем этом задаются в градусах. Угол, равный 0, значит, что переход от 1-го цвета к другому осуществляется слева вправо. Угол, равный 90°, значит, что переход от 1-го цвета к другому осуществляется сверху вниз.

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

. Объединяя структуры Rectangle

1-го типа, можно получить два типа Region.

Закрашивая эти два Region

различными видами «кистей» получаем изображение поля (Листинг 2).

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

При разработки программки предполагалось внедрение среды Microsoft Visual C# 2008 Express Edition. Эта среда разработки программного обеспечения содержит набор шаблонов, которые нередко употребляют при разработки программ. В программке я употреблялся ряд шаблонов:

· Button

· Label

· PictureBox

· TextBox

· ContextMenuStrip

· Timer

Это облегчило задачку в написании программки, потому что часть кода была сгенерирована автоматом.

Приведенные выше принципы и элементы стали основой метода.



2. Технологический раздел


2.1 Выбор языка и среды программирования

Для реализации данного курсовой работы был избран язык программирования Visual C#. язык основан на серьезной компонентной архитектуре и реализует передовые механизмы обеспечения сохранности кода. язык программирования C# соединил наилучшие черты целого ряда предшественников, а конкретно ветки языков B — C — C++

.

От языка программирования C++ языком C# унаследованы последующие механизмы: «перегруженные» операторы, опасные арифметические операции с плавающей точкой, также ряд остальных особенностей синтаксиса.

Невзирая на очень значительные различия меж компонентной объектной моделью COM (основного эталона Microsoft для компонентного проектирования и реализации программного обеспечения) и моделью Java Beans, базисным эталоном Sun Microsystems для компонент (зависимой от языка реализации), язык программирования C# имеет достаточно много общего с языком Java.

Перечислим более соответствующие черты сходства языков программирования C# и Java. До этого всего, оба языка относятся к группы объектно-ориентированных и подразумевают единственность наследования. Иными необходимыми чертами, которые сближают языки программирования C# и Java, являются механизмы интерфейсов, обработки исключительных ситуаций, также действий либо «нитей» (threads). «Сборка мусора» и места имен реализованы в этих 2-ух языках схожим образом. Оба языка программирования характеризуются мощной (серьезной) типизацией и динамической загрузкой кода при выполнении программки.

Но невзирая на то, что целый ряд конструктивных синтаксических устройств и особенностей реализации унаследован языком программирования C# от прародителей (C++ и Java), способности этого новейшего языка программирования не ограничиваются суммой способностей его исторических предшественников.

К числу принципно принципиальных решений, которые реализованы компанией Microsoft в языке программирования C#, можно отнести последующие:

· компонентно-ориентированный подход к программированию (который характерен и для идеологии Microsoft.net в целом);

· характеристики как средство инкапсуляции данных (типично также в целом для ООП);

· обработка событий (имеются расширения, в том числе в части обработки исключений, а именно, оператор try);

· унифицированная система типизации (соответствует идеологии Microsoft.net в целом);

· делегаты (delegate — развитие указателя на функцию в языках C и C++);

· индексаторы (indexer — операторы индекса для воззвания к элементам класса-контейнера);

· перегруженные операторы (развитие ООП);

· оператор foreach (обработка всех частей классов-коллекций, аналог Visual Basic);

· механизмы boxing и unboxing для преобразования типов;

· атрибуты (средство оперирования метаданными в COM-модели);

· прямоугольные массивы (набор частей с доступом по номеру индекса и схожим количеством столбцов и строк).

Приведенные выше индивидуальности языка C# воздействовали на выбор языка программирования и соответственно среды.net для программки.



2.2 Блок-схема программки

При разработке программного метода «Тетриса» на исходном шаге была разработана блок-схема игры. В ней было описана последовательность работы метода игры (Рис.2).

Рис.2


При запуске приложения «Тетрис» происходит объявления двумерного массива, с следующим его наполнением пустыми значениями. игра начинается при запуске таймера. Дальше происходит выбор фигуры при помощи генератора случайных чисел. В согласовании с избранной фигурой происходит наполнение первых 2-ух строк массива. Потом происходит вход в цикл падения фигуры. тело цикла представляет собой сдвиг фигуры на одну строчку ниже и проверка на нажатие клавиш «На Право«, «На лево», «Поворот» (при нажатии этих клавиш происходит сдвиг фигуры на Право, на лево и поворот вокруг собственной оси соответственно). Условие окончания цикла — отсутствие вольного места под фигурой. Опосля выхода из цикла начинается проверка стопроцентно заполненных строк. Если такие имеются, то происходит их чистка и сдвиг всех строк, находящихся выше. Дальше происходит новейший выбор фигуры и повторение метода. Если же заполненных строк нет, то происходит проверка на свободное пространство в третьей строке. Если 3-я строчка свободна, то происходит выбор фигуры и выполнение метода цикла. При заполненности третьей строчки происходит остановка таймера и вывод результатов игры. Потом происходит выход из игры.


2.3 Вводимые и выводимые данные

одной из самых принципиальных функций хоть какого языка программирования является предоставление способностей для управления программкой в ручную. Это предполагает создание пользовательского интерфейса.

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

Выводимые данные в программке представлены в виде графического отображения окна игры (Рис.3)

Рис.3

Окно игры.

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

1) нажатие кнопок Left, Right, Up, Space;

2) работа юзера со строчкой меню.


2.4 Разработка и отладка текста программки

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

Опосля того как определены требования к программке и составлен метод решения, метод записывается на избранном языке программирования. В итоге выходит начальная программка. Составление теста программки, наверняка, самый непростой из шагов, требующий большего внимания. Чтоб этот текст был понятен юзеру и составителю, употребляются комменты.

Отладка — это процесс поиска и устранения ошибок. Ошибки в программке делят на две группы: синтаксические (ошибки в тексте) и алгоритмические. Синтаксические ошибки — более просто устраняемые. Алгоритмические ошибки найти сложнее. Шаг отладки можно считать законченным, если программка верно работает на одном-двух наборах входных данных.


2.5 Разработка интерфейса юзера

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

1) интерфейс должен быть интуитивно понятен обычному юзеру компа.

2) Цветовая схема не обязана раздражать человека.

Разглядим 1-ый пункт.

Программка создана для приятного проведения вольного времени. Она недолжна иметь очень сложную систему управления. Потому, была применена всем популярная система управления программкой — строчка меню. Любому пт меню присвоено заглавие, соответственное многофункциональному предназначению. Это упрощает работу юзера.

Что все-таки касается второго пт, тут использованы «прохладные» цвета (цвета голубого). Они не несут ни какой психологической перегрузки, потому время препровождение для человека будет приятным.


2.6 Тестирование программки

Тестирование программки — это шаг, на котором проверяется, как ведет себя программка на как можно большем количестве входных наборов данных, в том числе и на заранее неправильных.

Главные принципы организации тестирования:

1) нужной частью всякого теста обязано являться описание ожидаемых результатов работы программки, чтоб можно было стремительно узнать наличие либо отсутствие ошибки в ней;

2) следует по способности избегать тестирования программки ее создателем, т.к. не считая уже обозначенной беспристрастной трудности тестирования для программистов тут находится и тот фактор, что обнаружение недочетов в собственной деятель противоречит людской психологии (но отладка программки эффективнее всего производится конкретно создателем программки);

3) по этим же суждениям организация — разраб программного обеспечения не обязана “единолично ” его тестировать (должны существовать организации, специализирующиеся на тестировании программных средств);

4) должны являться правилом доскональное исследование результатов всякого теста, чтоб не пропустить малозаметную на поверхностный взор ошибку в программке;

5) нужно кропотливо подбирать тест не только лишь для правильных (предусмотренных) входных данных, да и для некорректных (непредусмотренных);

6) при анализе результатов всякого теста нужно инспектировать, не делает ли программка того, что она не обязана созодать;

7) следует сохранять использованные испытания (для увеличения эффективности повторного тестирования программки опосля ее модификации либо установки у заказчика);

8) тестирования не обязано планироваться исходя из догадки, что в программке не будут обнаружены ошибки (а именно, следует выделять для тестирования достаточные временные и вещественные ресурсы);

9) следует учесть так именуемый “принцип скопления ошибок”: возможность наличия не найденных ошибок в некой части программки прямо пропорциональна числу ошибок, уже найденных в данной для нас части;

10) следует постоянно держать в голове, что тестирование — творческий процесс, а не относиться к нему как к рутинному занятию.

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



3. Управление юзера


3.1 Программно-аппаратные требования

Аппаратные требования:

Нужный размер ОЗУ 64 Мб и видеоадаптером, поддерживающим режим 800х600 и выше, глубина цвета 32 бит. Нужное пространство на твердом диске 780 Кб. клавиатура, мышь.

Программные требования:

Операционная система семейства Windows: 2000/XP (32/64) /Vista (32/64) /7 (32/64)


3.2 порядок работы с программкой

Запускаем приложение Tetris. exe (Рис.4):

Рис.4


приложение Tetris. exe

Для того чтоб начать игру нужно надавить Меню — Новенькая игра. Для конфигурации трудности игры нужно зайти в Меню — Сложность. Для временной остановки игры нужно надавить Меню — Пауза либо кнопку Space. Для продолжения игры надавить Меню — Продолжить (Рис.5).

Рис.5

Строчка меню

Управление фигурами осуществляется при помощи кнопок Left, Right, Up (подробнее Меню — Справка — Управление) (Рис.6).

Рис.6

Окно «Управление»

Для выхода из программки нужно надавить Меню — Выход). Так же можно поглядеть сведения о программном продукте и разрабе (Меню — Справка — О программке) (Рис.7).

Рис.7

Окно «О программке»



Заключение

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


Перечень использованной литературы

1. Г. Шилдт C#: Учебный курс. — Спб.: Питер, 2003. — 512с

2. Либерти, Д. Программирование на Си Шарп. — М.: знак-плюс, 2005. — 684 с.

3. Ватсон К. Си Шарп/К. Ватсон. — М.: Лори, 2005. — 862 с.

4. Жарков В.А. Компьютерная графика, мультимедиа и игры на VisualC# 2005. — М.: Жарков пресс, 2005. — 812с.

5. HTTP://www.excode.ru/art6225p1.html


Приложения

Листинг 1

private void Form1_Load (object sender, EventArgs e)

{

for (i = 0; i < 24; i++) // наполнение массива пустыми значениями

{

for (j = 0; j < 15; j++)

{

Tet [i, j] = false;

Res = true;

}

}

SF = false; // фигура не существует

textBox2. Text = «0»;

}

private void timer_Tick (object sender, EventArgs e)

{

if (SF == false)

{

Random a = new Random (); // выборфигуры

NumbeF = a. Next (0,6);

SF = true;

P = true; // возникновение фигуры на первой позиции

}

if (SF == true)

{

if (NumbeF == 0) // квадрат

{

if (P == true) // условие возникновения квадрата в первой позиции

{

Tet [0, 7] = true;

Tet [0, 8] = true;

Tet [1, 7] = true;

Tet [1, 8] = true;

P = false; // фигура не возникает на первой позиции

i = 1;

j = 7;

}

if (i < 23 && (Tet [i + 1, j] == false && Tet [i + 1, j + 1] == false)) // условиесдвигафигуры

{

Tet [i — 1, j] = false;

Tet [i — 1, j + 1] = false;

Tet [i + 1, j] = true;

Tet [i + 1, j + 1] = true;

i = i + 1;

}

else

{

SF = false; // фигура не существует

}

}

if (NumbeF == 1) // сапожок

{

if (P == true) // условие возникновения сапожка в первой позиции

{

Tet [0, 7] = true;

Tet [1, 7] = true;

Tet [1, 8] = true;

Tet [1, 9] = true;

P = false;

i = 1;

j = 8;

Razp = 0;

}

if (Razp == 0) // фигура сапожок в положение 0

{

if (i < 23 && Tet [i + 1, j — 1] == false && Tet [i + 1, j] == false && Tet [i + 1, j + 1] == false) // проверка вольного места под фигурой

{

Tet [i, j] = false;

Tet [i, j + 1] = false;

Tet [i — 1, j — 1] = false;

Tet [i + 1, j — 1] = true;

Tet [i + 1, j] = true;

Tet [i + 1, j + 1] = true;

i = i + 1;

}

else

{

SF = false;

}

}

if (Razp == 1) // фигура сапожок в положение 1

{

if (i < 22 && Tet [i + 2, j — 1] == false && Tet [i + 2, j] == false) // проверка вольного места под фигурой

{

Tet [i — 1, j] = false;

Tet [i + 1, j — 1] = false;

Tet [i + 2, j — 1] = true;

Tet [i + 2, j] = true;

i = i + 1;

}

else

{

SF = false;

}

}

if (Razp == 2) // фигура сапожок в положение 2

{

if (i < 22 && Tet [i + 1, j — 1] == false && Tet [i + 1, j] == false && Tet [i + 2, j + 1] == false) // проверка вольного места под фигурой

{

Tet [i, j] = false;

Tet [i, j + 1] = false;

Tet [i, j — 1] = false;

Tet [i + 1, j — 1] = true;

Tet [i + 1, j] = true;

Tet [i + 2, j + 1] = true;

i = i + 1;

}

else

{

SF = false;

}

}

if (Razp == 3) // фигура сапожок в положение 3

{

if (i < 22 && Tet [i, j + 1] == false && Tet [i + 2, j] == false) // проверка вольного места под фигурой

{

Tet [i — 1, j] = false;

Tet [i — 1, j + 1] = false;

Tet [i, j + 1] = true;

Tet [i + 2, j] = true;

i = i + 1;

}

else

{

SF = false;

}

}

}

Листинг 2

SolidBrush Brush2 = new SolidBrush (System. Drawing. Color. LightCyan); // созданиекисти

SolidBrush Brush3 = new SolidBrush (System. Drawing. Color. Red);

Font font = new Font («Times New Roman», 30, FontStyle. Bold | FontStyle. Italic); // описаниестилянадписи

for (a = 2; a < 24; a++)

{

for (b = 0; b < 15; b++)

{

Graphics myGraphics = CreateGraphics (); // создание поверхности для рисования

if (Tet [a, b] == true)

{

LinearGradientBrush Brush1 = new LinearGradientBrush (new Rectangle (20 * b,20 * a, 20, 20), Color. Aqua, Color. Blue, 45);

Rectangle r1 = new Rectangle (20 * b,20 * (a — 1), 20, 20); // объединение заполненных ячеек в область

myGraphics. FillRectangle (Brush1, r1); // закрашивание заполненной области

}

if (Tet [a, b] == false)

{

Rectangle r1 = new Rectangle (20 * b,20 * (a — 1), 20, 20); // объединение незаполненных ячеек в область

myGraphics. FillRectangle (Brush2, r1); // закрашивание незаполненной области

}

}

}

Листинг 3

private void button2_KeyUp (object sender, KeyEventArgs e)

{

key = e. KeyCode. ToString ();

if (key == «Right») // проверка нажатие клавиши «На Право«

{

timer. Enabled = false;

if (NumbeF == 0 && j < 13 && Tet [i — 1, j + 2] == false && Tet [i, +2] == false) // проверка вольного места справо

{

Tet [i, j + 2] = true;

Tet [i — 1, j + 2] = true;

Tet [i, j] = false;

Tet [i — 1, j] = false;

j = j + 1;

}

if (NumbeF == 1)

{

if (Razp == 0 && j < 13 && Tet [i, j + 2] == false && Tet [i — 1, j] == false) // проверка вольного места справо

{

Tet [i — 1, j] = true;

Tet [i, j + 2] = true;

Tet [i, j — 1] = false;

Tet [i — 1, j — 1] = false;

j = j + 1;

}

if (Razp == 1 && j < 14 && Tet [i — 1, j + 1] == false && Tet [i, j + 1] == false && Tet [i + 1, j + 1] == false) // проверка вольного места справо

{

Tet [i — 1, j] = false;

Tet [i, j] = false;

Tet [i + 1, j — 1] = false;

Tet [i — 1, j + 1] = true;

Tet [i, j + 1] = true;

Tet [i + 1, j + 1] = true;

j = j + 1;

}

if (Razp == 2 && j < 13 && Tet [i, j + 2] == false && Tet [i + 1, j + 2] == false) // проверка вольного места справо

{

Tet [i, j + 2] = true;

Tet [i + 1, j + 2] = true;

Tet [i, j — 1] = false;

Tet [i + 1, j + 1] = false;

j = j + 1;

}

if (Razp == 3 && j < 13 && Tet [i — 1, j + 2] == false && Tet [i, j + 1] == false && Tet [i + 1, j + 1] == false) // проверка вольного места справо

{

Tet [i — 1, j + 2] = true;

Tet [i, j + 1] = true;

Tet [i + 1, j + 1] = true;

Tet [i — 1, j] = false;

Tet [i, j] = false;

Tet [i + 1, j] = false;

j = j + 1;

}

}

}

}

]]>