Программирование игры 'Тетрис'
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() //рисование
поля
на
рисунке
{
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;Вторая
{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();
//нарисовать
поле
}
}
}