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

 

1. Введение


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

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

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



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


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

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

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


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


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

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

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


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

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

Данная программа реализована в визуальной среде программирования 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 положения)

}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) ? рисует фигуруImage Del(Image Img) ? стирает фигуру void shag(Pole p) ? опускает фигуру в поле на 1 шаг

public void left(Pole p) ? совершает 1 шаг влевоvoid right(Pole p) ? совершает 1 шаг вправо virtual bool Is_V(int len) ? определяет возможность опускаться

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


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


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


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


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



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


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


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


Заключение


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

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

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



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


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

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

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

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



Приложение


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

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

Модуль Pole.csSystem.Collections.Generic;System.Data;System.Drawing;System.Linq;System.Text;Вторая

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

{bool[][] pole; //логический двумерный массив-таблица игрыint X; //ширина,int Y; //высота поля Pole(int a, int b) // 20-25 конструктор с заданием размерности поля

{= a;= b;=new bool[a][]; //выделение памяти под массив(int i=0; i < a; i=i+1)

{[i] = new bool[b];

}

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

{Koor = new Point();=fig.K();(int i=0;i<fig.smes.Length ;i++ )

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

}

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

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

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

{

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

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

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

{(pole[i][j])

{temp = new Block(i*15,j*15);= (Bitmap)temp.Draw((Image)btm); //заполнение её блоками

}

}

}btm;

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

{ok = true;bonus = 0;(int i=0; ok&&(i<X) ;i++ )

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

}

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

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

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

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

}= 1000;

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

}

}

}

Модуль Block.cs //блок-родительSystem;System.Collections.Generic;System.Data;System.Drawing;System.Linq;System.Text;Вторая

{ Block

{

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

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

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

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

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

{= new Point(0, 0);= new Point[1];[0] = new Point(0,0);= false;

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

{= new Point(x, y);= new Point[1];[0] = new Point(0, 0);= false;

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

{btm = new Bitmap(Img); //300-375(int i = 0; i < smes.Length; i++)

{[] temp = new Point[4];[0] = new Point(Koor.X + smes[i].X * l, Koor.Y + smes[i].Y * l);[1] = new Point(Koor.X + smes[i].X * l + l, Koor.Y + smes[i].Y * l);[2] = new Point(Koor.X + smes[i].X * l + l, Koor.Y + l + smes[i].Y * l);[3] = new Point(Koor.X + smes[i].X * l, Koor.Y + l + smes[i].Y * l);g = Graphics.FromImage(btm);.FillPolygon(Brushes.Gray, temp);.DrawPolygon(new Pen(Color.Black), temp);

}btm;

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

{btm = new Bitmap(Img);(int i = 0; i < smes.Length; i++)

{[] temp = new Point[4];[0] = new Point(Koor.X + smes[i].X * l, Koor.Y + smes[i].Y * l);[1] = new Point(Koor.X + smes[i].X * l + l, Koor.Y + smes[i].Y * l);[2] = new Point(Koor.X + smes[i].X * l + l, Koor.Y + l + smes[i].Y * l);[3] = new Point(Koor.X + smes[i].X * l, Koor.Y + l + smes[i].Y * l);g = Graphics.FromImage(btm);.FillPolygon(Brushes.White, temp);.DrawPolygon(new Pen(Color.White), temp);

}btm;

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

{ok = true;(int i = 0; i < smes.Length; i++)

{= 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;

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

{ok = true;(Koor.X != 0)

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

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

}(ok) Koor.X = Koor.X - l;

}

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

{ok = true;(smes.Length > 3)

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

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

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

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

}

}

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

}

}virtual bool Is_V(int len) { return ((!stop)&&(Koor.Y - l < len) ); }virtual void povorot() { }

}

}

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

Модуль Kub.cs //кубикSystem;System.Collections.Generic;System.Data;System.Drawing;System.Linq;System.Text;Вторая

{kub:Block

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

{= new Point(0, 0);= new Point[4];[0].X = 0;[0].Y = 0;[1].X = 1;[1].Y = 0;[2].X = 0;[2].Y = 1;[3].X = 1;[3].Y = 1;= false;

}

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

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

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

smes[0].Y = 0;[1].X = 1;[1].Y = 0;[2].X = 0;[2].Y = 1;[3].X = 1;[3].Y = 1;= false;

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

}

}

Модуль Z1.cs //буква ZSystem.Collections.Generic;System.Data;System.Drawing;System.Linq;System.Text; Вторая

{

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

{pov = true;z1()

{= new Point(0, 0);= new Point[4];[0].X = 0;[0].Y = 0;[1].X = 1;[1].Y = 0;[2].X = 1;[2].Y = 1;[3].X = 2;[3].Y = 1;

}z1(int x, int y)

{= new Point(x, y);= new Point[4];[0].X = 0;[0].Y = 0;[1].X = 1;[1].Y = 0;[2].X = 1;[2].Y = 1;[3].X = 2;[3].Y = 1;

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

{

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

{ //смещений

smes[0].X = 0;[0].Y = 0;[1].X = 1;[1].Y = 0;[2].X = 1;[2].Y = 1;[3].X = 2;[3].Y = 1;

}

{[0].X = 0;[0].Y = 1;[1].X = 1;[1].Y = 0;[2].X = 1;[2].Y = 1;[3].X = 0;[3].Y = 2;

}= !pov;

}override bool Is_V(int len)

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

}

}

}

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

using System.Collections.Generic;System.Data;System.Drawing;System.Linq;System.Text;Вторая

{z2 : Block

{pov = true;z2() // **

{ // **= new Point(0, 0);= new Point[4];[0].X = 0;[0].Y = 1;[1].X = 1;[1].Y = 1;[2].X = 1;[2].Y = 0;[3].X = 2;[3].Y = 0;

}z2(int x, int y)

{= new Point(x, y);= new Point[4];[0].X = 0;[0].Y = 1;[1].X = 1;[1].Y = 1;[2].X = 1;[2].Y = 0;[3].X = 2;[3].Y = 0;

}override void povorot()

{(!pov)

{[0].X = 0;[0].Y = 1;[1].X = 1;[1].Y = 1;[2].X = 1;[2].Y = 0;[3].X = 2;[3].Y = 0;

}

{[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 1;[2].Y = 1;[3].X = 1;[3].Y = 2;

}= !pov;

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

}

}

Модуль G1.cs // фигура ГSystem.Collections.Generic;System.Data;System.Drawing;System.Linq;System.Text;Вторая

{g1:Block

{pov = 0;g1()

{= new Point(0, 0);= new Point[4];[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 0;[2].Y = 2;[3].X = 1;[3].Y = 0;

}g1(int x, int y)

{= new Point(x, y);= new Point[4];[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 1;[2].Y = 0;[3].X = 0;[3].Y = 2;

}override void povorot()

{(pov)

{3:[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 1;[2].Y = 0;[3].X = 0;[3].Y = 2;= 0;;0:[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 1;[2].Y = 1;[3].X = 2;[3].Y = 1;= 1;;1:[0].X = 0;[0].Y = 2;[1].X = 1;[1].Y = 0;[2].X = 1;[2].Y = 1;[3].X = 1;[3].Y = 2;= 2;;2:[0].X = 0;[0].Y = 0;[1].X = 1;[1].Y = 0;[2].X = 2;[2].Y = 0;[3].X = 2;[3].Y = 1;= 3;;

}

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

}

}

Модуль G2.cs // фигура Г2System.Collections.Generic;System.Data;System.Drawing;System.Linq;System.Text;Вторая

{g2 : Block

{pov=0;g2()

{= new Point(0, 0);= new Point[4];[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 0;[2].Y = 2;[3].X = 1;[3].Y = 0;

}g2(int x, int y)

{= new Point(x, y); smes = new Point[4];[0].X = 1;[0].Y = 0;[1].X = 1;[1].Y = 1;[2].X = 0;[2].Y = 0;[3].X = 1;[3].Y = 2;

}override void povorot()

{(pov)

{3:[0].X = 1;[0].Y = 0;[1].X = 1;[1].Y = 1;[2].X = 0;[2].Y = 0;[3].X = 1;[3].Y = 2;= 0;;0:[0].X = 0;[0].Y = 1;[1].X = 1;[1].Y = 1;[2].X = 2;[2].Y = 1;[3].X = 2;[3].Y = 0;= 1;;1:[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 0;[2].Y = 2;[3].X = 1;[3].Y = 2;= 2;;2:[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 1;[2].Y = 0;[3].X = 2;[3].Y = 0;= 3;;

}

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

}

}

Модуль Shpala.cs //прямая фигураSystem.Collections.Generic;System.Data;System.Drawing;System.Linq;System.Text;Вторая

{shpala : Block

{pov = true;shpala()

{= new Point(0, 0);= new Point[4];[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 0;[2].Y = 2;[3].X = 0;[3].Y = 3;= false;

}shpala(int x, int y)

{= new Point(x, y);= new Point[4];[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 0;[2].Y = 2;[3].X = 0;[3].Y = 3;= false;

}override void povorot()

{(!pov)

{[0].X = 0;[0].Y = 0;[1].X = 0;[1].Y = 1;[2].X = 0;[2].Y = 2;[3].X = 0;[3].Y = 3;

}

{[0].X = 0;[0].Y = 0;[1].X = 1;[1].Y = 0;[2].X = 2;[2].Y = 0;[3].X = 3;[3].Y = 0;

}= !pov;

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

}

}

Модуль главной формы //MyFormSystem;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;Вторая

{partial class MyForm : Form

{int st = 345; //пояснялись вышеpoints = 0;rnd = new Random();B = new shpala(150,-15);pole = new Pole(20, 25);MyForm() //конструктор

{();

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

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

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

{= points+1; //очки.Text = Convert.ToString(points); //их вывод(B.Is_V(st))

{.BackgroundImage = B.Del(this.BackgroundImage); //стереть.shag(pole); //переместить.BackgroundImage = B.Draw(this.BackgroundImage);//нарисовать

}

else

{

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

{.Enabled = false;.Show("Игра окончена"+(char)13+(char)10+"Ваш счет: "+Convert.ToString(points));.Text = "Начать";= 0; //обнуление очков = new Pole(20, 25); //очищение поля

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

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

}

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

pole.Zap(B);(a)

{0:= new z1(150, -15);;1:= new z2(150, -15);;2:= new g1(150, -15);;3:= new g2(150, -15);;4:= new shpala(150, -15);;5:= new kub(150, -15);;

}

}

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

{(btnStart.Text == "Начать")

{(cbSkor.Text == "") return;.Text = "Стоп";.Enabled = true; //включение таймера.Interval = (11-Convert.ToInt32(cbSkor.Text))*256;

}

{.Text = "Начать";.Enabled = false; //выключение таймера

}

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

{.KeyChar=(char)0;

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

{((tm.Enabled)&&(B.Is_V(st)))((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); }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); }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); }

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

{(((e.KeyValue == 's') || (e.KeyValue == 'S') || (e.KeyValue == 'Ы') || (e.KeyValue == 'ы'))&&(tm.Interval>10)) tm.Interval = tm.Interval / 2;

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

{((e.KeyValue == 's') || (e.KeyValue == 'S') || (e.KeyValue == 'Ы') || (e.KeyValue == 'ы')) tm.Interval = (11 - Convert.ToInt32(cbSkor.Text)) * 256;

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

{.Gracia(ref points, Convert.ToInt32(cbLine.Text)); //убрать линию.BackgroundImage=pole.Print(); //нарисовать поле

}

}

}


1. Введение Одним из трёх «китов», на котором основывается объектно-ориентированное программирование, является наследование. Это механизм, позв

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ