Программирование игры "Тетрис"

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

1. Введение

Одним из трёх «китов», на котором основывается объектно-ориентированное программирование, является наследование. Это механизм, позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом. То есть, если существует несколько классов с похожими членами, методами? целесообразно наследовать эти классы от общего предка (родительского класса). Наследование обычно удобно в использовании, а в некоторых случаях? необходимо.

Многие языки программирования являются объектно-ориентированным. В них прослеживается явная иерархия (последовательность наследования) от одного класса. Например, в C#? object, а в Delphi? TObject.

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

2. Постановка задачи

Реализовать программу, позволяющую:

1. развивать у пользователя сноровку и внимание

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

3. Анализ задачи

Решение данной задачи связано с написанием программы, которая позволяет пользователю играть в графическом режиме в игру с названием «тетрис».

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

Определившись с пользовательским функционалом и отображающим его интерфейсом, нужно рассмотреть внутреннее представление игрового процесса. Игра представляет собой появление блоков различной формы в верхней части игрового поля. После чего происходит движение блока вниз под действием силы тяжести до встречи с первым препятствием? другим блоком или нижней границей поля. Далее появляется другой блок, и действие с ним повторяется. Целью игры является набор максимального числа очков. Условие проигрыша? выход блока за верхнюю границу поля в связи с отсутствием места для опускания. Для реализации нам необходимы классы «блоки». Так как блоки разной формы, но функционал у них повторяется, следует использовать наследование от одного общего предка «блок», обладающим методами перемещения по горизонтали, падению вниз на 1 шаг, прорисовки и признака остановки падения. Также необходимо само игровое поле. Скорее всего, будет использоваться массив, хранящий информацию о занятости клетки игрового поля. Поле следует также определить как класс, так как для него нужны будут методы такие, как: запись остановившегося блока, очищение полностью заполненного ряда, прорисовка заполненных клеток.

4. Средства реализации

игра тетрис программа интерфейс

Данная программа реализована в визуальной среде программирования C# в графическом режиме. Выбор этот обусловлен требованиями учебной дисциплины «Объектно-ориентированные технологии».

5. Требования к аппаратному и программному обеспечению

В качестве аппаратной среды используется ПК типа IBM PC.

Системные требования:

· Компьютер Pentium 200 МГц

· Оперативная память 32 RAM

· Видеокарта 800×600

· Операционная система Microsoft Windows 98/ME/2000/XP/Vista/7

· Клавиатура

· Мышь

· Размеры свободного дискового пространства 200 кб

6. Интерфейс пользователя

При запуске программы пользователь видит главную форму программы, которая содержит меню выбора скорости, кнопку Начать, номер линии, которую нужно убрать и кнопку Убрать линию. Также присутствует поле, содержащее подсказки по управлению и счетчик очков (рис. 1):

Рис. 1. Главная форма программы

Выбрав желаемую скорость, пользователь нажимает на кнопку Начать и игра начинается (появляется первый блок, начинается движение), запускается счетчик очков. За каждый промежуток времени дается 1 очко (рис. 2):

Рис. 2. Начало игры

При остановке падения фигуры появляется другая фигура и начинает падать. Можно нажать кнопку Стоп (рис. 2) и тогда программа приостановится, счетчик очков, движение фигур прекратятся, название кнопки изменится на Начать, и пользователь сможет изменить скорость или просто передохнуть (рис. 3):

Рис. 3. Приостановка программы

Когда блоки составляют полную линию, у пользователя появляется возможность убрать линию нажатием на кнопку Убрать линию и заработать дополнительные очки. Для этого надо выбрать номер убираемой строки и нажать на кнопку. Если указанная линия полная, то она исчезнет и очки увеличатся, иначе ничего не произойдёт (рис. 4):

Рис. 4. Нажатие на кнопку Убрать линию

За горизонтальное перемещение влево/вправо отвечают кнопки «ф"/"в» соответственно. А за поворот фигуры? кнопка «ц» (рис. 5):

Рис. 5. Поворот и перемещение фигуры влево

Игра прекращается, как только фигура не может поместиться в игровом поле и её часть остаётся за его пределами. При этом очки перестают идти, фигуры двигаться, появляется окно, которое сообщает пользователю, что игра окончена, и он набрал определённое число очков (рис. 6):

Рис. 6. Окончание игры

После чего можно начать игру заново нажатием кнопки Начать.

7. Реализация

Описание данных

В программе описаны следующие типы:

class Block — //класс «Блок», родитель всех фигур

{

public const int l = 15; //сторона квадрата из которых состоят фигуры

protected Point Koor; //координаты левого верхнего угла фигуры

public Point[] smes; //массив смещений квадратов от левого угла

protected bool stop = false; //признак остановки

}

class z1: Block //1 фигура, наследуется от «Блок"'а

{

bool pov = true; //положение фигуры (2 положения)

}

class z2: Block //2 фигура, наследуется от «Блок"'а

{

bool pov = true; //положение фигуры (2 положения)

}

class shpala: Block //3 фигура, наследуется от «Блок"'а

{

bool pov = true; //положение фигуры (2 положения)

}

class g1: Block //4 фигура, наследуется от «Блок"'а

{

int pov=0; //положение фигуры (4 положения)

}

class g2: Block //5 фигура, наследуется от «Блок"'а

{

int pov=0; //положение фигуры (4 положения)

}

class kub: Block //6 фигура, наследуется от «Блок"'а

{ }

class Pole //игровое поле, в котором движутся фигуры

{

protected bool[][] pole; //массив, показывающий занята клетка или нет

protected int X; //горизонтальные размеры поля

protected int Y; //вертикальные размеры поля

}

Используются следующие переменные:

const int st = 345; //ширина поля, отведенного под прорисовку

int points = 0; //количество очков

Random rnd = new Random (); //случайные числа

Block B = new shpala (150,-15); //фигура (начинается с прямой линии)

Pole pole = new Pole (20, 25); //игровое поле

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

Рис. 7. Структура программы

Процедуры

private void Ticker (object sender, EventArgs e)? основная процедура приложения. Выполняется через каждый интервал таймера. Осуществляет запуск других процедур, двигающих, записывающих и прорисовывающих процедур. Алгоритм работы процедуры указан на схеме в границах Начало игры — Игра закончена (рис. 8):

Рис. 8. Алгоритм программы

private void btnStart_KeyPress (object sender, KeyPressEventArgs e)? процедура, осуществляющая для пользователя управление блоком в программе.

private void btnStart_Click (object sender, EventArgs e)? процедура, устанавливающая скорость падения блоков (интервал таймера)

Класс «Поле» имеет методы-процедуры:

public bool Zanyato (int x, int y, int l)? функция, определяющая, занята ли ячейка поля, с данными координатами.

public Image Print ()? процедура, прорисовывающая поле на форме

public void Gracia (ref int point, int n)? процедура, убирающая полную строку с номером n и начисляющая 1000 очков к point

Класс «Блок», а вместе с ним и все фигуры-потомки содержат:

public Image Draw (Image Img)? рисует фигуру

public Image Del (Image Img)? стирает фигуру

public void shag (Pole p)? опускает фигуру в поле на 1 шаг

public void left (Pole p)? совершает 1 шаг влево

public void right (Pole p)? совершает 1 шаг вправо

public virtual bool Is_V (int len)? определяет возможность опускаться

public virtual void povorot ()? совершает поворот фигуры вокруг своей оси

8. Тестирование

Первый подводный камень ожидает ещё до запуска игры. Это выбор скорости. Так как поле компонента TextBox содержит строку, а далеко не каждая строка является числом, то при переводе строки в число может возникнуть ошибка несоответствия типов данных. Поэтому пользователь лишается возможности вводить в поле TextBox’а какие-либо символы, он может только выбрать (рис. 9):

Рис. 9. Выбор скорости

Аналогичная ситуация может произойти и с выбором убираемой линии. Предотвращение ошибки аналогичное? выбор номера линии из списка (рис. 10).

Рис. 10. Выбор убираемой линии

Из возможностей пользователя в данном приложении осталось только управление самой фигурой. Ошибка может возникнуть, только если фигура выйдет за пределы игрового поля и границы массива (программной реализации поля). В этом случае может возникнуть ошибка записи в массив. Возможность возникновения этой ошибки реализовано программно так, что при попытке перемещения фигуры в невозможное место, запрос пользователя игнорируется, фигура не реагирует на команды пользователя. Например, при выходе за правую границу игрового поля (рис. 11).

Рис. 11. Предотвращение вывода фигуры из игрового поля

Заключение

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

1. развивать у пользователя сноровку и внимание

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

Список литературы

1. Полный справочник по С#. / Г. Шилдт/ Пер. с англ. -- М.: Издательский дом «Вильяме», 2010. -- 752 с.: ил. -- Парал. тит. англ.

2. Beginning C# / Karl! Watson, Marco Bellinaso, Ollie Comes, David Espinosa / Издательство «Лори», 2009. -- 864 с.

3. Программирование на языке C#. / Фаронов В. /-- Спб.: Питер. 2007. -- 240 с.

4. Visual С# 2008: базовый курс. / Уотсон, Карл и, Нейгел, Кристиан, Педерсен / Пер. с англ. — М.: ООО «И.Д. Вильяме», 2011. -- 1216 с.

Приложение

Листинг программы

Основные структурные части программы:

Модуль Pole. cs

using System. Collections. Generic;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

namespace Вторая

{

class Pole //игровое поле

{

protected bool[][] pole; //логический двумерный массив-таблица игры

protected int X; //ширина,

protected int Y; //высота поля

public Pole (int a, int b) // 20−25 конструктор с заданием размерности поля

{

X = a;

Y = b;

pole=new bool[a][]; //выделение памяти под массив

for (int i=0; i < a; i=i+1)

{

pole[i] = new bool[b];

}

}

public void Zap (Block fig) //запись фигуры в поле

{

Point Koor = new Point ();

Koor=fig. K ();

for (int i=0; i<fig. smes. Length; i++)

{

pole[(Koor.X + 15 * fig. smes[i]. X) / 15][(Koor.Y + 15 * fig. smes[i]. Y) / 15] = true;

}

}

public bool Zanyato (int x, int y, int l) //определение, свободности клетки поля

{

return ((pole[x][y]));

}

public Image Print () //рисование поля на рисунке

{

Bitmap btm = new Bitmap (400,400); //создание пустой картинки

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

{

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

{

if (pole[i][j])

{

Block temp = new Block (i*15,j*15);

btm = (Bitmap)temp. Draw ((Image)btm); //заполнение её блоками

}

}

}

return btm;

}

public void Gracia (ref int point, int n) //удаление полной линии

{

bool ok = true;

int bonus = 0;

for (int i=0; ok& &(i<X); i++)

{

ok = ok & & pole[i][Y-n];

}

if (ok) //если линия полная- смещение в массиве

{

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

{

for (int j=Y-n; j>0; j--)

{ pole[i][j] = pole[i][j — 1]; }

}

bonus = 1000;

}

point = point+bonus; //начисление очков

}

}

}

Модуль Block. cs //блок-родитель

using System;

using System. Collections. Generic;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

namespace Вторая

{

class Block

{

public const int l = 15; //длина квадратика на изображении

protected Point Koor; //левый верхний угол

public Point[] smes; //массив смещений квадратов от Koor

protected bool stop = false; //прекращение движения фигуры

public Point K () { return Koor;} //доступ к координате

public Block () //конструктор

{

Koor = new Point (0, 0);

smes = new Point[1];

smes[0] = new Point (0,0);

stop = false;

}

public Block (int x, int y) //конструктор с координатами

{

Koor = new Point (x, y);

smes = new Point[1];

smes[0] = new Point (0, 0);

stop = false;

}

public Image Draw (Image Img) //рисование

{

Bitmap btm = new Bitmap (Img); //300−375

for (int i = 0; i < smes. Length; i++)

{

Point[] temp = new Point[4];

temp[0] = new Point (Koor.X + smes[i].X * l, Koor. Y + smes[i].Y * l);

temp[1] = new Point (Koor.X + smes[i].X * l + l, Koor. Y + smes[i].Y * l);

temp[2] = new Point (Koor.X + smes[i].X * l + l, Koor. Y + l + smes[i].Y * l);

temp[3] = new Point (Koor.X + smes[i].X * l, Koor. Y + l + smes[i].Y * l);

Graphics g = Graphics. FromImage (btm);

g. FillPolygon (Brushes. Gray, temp);

g. DrawPolygon (new Pen (Color. Black), temp);

}

return btm;

}

public Image Del (Image Img) //стирание

{

Bitmap btm = new Bitmap (Img);

for (int i = 0; i < smes. Length; i++)

{

Point[] temp = new Point[4];

temp[0] = new Point (Koor.X + smes[i].X * l, Koor. Y + smes[i].Y * l);

temp[1] = new Point (Koor.X + smes[i].X * l + l, Koor. Y + smes[i].Y * l);

temp[2] = new Point (Koor.X + smes[i].X * l + l, Koor. Y + l + smes[i].Y * l);

temp[3] = new Point (Koor.X + smes[i].X * l, Koor. Y + l + smes[i].Y * l);

Graphics g = Graphics. FromImage (btm);

g. FillPolygon (Brushes. White, temp);

g. DrawPolygon (new Pen (Color. White), temp);

}

return btm;

}

public void shag (Pole p) //перемещение на 1 шаг вниз

{

bool ok = true;

for (int i = 0; i < smes. Length; i++)

{

ok = ok& &(!p. Zanyato (Koor.X / 15+smes[i]. X, Koor. Y / 15 + 1+smes[i]. Y, l));

}

if (ok) //если можно, то почему бы и нет?

{ Koor. Y = Koor. Y + l; }

else stop = true;

}

public void left (Pole p) //перемещение блока на 1 шаг влево

{

bool ok = true;

if (Koor.X ≠ 0)

{

for (int i = 0; i < smes. Length; i++)

{

ok = ok & & (!p. Zanyato (Koor.X / 15 + smes[i].X — 1, Koor. Y / 15 + smes[i]. Y, l));

}

if (ok) Koor. X = Koor. X — l;

}

}

public void right (Pole p) //перемещение на 1 шаг вправо

{

bool ok = true;

if (smes. Length > 3)

{

if ((Koor. X+l*smes[3]. X) <= 270)

{

for (int i = 0; i < smes. Length; i++)

{

ok = ok & & (!p. Zanyato (Koor.X / 15 + smes[i].X + 1, Koor. Y / 15 + smes[i]. Y, l));

}

if (ok) Koor. X = Koor. X + l;

}

}

else

{

if (Koor.X <= 270) Koor. X = Koor. X + l;

}

}

public virtual bool Is_V (int len) { return ((!stop)& &(Koor.Y — l < len)); }

public virtual void povorot () { }

}

}

Модули классов-потомков:

Модуль Kub. cs //кубик

using System;

using System. Collections. Generic;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

namespace Вторая

{

class kub: Block

{

public kub () //конструктор

{

Koor = new Point (0, 0);

smes = new Point[4];

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 1;

smes[1].Y = 0;

smes[2].X = 0;

smes[2].Y = 1;

smes[3].X = 1;

smes[3].Y = 1;

stop = false;

}

public kub (int x, int y) //конструктор с координатами

{

Koor = new Point (x, y);

smes = new Point[4];

smes[0].X = 0; //заполнение особенного массива смещений

smes[0].Y = 0;

smes[1].X = 1;

smes[1].Y = 0;

smes[2].X = 0;

smes[2].Y = 1;

smes[3].X = 1;

smes[3].Y = 1;

stop = false;

}

public override bool Is_V (int len) { return ((!stop) & (Koor.Y + ((smes[3]. Y) * l — 1) < len)); }

}

}

Модуль Z1. cs //буква Z

using System. Collections. Generic;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

namespace Вторая

{

class z1: Block //аналогично предыдущей фигуре

{

bool pov = true;

public z1()

{

Koor = new Point (0, 0);

smes = new Point[4];

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 1;

smes[1].Y = 0;

smes[2].X = 1;

smes[2].Y = 1;

smes[3].X = 2;

smes[3].Y = 1;

}

public z1(int x, int y)

{

Koor = new Point (x, y);

smes = new Point[4];

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 1;

smes[1].Y = 0;

smes[2].X = 1;

smes[2].Y = 1;

smes[3].X = 2;

smes[3].Y = 1;

}

public override void povorot () //поворот фигуры

{

if (!pov) //осуществляется изменением массива

{ //смещений

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 1;

smes[1].Y = 0;

smes[2].X = 1;

smes[2].Y = 1;

smes[3].X = 2;

smes[3].Y = 1;

}

else

{

smes[0].X = 0;

smes[0].Y = 1;

smes[1].X = 1;

smes[1].Y = 0;

smes[2].X = 1;

smes[2].Y = 1;

smes[3].X = 0;

smes[3].Y = 2;

}

pov = !pov;

}

public override bool Is_V (int len)

{

return ((!stop) & (Koor.Y + ((smes[3]. Y) * (l — 1)) < len));

}

}

}

Модуль Z2. cs //фигура Z развернутая

using System. Collections. Generic;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

namespace Вторая

{

class z2: Block

{

bool pov = true;

public z2() // **

{ // **

Koor = new Point (0, 0);

smes = new Point[4];

smes[0].X = 0;

smes[0].Y = 1;

smes[1].X = 1;

smes[1].Y = 1;

smes[2].X = 1;

smes[2].Y = 0;

smes[3].X = 2;

smes[3].Y = 0;

}

public z2(int x, int y)

{

Koor = new Point (x, y);

smes = new Point[4];

smes[0].X = 0;

smes[0].Y = 1;

smes[1].X = 1;

smes[1].Y = 1;

smes[2].X = 1;

smes[2].Y = 0;

smes[3].X = 2;

smes[3].Y = 0;

}

public override void povorot ()

{

if (!pov)

{

smes[0].X = 0;

smes[0].Y = 1;

smes[1].X = 1;

smes[1].Y = 1;

smes[2].X = 1;

smes[2].Y = 0;

smes[3].X = 2;

smes[3].Y = 0;

}

else

{

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 1;

smes[2].Y = 1;

smes[3].X = 1;

smes[3].Y = 2;

}

pov = !pov;

}

public override bool Is_V (int len) { return ((!stop) & (Koor.Y + ((smes[3]. Y) * (l — 1)) < len)); }

}

}

Модуль G1. cs // фигура Г

using System. Collections. Generic;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

namespace Вторая

{

class g1: Block

{

int pov = 0;

public g1()

{

Koor = new Point (0, 0);

smes = new Point[4];

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 0;

smes[2].Y = 2;

smes[3].X = 1;

smes[3].Y = 0;

}

public g1(int x, int y)

{

Koor = new Point (x, y);

smes = new Point[4];

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 1;

smes[2].Y = 0;

smes[3].X = 0;

smes[3].Y = 2;

}

public override void povorot ()

{

switch (pov)

{

case 3:

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 1;

smes[2].Y = 0;

smes[3].X = 0;

smes[3].Y = 2;

pov = 0;

break;

case 0:

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 1;

smes[2].Y = 1;

smes[3].X = 2;

smes[3].Y = 1;

pov = 1;

break;

case 1:

smes[0].X = 0;

smes[0].Y = 2;

smes[1].X = 1;

smes[1].Y = 0;

smes[2].X = 1;

smes[2].Y = 1;

smes[3].X = 1;

smes[3].Y = 2;

pov = 2;

break;

case 2:

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 1;

smes[1].Y = 0;

smes[2].X = 2;

smes[2].Y = 0;

smes[3].X = 2;

smes[3].Y = 1;

pov = 3;

break;

}

}

public override bool Is_V (int len) { return ((!stop) & (Koor.Y + ((smes[3]. Y) * (l — 1)) < len)); }

}

}

Модуль G2. cs // фигура Г2

using System. Collections. Generic;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

namespace Вторая

{

class g2: Block

{

int pov=0;

public g2()

{

Koor = new Point (0, 0);

smes = new Point[4];

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 0;

smes[2].Y = 2;

smes[3].X = 1;

smes[3].Y = 0;

}

public g2(int x, int y)

{

Koor = new Point (x, y); smes = new Point[4];

smes[0].X = 1;

smes[0].Y = 0;

smes[1].X = 1;

smes[1].Y = 1;

smes[2].X = 0;

smes[2].Y = 0;

smes[3].X = 1;

smes[3].Y = 2;

}

public override void povorot ()

{

switch (pov)

{

case 3:

smes[0].X = 1;

smes[0].Y = 0;

smes[1].X = 1;

smes[1].Y = 1;

smes[2].X = 0;

smes[2].Y = 0;

smes[3].X = 1;

smes[3].Y = 2;

pov = 0;

break;

case 0:

smes[0].X = 0;

smes[0].Y = 1;

smes[1].X = 1;

smes[1].Y = 1;

smes[2].X = 2;

smes[2].Y = 1;

smes[3].X = 2;

smes[3].Y = 0;

pov = 1;

break;

case 1:

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 0;

smes[2].Y = 2;

smes[3].X = 1;

smes[3].Y = 2;

pov = 2;

break;

case 2:

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 1;

smes[2].Y = 0;

smes[3].X = 2;

smes[3].Y = 0;

pov = 3;

break;

}

}

public override bool Is_V (int len) { return ((!stop) & (Koor.Y + ((smes[3]. Y) * (l — 1)) < len)); }

}

}

Модуль Shpala. cs //прямая фигура

using System. Collections. Generic;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

namespace Вторая

{

class shpala: Block

{

bool pov = true;

public shpala ()

{

Koor = new Point (0, 0);

smes = new Point[4];

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 0;

smes[2].Y = 2;

smes[3].X = 0;

smes[3].Y = 3;

stop = false;

}

public shpala (int x, int y)

{

Koor = new Point (x, y);

smes = new Point[4];

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 0;

smes[2].Y = 2;

smes[3].X = 0;

smes[3].Y = 3;

stop = false;

}

public override void povorot ()

{

if (!pov)

{

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 0;

smes[1].Y = 1;

smes[2].X = 0;

smes[2].Y = 2;

smes[3].X = 0;

smes[3].Y = 3;

}

else

{

smes[0].X = 0;

smes[0].Y = 0;

smes[1].X = 1;

smes[1].Y = 0;

smes[2].X = 2;

smes[2].Y = 0;

smes[3].X = 3;

smes[3].Y = 0;

}

pov = !pov;

}

public override bool Is_V (int len) { return ((!stop)& (Koor. Y+((smes[3]. Y)*l-1) < len)); }

}

}

Модуль главной формы //MyForm

using System;

using System. Collections. Generic;

using System. ComponentModel;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

using System. Windows. Forms;

namespace Вторая

{

public partial class MyForm: Form

{

const int st = 345; //пояснялись выше

int points = 0;

Random rnd = new Random ();

Block B = new shpala (150,-15);

Pole pole = new Pole (20, 25);

public MyForm () //конструктор

{

InitializeComponent ();

}

private void Form1_Load (object sender, EventArgs e) //загрузка формы

{

this. BackgroundImage = new Bitmap (300,375);

}

private void Ticker (object sender, EventArgs e) //процедура таймера

{

points = points+1; //очки

lblO4. Text = Convert. ToString (points); //их вывод

if (B. Is_V (st))

{

this. BackgroundImage = B. Del (this. BackgroundImage); //стереть

B. shag (pole); //переместить

this. BackgroundImage = B. Draw (this. BackgroundImage);//нарисовать

}

else

{

if (B. K ().Y <= 0) //фигура вне поля, проигрыш

{

tm. Enabled = false;

MessageBox. Show («Игра окончена"+(char)13+(char)10+"Ваш счет: «+Convert. ToString (points));

btnStart. Text = «Начать»;

points = 0; //обнуление очков

pole = new Pole (20, 25); //очищение поля

B = new shpala (150, -15); //создание новой фигуры

this. BackgroundImage = pole. Print (); //прорисовка поля

return;

}

int a = rnd. Next (6); //создание следующей фигуры

pole. Zap (B);

switch (a)

{

case 0:

B = new z1(150, -15);

break;

case 1:

B = new z2(150, -15);

break;

case 2:

B = new g1(150, -15);

break;

case 3:

B = new g2(150, -15);

break;

case 4:

B = new shpala (150, -15);

break;

case 5:

B = new kub (150, -15);

break;

}

}

}

private void btnStart_Click (object sender, EventArgs e) //начало, остановка игры

{

if (btnStart. Text == «Начать»)

{

if (cbSkor. Text == ««) return;

btnStart. Text = «Стоп»;

tm. Enabled = true; //включение таймера

tm. Interval = (11-Convert. ToInt32(cbSkor. Text))*256;

}

else

{

btnStart. Text = «Начать»;

tm. Enabled = false; //выключение таймера

}

}

private void cbSkor_KeyPress (object sender, KeyPressEventArgs e)//отмена ввода

{

e. KeyChar=(char)0;

}

private void btnStart_KeyPress (object sender, KeyPressEventArgs e)//управление

{

if ((tm. Enabled)&&(B. Is_V (st)))

if ((e. KeyChar == 'a') || (e. KeyChar == 'A') || (e. KeyChar == 'ф') || (e. KeyChar == 'Ф')) { this. BackgroundImage = B. Del (this. BackgroundImage); B. left (pole); this. BackgroundImage = B. Draw (this. BackgroundImage); }

else if ((e. KeyChar == 'd') || (e. KeyChar == 'D') || (e. KeyChar == 'в') || (e. KeyChar == 'В')) { this. BackgroundImage = B. Del (this. BackgroundImage); B. right (pole); this. BackgroundImage = B. Draw (this. BackgroundImage); }

else if ((e. KeyChar == 'ц') || (e. KeyChar == 'Ц') || (e. KeyChar == 'W') || (e. KeyChar == 'w')) { this. BackgroundImage = B. Del (this. BackgroundImage); B. povorot (); this. BackgroundImage = B. Draw (this. BackgroundImage); }

}

private void btnStart_KeyDown (object sender, KeyEventArgs e) //ускорение

(e. KeyValue == 'ы'))& &(tm. Interval>10)) tm. Interval = tm. Interval / 2;

private void btnStart_KeyUp (object sender, KeyEventArgs e) //возвращение скорости

private void button1_Click (object sender, EventArgs e) //убрать линию

{

pole. Gracia (ref points, Convert. ToInt32(cbLine. Text)); //убрать линию

this. BackgroundImage=pole. Print (); //нарисовать поле

}

}

}

ПоказатьСвернуть
Заполнить форму текущей работой