Временный объект - объект типа MainWindow, служит для
отображения всех компонет программы в одном окне.- экземпляр класса ListView,
предоставляет возможность отображать данные в виде таблицы.* - ToolBox
позволяющий группировать для отображения ToolBox’ов в нем.- класс позволяющий
вызывать диалог с предуприждением о некотором событии и реакции пользователя на
него.[4, 2] - двумерный массив типа intдля хранения, доступа и изменения
координат фигуры.[10, 19] - двумерный массивтипа boolдля хранения, доступа и
изменения фигур расположенных на игровой доске.
Экземпляр
класса является фигурой на игровой доске
|
Shape
|
Экземпляр
класса является основным обработчиком алгоритмов тетриса
|
Build
|
Экземпляр
класса является танком на игровой доске
|
Tank
|
Экземпляр
класса является пулей на игровой доске
|
Shot
|
Экземпляр
класса является основным обработчиком алгоритмов игры "Гонки
(танки)"
|
Tanks
|
Экземпляр класса
является главным GUIокном приложения
|
MainWindow
|
5.
Блок-схема алгоритма
5.1
Блок-схема функции voidLineRem () - функция удаляет заполненные линии в игре
"стройка" и опускает "постройку" в низ
5.2
Блок-схема функции voidcheckCoord (int [,] m)
Блок-схема функции voidcheckCoord (int [,] m) - функция
проверяет не вышли ли координаты фигурыза границы игровой доски.
6.
Алгоритмы функций
.1
Алгоритм функции voidMainWindow_FormClosing (objectsender,
FormClosingEventArgse)
Алгоритм функции voidMainWindow_FormClosing (objectsender, FormClosingEventArgse) - функция закрывает все
активные потоки и закрывает программу.
Начало.
Входные данные:
sender - системный объект типа objectкоторый вызвал
событие.
e - объект типа EventArgs - системные аргументы
произошедшего события.
game - объект класса MainWindow типа stringхранящий
название запущенной игры.
Buld_ - объект класса MainWindowтипа Buildдля запуска
игры "стройка".
Tanks_ - объект класса MainWindowтипа Tanks_ для
запуска игры "гонки (танки)".
if (game == “Build”) если текущая игра "стройка" то
выполняем пункт 3 иначе переходим к пункту8.(Build_. thr! = null) если поток
игры "стройка" запущен то выполняем пункт 4 иначе переходим к пункту
8.
if (Build_. thr. ThreadState == System. Threading. ThreadState.
Suspended) еслипотокнаходитсявсостоянии "паузы" то выполняем пункты
5-6 иначе переходим к пункту 7._. thr. Resume (); восстанавливаем поток._. thr.
Abort (); останавливаем поток полностью._. thr. Abort (); останавливаем поток
полностью.(game == “Tanks” &&Tanks_! = null) если текущая игра
"гонки (танки)" и объект класса MainWindowTanks_ инициализирован то
выполняем пункт 9 иначе переходим к пункту 19.
if (Tanks_. thr! = null) если поток игры "гонки
(танки)" инициализирован то выполняем 10 пункт иначе переходим к пункту
19.(Tanks_. thr. ThreadState == System. Threading. ThreadState. Suspended) если
поток находится в состоянии "паузы" то выполняем пункты 11 - иначе
переходим к пункту 16._. thr. Resume (); восстанавливаем поток._. thr. Abort
(); останавливаем поток полностью.. Resume (); восстанавливаем поток.. Abort
(); останавливаем поток полностью.. Text = “0”; обнуляем таймер._. thr. Abort
(); останавливаем поток полностью.. Abort (); останавливаем поток полностью..
Text = “0”; обнуляем таймер.
Конец.
.3
АлгоритмфункцииvoidStartTanks (objectsender, EventArgse)
АлгоритмфункцииvoidStartTanks (objectsender, EventArgse) -
функциязапускает или останавливает игру гонки (танки).
Начало.
Входные данные:
sender - системный объект типа objectкоторый вызвал
событие.
e - объект типа EventArgs - системные аргументы
произошедшего события.
Tanks_ - объект класса MainWindowтипа Tanks для запуска
игры "гонки (танки)".
thrTime - объект класса MainWindowтипа Threadдля запуска
таймера в отдельном потоке.
richTextBox1, richTextBox2 - объекты класса
MainWindowтипа RichTextBox содержащие имена игроков.
if (Tanks_ == null) если объект игры "гонки
(танки)" не инициализирован то выполняем пункты 3-9 иначе переходим к 10
пункту.. Text = “Stop”; помечаем кнопку запуска теперь как кнопку остановки._ =
newTanks (); инициализируем объект Tanks_._. Start (); запускаем игру
"гонки (танки)".. Enabled = false; закрываем доступ для изменения
имени игрока 1.. Enabled = false; закрываем доступ для изменения имени игрока
2._. Tank_1. name = richTextBox2. Text; приваиваемимятанку 2._. Tank_. name =
richTextBox1. Text; приваиваемимятанку 1.. Text = “Start”; помечаем кнопку
остановки теперь как кнопку запуска._. thr. Abort (); останавливаем поток в
котором выполняется игра "гонки (танки)"._. ClearTable (); чистим
игровую доску._ = null; обнуляем объект игры "гонки (танки)".. Abort
(); останавливаем поток в котором выполнялся таймер.. Text = “0”; обнуляем
таймер. Enabled = true; открываем доступ для изменения имени игрока 1.. Enabled
= true; открываем доступ для изменения имени игрока 2.
Конец
7.
Результат работы программы
Рисунок 7.1 - выбор игры
Рисунок 7.2 - начало игры в гонки
Рисунок 7.3 - игровой процесс
Рисунок 7.4 - конец игры
Рисунок 7.5 - начало игры в стройку
Рисунок 7.6 - игровой процесс
Рисунок 7.7 - конец игры
Заключение
В результате данной работы была создана программа, для игры в
гонки и стройку на основе игровой системы тетрис. Программа выполненна в
современной эргономике и будет интересна разным вовзрастным категориям. Есть
возможность на базе этой программы разрабатывать дополнительные игры.
Поддерживаемые операционный системы:
· Windows 98,
2000, XP, Vista, 7 (x86 или x86_64)
Список литературы
1. Документация MSDNна
http://MSDN. microsoft.com <http://MSDN.microsoft.com>.
. C# в подлиннике.
Наиболее полное руководство Х. Дейтел. Санк-Петербург "БХВ-Петербург"
2006
Приложение
А. Листинг программы
КлассShape - отвечает за падающую фигуру в игре
"стройка".
using System;System.
Collections. Generic;System. Linq;System. Text;System. Threading. Tasks;System.
Drawing;System. Drawing. Drawing2D;TetrixSystem
{
{lastShape = 0;count =
0;nextShape = 0;state = 1;d = true;[,] coord = {
{0,0}, // x,y
{0,0},
{0,0},
{0,0},
};[,] tcoord = {
{0,0}, // x,y
{0,0},
{0,0},
{0,0},
};left ()
{(coord [0, 0] == 0 || coord [1,
0] == 0 || coord [2, 0] == 0 || coord [3, 0] == 0);x = 0;y = 0;x1 = 0;y1 = 0;f
= false;(int i = 0; i < 4; i++)
{= coord [i, 0];= coord [i,
1];(MainWindow. table [x - 1, y] == true)
{(int j = 0; j < 4; j++)
{= coord [j, 0];
y1 = coord [j, 1];(x - 1 == x1
&& y == y1)
{= true;;
}
}(! f) return;= false;
}
}();[0, 0] - -;[1, 0] - -;[2, 0]
- -;[3, 0] - -;();. Inv ();
}right ()
{(coord [0, 0] == 9 || coord [1,
0] == 9 || coord [2, 0] == 9 || coord [3, 0] == 9);x = 0;y = 0;x1 = 0;y1 = 0;f
= false;(int i = 0; i < 4; i++)
{= coord [i, 0];= coord [i,
1];(MainWindow. table [x + 1, y] == true)
{(int j = 0; j < 4; j++)
{= coord [j, 0];
y1 = coord [j, 1];(x + 1 == x1
&& y == y1)
{= true;;
}
}(! f) return;= false;
}
}();[0, 0] ++;[1, 0] ++;[2, 0]
++;[3, 0] ++;();. Inv ();
}down ()
{(coord [0, 1] == 18 || coord
[1, 1] == 18 || coord [2, 1] == 18 || coord [3, 1] == 18)
returnfalse;x = 0;y = 0;x1 =
0;y1 = 0;
bool f = false;(int i = 0; i
< 4; i++)
{= coord [i, 0];= coord [i,
1];(MainWindow. table [x, y + 1] == true)
{(int j = 0; j < 4; j++)
{= coord [j, 0];
y1 = coord [j, 1];(x == x1
&& y + 1 == y1)
{= true;;
}
}(! f);= false;
}
}();[0, 1] ++;[1, 1] ++;[2, 1]
++;[3, 1] ++;();. Inv ();;
}x (int index) { return coord
[index, 0]; }y (int index) { return coord [index, 1]; }setX (int index, int x)
{ coord [index, 0] = x; }setY (int index, int y) { coord [index, 1] = y;
}tmoveCoord (int id, string d, int c = 1)
{(int i = 0; i < c; i++)
{(d)
{"Left":[id, 0] =
tcoord [id, 0] - 1; break;"Right":[id, 0] = tcoord [id, 0] + 1;
break;"Up":[id, 1] = tcoord [id, 1] - 1; break;"Down":[id,
1] = tcoord [id, 1] + 1; break;
}
}
}setCoord (int x1, int y1, int
x2, int y2, int x3, int y3, int x4, int y4)
{[0, 0] = x1;[0, 1] = y1;[1, 0]
= x2;[1, 1] = y2;[2, 0] = x3;[2, 1] = y3;[3, 0] = x4;[3, 1] = y4;
}copy (int [,] m1, int [,] m2)
{(int i = 0; i < 4; i++)
{(int j = 0; j < 2; j++)
{[i, j] = m2 [i, j];
}
}
}checkCoord (int [,] m)
{(int i = 0; i < 4; i++)
{(m [i, 0] < 0 || m [i, 0]
> 9);(m [i, 1] < 0 || m [i, 1] > 18);(MainWindow. table [m [i, 0], m
[i, 1]] == true)
{f = false;(int i_ = 0; i_ <
4; i_++)
{(m [i, 0] == coord [i_, 0]
&& m [i, 1] == coord [i_, 1])= true;
}(! f);
}
};
}rotate_left ()
{(lastShape == 1);(tcoord,
coord);(lastShape)
{2: // палка(state == 1)
{(2, "Down");(2,
"Left");(1, "Down",
);(1, "Right");(0,
"Down",
);(0, "Right",
);(! checkCoord (tcoord));();=
2;(coord, tcoord);
}(state == 2)
{(2, "Up");(2,
"Right");(1, "Up",
);(1, "Left");(0,
"Up",
);(0, "Left",
);(! checkCoord (tcoord));();=
1;(coord, tcoord);
};6: // левая(state == 1)
{(2, "Up");(3,
"Right",
);(3, "Up");(!
checkCoord (tcoord));();= 2;(coord, tcoord);
}(state == 2)
{(2, "Down");(3,
"Left",
);(3, "Down");(!
checkCoord (tcoord));();= 1;(coord, tcoord);
};7: // правая(state == 1)
{(0, "Right");(3,
"Right");(3, "Up",
);(! checkCoord (tcoord));();=
2;(coord, tcoord);
}(state == 2)
{(0, "Left");(3,
"Left");(3, "Down",
);(! checkCoord (tcoord));();=
1;(coord, tcoord);
};3: // _|_(state == 1)
{(1, "Right");(1,
"Up");(2, "Right",
);(2, "Up",
);(! checkCoord (tcoord));();=
2;(coord, tcoord);
}(state == 2)
{(1, "Up");(1,
"Left");(3, "Left",
);(3, "Up",
);(! checkCoord (tcoord));();=
3;(coord, tcoord);
}(state == 3)
{(1, "Left");(1,
"Down");(2, "Down",
);(2, "Left",
);(! checkCoord (tcoord));();=
4;(coord, tcoord);
}(state == 4)
{(1, "Down");(1,
"Right");(3, "Down",
);(3, "Right",
);(! checkCoord (tcoord));();=
1;(coord, tcoord);
};4:(state == 1)
{(2, "Right");(3,
"Left");(0, "Right",
);(0, "Down");(1,
"Right",
);(1, "Down");(!
checkCoord (tcoord));();= 2;(coord, tcoord);
}(state == 2)
{(3, "Up",
);(3, "Right");(2,
"Up",
);(2, "Right");(!
checkCoord (tcoord));();= 3;(coord, tcoord);
}(state == 3)
{(0, "Left",
);(0, "Up", 1);(1,
"Left",
);(1, "Up");(!
checkCoord (tcoord));();= 4;(coord, tcoord);
}(state == 4)
{(3, "Down",
);(2, "Down",
);(2, "Left",
);(! checkCoord (tcoord));();=
1;(coord, tcoord);
};5:(state == 1)
{(2, "Left");(2,
"Up",
);(3, "Left");(3,
"Up",
);(! checkCoord (tcoord));();=
2;(coord, tcoord);
}(state == 2)
{(0, "Down");(0,
"Left",
);(1, "Down");(1,
"Left",
);(! checkCoord (tcoord));();=
3;(coord, tcoord);
}(state == 3)
{(2, "Down",
);(3, "Right",
);(3, "Down",
);(! checkCoord (tcoord));();=
4;(coord, tcoord);
}(state == 4)
{(2, "Right");(3,
"Left");(1, "Up");(1, "Right",
);(0, "Up");(0,
"Right",
);(! checkCoord (tcoord));();=
1;(coord, tcoord);
};
}();. Inv ();
}rotate_right ()
{(lastShape == 1);(tcoord,
coord);(lastShape)
{2:_left ();;6:_left ();;7:_left
();;3: // _|_(state == 1)
{(1, "Left");(1,
"Up");(3, "Left",
);(3, "Up",
);(! checkCoord (tcoord));=
4;();(coord, tcoord);
}(state == 4)
{(1, "Up");(1,
"Right");(2, "Right",
);(2, "Up",
);(! checkCoord (tcoord));=
3;();(coord, tcoord);
}(state == 3)
{(1, "Right");(1,
"Down");(3, "Down",
);(3, "Right",
);(! checkCoord (tcoord));=
2;();(coord, tcoord);
}(state == 2)
{(1, "Down");(1,
"Left");(2, "Down",
);(2, "Left",
);(! checkCoord (tcoord));=
1;();(coord, tcoord);
};4:(state == 1)
{(3, "Up",
);(2, "Right",
);(2, "Up",
);(! checkCoord (tcoord));=
4;();(coord, tcoord);
}(state == 4)
{(0, "Down");(1,
"Down");(0, "Right",
);(1, "Right",
);(! checkCoord (tcoord));=
3;();(coord, tcoord);
}(state == 3)
{(3, "Left");(3,
"Down",
);(2, "Left");(2,
"Down",
);(! checkCoord (tcoord));=
2;();(coord, tcoord);
}(state == 2)
{(0, "Up");(1,
"Up");(0, "Left",
);(1, "Left",
);(2, "Left");(3,
"Right");(! checkCoord (tcoord));= 1;();(coord, tcoord);
};5:(state == 1)
{(2, "Left");(3,
"Right");(1, "Left",
);(1, "Down");(0,
"Left",
);(0, "Down");(!
checkCoord (tcoord));= 4;();(coord, tcoord);
}(state == 4)
{(2, "Up",
);(3, "Up",
);(3, "Left",
);(! checkCoord (tcoord));=
3;();(coord, tcoord);
}(state == 3)
{(0, "Right",
);(0, "Up");(1, "Right",
);(1, "Up");(!
checkCoord (tcoord));= 2;();(coord, tcoord);
}(state == 2)(2,
"Down",
);(2, "Right");(3,
"Down",
);(3, "Right");(!
checkCoord (tcoord));= 1;();(coord, tcoord);;
}();. Inv ();
}remove ()
{x = 0;y = 0;(int i = 0; i <
4; i++)
{= coord [i, 0];= coord [i, 1];.
table [x, y] = false;
}
}clear ()
{(int i = 0; i < 4; i++)
{[i, 0] = coord [i, 1] = 0;
}= count = nextShape = 0;
}toTable ()
{(int i = 0; i < 4; i++).
table [coord [i, 0], coord [i, 1]] = true;
}RandomShape ()
{rand = newRandom ();type = 0;
{= rand. Next (1,7);(type ==
lastShape)
{++;(count < 4);
};
} while (true);type;
}createShape (int type)
{(type)
{1: // квадрат(4, 0, 4, 1, 5, 0, 5, 1); break;2: // палка(5, 0, 5, 1, 5, 2, 5,3); break;3: // _|_(5, 0, 5, 1, 4, 1, 6, 1); break;4:
// |_(4, 0, 4, 1, 4, 2, 5,2); break;5: // _|(5, 0, 5, 1, 5, 2, 4,2); break;6:
// левая(5, 0, 5, 1, 4, 1, 4,2);
break;7: // правая(4, 0, 4, 1, 5, 1, 5,2); break;
}= 1;= type;. Inv ();
}
}
}
КлассBuild - отвечает за игровой процесс игры "стройка".
using System;System.
Collections. Generic;System. Linq;System. Text;System. Threading. Tasks;System.
Windows. Forms;System. Threading;TetrixSystem
{
{Level = 0;Score = 0;mode =
1;Shapes = 0;LinesRemoved = 0;speed = 600;space = false;isPaused = false;thr = null;Start
(int m)
{();= 1;= 0;= 0;= m;= newThread
(newThreadStart (tableProc));. Start ();
}tableProc ()
{. nextShape = Shape.
RandomShape ();(;;)
{. createShape (Shape.
nextShape);. nextShape = Shape. RandomShape ();. MF. nextPaint = true;++;(mode)
{1:(Shapes % 60 == 0)
{++;- = 50;. MF. setLevel
(Level);
};2:(Shapes % 30 == 0)
{++;- = 50;. MF. setLevel
(Level);
};3:(Shapes % 20 == 0)
{++;- = 50;. MF. setLevel
(Level);
};
}
{. Sleep (speed);
} while (MainWindow. Shape_.
down ());= false;(mode)
{1:+= 12;;2:+= 15;;3:+= 18;;
}. MF. setScoreShape (Score,
Shapes);();(int i = 0; i < 4; i++)
{(Shape. y (i) == 0)
{. MF. EndGame ();;
}
}
}
}LineRem ()
{f = true;y = 0;(y = 18; y! = 0;
y--)
{= true;(int x = 0; x < 10;
x++)
}(f == true)
{(int y_ = y; y_! = 0; y_--)
{(int x_ = 0; x_ < 10; x_++)
{. table [x_, y_] = MainWindow.
table [x_, (y_ - 1)];
}
}++;++;+= 100;. MF.
setRemovLines (LinesRemoved);. MF. setScoreShape (Score, Shapes);
}
}
}ClearTable ()
{(int i = 0; i < 10; i++)(int
j = 0; j < 19; j++). table [i, j] = false;
MainWindow. Inv ();
}
}
}
КлассShot - отвечает за пулю выпущенную из
конкретного танка в игре "гоники (танки)".
using System;System.
Collections. Generic;System. Linq;System. Text;System. Threading. Tasks;System.
Windows. Forms;System. Threading;TetrixSystem
{
{time;x = 0,y = 0;tank;
public Shot (Tank t, int t_ =
250)
{= t;= t_;= tank. coord [0, 0];=
tank. coord [0, 1];
}go ()
{(tank. state)
{1: y--; break;2: x--; break;3:
y++; break;4: x++; break;
}(! checkCoords ());temp = tank.
state;(true)
{();(temp)
{1:-;(! checkCoords ());;2:-;(!
checkCoords ());;3:++;(! checkCoords ());;4:++;;
}(! checkCoords ());();. Inv
();. Sleep (time);
}
}toTable ()
{. table [x, y] = true;
}remove ()
{. table [x, y] = false;
}checkCoords ()
{(y < 0)
{++;();. Inv ();;
}(y > 18)
{-;();. Inv ();;
}(x < 0)
{++;();. Inv ();;
}(x > 9)
{-;();. Inv ();;
}(MainWindow. table [x, y] ==
true)
{();. Inv ();();;
};
}DestroyObj ()
{(MainWindow. Tanks_. Tank_.
inMe (x, y))
{. Tanks_. Tank_. wounded ();;
}(MainWindow. Tanks_. Tank_1.
inMe (x, y))
{. Tanks_. Tank_1. wounded ();;
}
}
}
}
КлассTank - отвечает за танк в игре
"гоники (танки)".
using System;System.
Collections. Generic;System. Linq;System. Text;System. Threading. Tasks;System.
Windows. Forms;System. Threading;TetrixSystem
{
{Tank (string p = null, bool
ToTable = false, string n = "player")
{(p! = null)(p);(ToTable)();= n;
}health = 3;score = 0;cheat =
5;name = "";[,] coord = {
{0,0}, // x,y
{0,0},
{0,0},
{0,0}
};[,] tcoord = {
{0,0}, // x,y
{0,0},
{0,0},
{0,0}
};state = 1;speedShots =
0;setCoord (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{[0, 0] = x1;[0, 1] = y1;[1, 0]
= x2;[1, 1] = y2;[2, 0] = x3;[2, 1] = y3;[3, 0] = x4;[3, 1] = y4;
}tmoveCoord (int id, string d,
int c = 1)
{(int i = 0; i < c; i++)
{(d)
{"Left":[id, 0] =
tcoord [id, 0] - 1; break;"Right":[id, 0] = tcoord [id, 0] + 1;
break;"Up":[id, 1] = tcoord [id, 1] - 1; break;"Down":[id,
1] = tcoord [id, 1] + 1; break;
}
}
}checkCoord (int [,] m)
{(int i = 0; i < 4; i++)
{(m [i, 0] < 0 || m [i, 0]
> 9);(m [i, 1] < 0 || m [i, 1] > 18);(MainWindow. table [m [i, 0], m
[i, 1]] == true)
{f = false;(int i_ = 0; i_ <
4; i_++)
{(m [i, 0] == coord [i_, 0]
&& m [i, 1] == coord [i_, 1])= true;
}(! f);
}
};
}remove ()
{x = 0;y = 0;(int i = 0; i <
4; i++)
{= coord [i, 0];= coord [i, 1];.
table [x, y] = false;
}
}createTank (string pose)
{(pose)
{"center":(5, 8, 5, 9,
4, 9, 6,9);;"down":(4, 17, 4, 18, 3, 18, 5, 18);;"up":(6,
1, 6, 0, 7, 0, 5, 0);= 3;;"left":(1, 7, 0, 7, 0, 6, 0,8);=
2;;"right":(8, 9, 9, 9, 9, 10, 9,8);= 4;;
}
}toTable ()
{(int i = 0; i < 4; i++).
table [coord [i, 0], coord [i, 1]] = true;. Inv ();
}copy (int [,] m1, int [,] m2)
{(int i = 0; i < 4; i++)
{(int j = 0; j < 2; j++)
{[i, j] = m2 [i, j];
}
}
}left ()
{(coord [0, 0] == 0 || coord [1,
0] == 0 || coord [2, 0] == 0 || coord [3, 0] == 0);x = 0;y = 0;x1 = 0;y1 = 0;f
= false;(int i = 0; i < 4; i++)
{= coord [i, 0];= coord [i,
1];(MainWindow. table [x - 1, y] == true)
{(int j = 0; j < 4; j++)
{= coord [j, 0];
y1 = coord [j, 1];(x - 1 == x1
&& y == y1)
{= true;;
}
}(! f) return;= false;
}
}();[0, 0] - -;[1, 0] - -;[2, 0]
- -;[3, 0] - -;();. Inv ();
}right ()
{(coord [0, 0] == 9 || coord [1,
0] == 9 || coord [2, 0] == 9 || coord [3, 0] == 9);x = 0;y = 0;x1 = 0;y1 = 0;f
= false;(int i = 0; i < 4; i++)
{= coord [i, 0];= coord [i,
1];(MainWindow. table [x + 1, y] == true)
{(int j = 0; j < 4; j++)
{= coord [j, 0];
y1 = coord [j, 1];(x + 1 == x1
&& y == y1)
{= true;;
}
}(! f) return;= false;
}
}();[0, 0] ++;[1, 0] ++;[2, 0]
++;[3, 0] ++;();. Inv ();
}down ()
{(coord [0, 1] == 18 || coord
[1, 1] == 18 || coord [2, 1] == 18 || coord [3, 1] == 18)
returnfalse;x = 0;y = 0;x1 =
0;y1 = 0;
bool f = false;(int i = 0; i
< 4; i++)
{= coord [i, 0];= coord [i,
1];(MainWindow. table [x, y + 1] == true)
{(int j = 0; j < 4; j++)
{= coord [j, 0];
y1 = coord [j, 1];(x == x1
&& y + 1 == y1)
{= true;;
}
}(! f);= false;
}
}();[0, 1] ++;[1, 1] ++;[2, 1]
++;[3, 1] ++;();. Inv ();;
}up ()
{(coord [0, 1] == 0 || coord [1,
1] == 0 || coord [2, 1] == 0 || coord [3, 1] == 0)
returnfalse;x = 0;y = 0;x1 =
0;y1 = 0;
bool f = false;(int i = 0; i
< 4; i++)
{= coord [i, 0];= coord [i,
1];(MainWindow. table [x, y - 1] == true)
{(int j = 0; j < 4; j++)
{= coord [j, 0];
y1 = coord [j, 1];(x == x1
&& y - 1 == y1)
{= true;;
}
}(! f);= false;
}
}();[0, 1] - -;[1, 1] - -;[2, 1]
- -;[3, 1] - -;();. Inv ();;
}rightRot (string test =
"no test")
{(tcoord, coord);stateBackup =
state;(state == 1)
{(1, "Left");(1,
"Up");(3, "Left",
);(3, "Up",
);(! checkCoord (tcoord));= 4;
}(state == 4)
{(1, "Up");(1,
"Right");(2, "Right",
);(2, "Up",
);(! checkCoord (tcoord));= 3;
}(state == 3)
{(1, "Right");(1,
"Down");(3, "Down",
);(3, "Right",
);(! checkCoord (tcoord));= 2;
}(state == 2)
{(1, "Down");(1,
"Left");(2, "Down",
);(2, "Left",
);(! checkCoord (tcoord));= 1;
}(test == "no test")
{();(coord, tcoord);();. Inv ();
}= stateBackup;;
}leftRot (string test = "no
test")
{(tcoord, coord);stateBackup =
state;(state == 1)
{(1, "Right");(1,
"Up");(2, "Right",
);(2, "Up",
);(! checkCoord (tcoord));= 2;
}(state == 2)
{(1, "Up");(1,
"Left");(3, "Left",
);(3, "Up",
);(! checkCoord (tcoord));= 3;
}(state == 3)
{(1, "Left");(1,
"Down");(2, "Down",
);(2, "Left",
);(! checkCoord (tcoord));= 4;
}(state == 4)
{(1, "Down");(1,
"Right");(3, "Down",
);(3, "Right",
);(! checkCoord (tcoord));= 1;
}(test == "no test")
{();(coord, tcoord);();. Inv ();
}= stateBackup;;
}go ()
{(state)
{1:(); break;2:(); break;3:();
break;4:(); break;
}
}goBack ()
{(! rightRot
("test"))(! leftRot ("test"))(state)
{1: down (); break;2: right ();
break;3: up (); break;4: left (); break;
}
}push ()
{sh = newShot (this);- = 40;thr
= newThread (sh. go);. Start ();
}inMe (int x, int y, bool fl =
false)
{(y == 0 && fl)
{(int i = 0; i < 4; i++)
{(coord [i, 0] == x);
}
}(x == 0 && fl)
{(int i = y + 1; i < 4; i++)
{(coord [i, 1] == y);
}
}(int i = 0; i < 4; i++)
{(coord [i, 0] == x &&
coord [i, 1] == y);
};
}destroy ()
{();. Inv ();
}wounded ()
{-;- = 50;();(health == 0)
{. Tanks_. GameOver (name);
}. MF. updateT ();
}cheatUse (string dir)
{(cheat == 0);-;(cheat >= 0)
{(dir == "l")
{();
}(dir == "r")
{();
}
};- = 200;. MF. updateT ();
}
}
}
КлассTanks - отвечает за игровой процесс игры
"гоники (танки)".
using System;System.
Collections. Generic;System. Linq;System. Text;System. Threading. Tasks;System.
Windows. Forms;System. Threading;TetrixSystem
{
{thr;Tank_;Tank_1;gOver =
false;Start ()
{();= newThread (newThreadStart
(tableProc));. Start ();
}tableProc ()
{_ = newTank ("down",
true);_1 = newTank ("up", true);. Inv ();
}isTable (Tank t)
{(int i = 0; i < 4; i++)
{(MainWindow. table [t. coord
[i, 0], t. coord [i, 1]] == true);
};
}ClearTable ()
{(int i = 0; i < 10; i++)(int
j = 0; j < 19; j++). table [i, j] = false;. Inv ();
}GameOver (string name)
{= true;. MF.gover (name);
}
}
}
КлассMainWindow - отвечает за обработку всех
событий устройств ввода, а так же отображения информации на экран пользователю
текущей информации.
using System;System.
Collections. Generic;System.componentModel;System. Data;System. Drawing;System.
Drawing. Drawing2D;System. Linq;System. Text;System. Threading. Tasks;System.
Collections;System. Windows. Forms;System. IO;System. Threading;TetrixSystem
{: Form
{game = "";fullPaint =
true;nextPaint = false;MF;thrTime;Build_ = newBuild ();Shape_ = newShape
();Tanks_ = null;[,] table = newbool [10, 19];Inv ()
{. PanelPad. Invalidate ();
}EndGame ()
{_build End = newEnd_build ();.
ShowDialog ();
}toRecords (string name)
{. Items. Add (name);. Items [listView1.
Items. Count - 1]. SubItems. Add (Build. Score. ToString ());. Items
[listView1. Items. Count - 1]. SubItems. Add (Build. Level. ToString ());.
Items [listView1. Items. Count - 1]. SubItems. Add (Build. LinesRemoved.
ToString ());. Items [listView1. Items. Count - 1]. SubItems. Add (Build. mode.
ToString ());();();
}saveRecords ()
{tw = newStreamWriter
("records. dat", false);(ListViewItem item inthis. listView1. Items)
{(ListViewItem. ListViewSubItem
subItem in item. SubItems)
{. WriteLine (subItem. Text);
}
}. Close ();
}Sort (int e = 2)
{
// Create an instance of the
ColHeader class.clickedCol = (ColHeader) this. listView1. Columns [e];
// Set the ascending property to
sort in the opposite order.. ascending =! clickedCol. ascending;
// Get the number of items in
the list.numItems = this. listView1. Items. Count;
// Turn off display while data
is repoplulated.. listView1. BeginUpdate ();
// Populate an ArrayList with a
SortWrapper of each list item.SortArray = newArrayList ();(int i = 0; i <
numItems; i++)
{. Add (newSortWrapper (this.
listView1. Items [i], e));
}
// Sort the elements in the
ArrayList using a new instance of the SortComparer
// class. The parameters are the
starting index, the length of the range to sort,
// and the IComparer
implementation to use for comparing elements. Note that
// the IComparer implementation
(SortComparer) requires the sort
// direction for its
constructor; true if ascending, othwise false.. Sort (0, SortArray. Count,
newSortWrapper. SortComparer (clickedCol. ascending));
// Clear the list, and
repopulate with the sorted items.. listView1. Items. Clear ();(int i = 0; i
< numItems; i++). listView1. Items. Add ( ( (SortWrapper) SortArray [i]).
sortItem);
// Turn display back on..
listView1. EndUpdate ();
}setScoreShape (int s, int s_)
{. Text = s. ToString ();. Text
= s_. ToString ();
}setRemovLines (int l)
{. Text = l. ToString ();
}setLevel (int l)
{. Text = l. ToString ();
}MainWindow ()
{();. listView1. Columns. Add
(newColHeader ("Name", 50, HorizontalAlignment. Left, true));.
listView1. Columns. Add (newColHeader ("Score", 46,
HorizontalAlignment. Left, true));. listView1. Columns. Add (newColHeader
("Level", 38, HorizontalAlignment. Left, true));. listView1. Columns.
Add (newColHeader ("Lines", 49, HorizontalAlignment. Left, true));.
listView1. Columns. Add (newColHeader ("Diff", 40,
HorizontalAlignment. Left, true));i = 0;tr = newStreamReader ("records.
dat");(tr. Peek ()! = - 1)
{. Items. Add (tr. ReadLine
());. Items [i]. SubItems. Add (tr. ReadLine ());. Items [i]. SubItems. Add
(tr. ReadLine ());. Items [i]. SubItems. Add (tr. ReadLine ());. Items [i].
SubItems. Add (tr. ReadLine ());++;
}. Close ();
}OnPaint (PaintEventArgs e)
{= true;gObj = Graphics.
FromImage (PanelPad. Image);. SmoothingMode = SmoothingMode. HighSpeed;(debug.
Enabled)
{. Text = "";(int x =
0; x < 19; x++)
{(int y = 0; y < 10; y++)
{(table [y, x] == true). Text +=
"1 ";. Text += "0 ";
}. Text += "\n";
}
}(nextPaint)
{= false;x1 = 0;
int x2 = 0;x3 = 0;x4 = 0;y1 =
0;y2 = 0;y3 = 0;y4 = 0;
Graphics gObj_ = panelNextShape.
CreateGraphics ();_. Clear (SystemColors. Control);(Shape. nextShape)
{1:= 3;= 1; //.= 4;= 1;= 3;= 2;
x4 = 4;= 2;;2:= 2;
y1 = 1; //.= 3;= 1;= 4;= 1;= 5;=
1;;3:= 3;= 1; //.= 3;= 2;= 2;= 2;
x4 = 4;= 2;;4:= 3;
y1 = 0; //.= 3;= 1;= 3;= 2;= 4;=
2;;5:= 3;= 0; //.= 3;= 1;= 3;= 2;
x4 = 2;= 2;;6:= 4;
y1 = 0; //.= 4;= 1;= 3;= 1;= 3;=
2;;7:= 2;= 0; //.= 2;= 1;= 3;= 1;
x4 = 3;= 2;;
}(Shape. nextShape! = 0)
{_. FillRectangle
(newLinearGradientBrush (newRectangle (x1 * 30, y1 * 30, 30, 30), Color.
DarkRed, SystemColors. Control, LinearGradientMode. BackwardDiagonal), x1 * 30,
y1 * 30, 30, 30);_. FillRectangle (newLinearGradientBrush (newRectangle (x2 *
30, y2 * 30, 30, 30), Color. DarkRed, SystemColors. Control,
LinearGradientMode. BackwardDiagonal), x2 * 30, y2 * 30, 30, 30);_.
FillRectangle (newLinearGradientBrush (newRectangle (x3 * 30, y3 * 30, 30, 30),
Color. DarkRed, SystemColors. Control, LinearGradientMode. BackwardDiagonal),
x3 * 30, y3 * 30, 30, 30);_. FillRectangle (newLinearGradientBrush
(newRectangle (x4 * 30, y4 * 30, 30, 30), Color. DarkRed, SystemColors.
Control, LinearGradientMode. BackwardDiagonal), x4 * 30, y4 * 30, 30, 30);
}
}(fullPaint)
{. Clear (Color. LightGray);(int
x = 0; x < 10; x++)
{(int y = 0; y < 19; y++)
{(table [x, y] == true)
{px1 = x * 30;px2 = y * 30;
gObj. FillRectangle
(newLinearGradientBrush (newRectangle (px1, px2, 30, 30), Color. DarkRed,
Color. Gainsboro, LinearGradientMode. BackwardDiagonal), px1, px2, 30, 30);
}
}
}
// fullPaint = false;
}
{x = 0;y = 0;(int i = 0; i <
4; i++)
{= Shape. coord [i, 0];= Shape.
coord [i, 1];(x == 0 && y == 0);. FillRectangle (newLinearGradientBrush
(newRectangle (x * 30, y * 30, 30, 30), Color. DarkRed, Color. Gainsboro,
LinearGradientMode. BackwardDiagonal), x * 30, y * 30, 30, 30);
}
}
}button1_Click (object sender,
EventArgs e)
{
}Form1_KeyDown (object sender,
KeyEventArgs e)
{(e. KeyCode == Keys. Left)
{(game == "Build")_.
left ();_. Tank_. leftRot ();. SuppressKeyPress = true;
}(e. KeyCode == Keys. Right)
{(game == "Build")_.
right ();_. Tank_. rightRot ();. SuppressKeyPress = true;
}(e. KeyCode == Keys. Space)
{(game == "Build")
{. space = true;_. down ();
}
{_. Tank_. push ();
}. SuppressKeyPress = true;
}(e. KeyCode == Keys. Down)
{(game == "Build").
rotate_left ();_. Tank_. goBack ();. SuppressKeyPress = true;
}(e. KeyCode == Keys. Up)
{(game == "Build").
rotate_right ();_. Tank_. go ();. SuppressKeyPress = true;
}(e. KeyCode == Keys. W)
{_. Tank_1. go ();.
SuppressKeyPress = true;
}(e. KeyCode == Keys. A)
{_. Tank_1. leftRot ();.
SuppressKeyPress = true;
}(e. KeyCode == Keys. D)
{_. Tank_1. rightRot ();.
SuppressKeyPress = true;
}(e. KeyCode == Keys. S)
{_. Tank_1. goBack ();.
SuppressKeyPress = true;
}(e. KeyCode == Keys.
ControlKey)
{_. Tank_1. push ();.
SuppressKeyPress = true;
{_. Tank_1. cheatUse
("l");. SuppressKeyPress = true;
}(e. KeyCode == Keys. E)
{_. Tank_1. cheatUse
("r");. SuppressKeyPress = true;
}(e. KeyCode == Keys. End)
{_. Tank_. cheatUse
("r");. SuppressKeyPress = true;
}(e. KeyCode == Keys. ShiftKey)
{_. Tank_. cheatUse
("l");. SuppressKeyPress = true;
}
}Form1_KeyPress (object sender,
KeyPressEventArgs e)
{
}Form1_PreviewKeyDown (object
sender, PreviewKeyDownEventArgs e)
{(e. KeyCode)
{. Left:. Right:. Down:. Space:.
Up:. LShiftKey:. Shift:. ShiftKey:. RShiftKey:. Alt:. ControlKey:. IsInputKey =
true;;
}
}checkBox1_PreviewKeyDown
(object sender, PreviewKeyDownEventArgs e)
{(e. KeyCode)
{. Left:. Right:. Down:. Space:.
Up:. LShiftKey:. Shift:. ShiftKey:. RShiftKey:. Alt:. ControlKey:. IsInputKey =
true;;
}
}checkBox1_CheckedChanged
(object sender, EventArgs e)
{(Pause. Checked)
{_. thr. Suspend ();. isPaused =
true;. Visible = true;. Visible = false;. Enabled = false;
}
{_. thr. Resume ();= true;.
isPaused = false;. Visible = true;. Visible = false;. Enabled = true;
}
}radioButton2_CheckedChanged
(object sender, EventArgs e)
{
}checkBox1_CheckedChanged_1
(object sender, EventArgs e)
{();
}startButton ()
{gObj = PanelPad. CreateGraphics
();(checkBox1. Checked)
{= (MainWindow) Form.
ActiveForm;mode = 0;(radioButton1. Checked)= 1;(radioButton2. Checked)=
2;(radioButton3. Checked)= 3;_. Start (mode);. Text = "Stop";.
Enabled = false;. Text = Build. Score. ToString ();. Text = Build.
LinesRemoved. ToString ();. Text = Build. Level. ToString ();. Text = Build.
Shapes. ToString ();
}
{_. thr. Abort ();. Clear
(Color. LightGray);. Text = "Start";. Enabled = true;
}
}MainWindow_FormClosing (object
sender, FormClosingEventArgs e)
{(game ==
"Build")(Build_. thr! = null)(Build_. thr. ThreadState == System.
Threading. ThreadState. Suspended)
{_. thr. Resume ();_. thr. Abort
();
}_. thr. Abort ();(game ==
"Tanks"&& Tanks_! = null)(Tanks_. thr! = null)(Tanks_. thr.
ThreadState == System. Threading. ThreadState. Suspended)
{_. thr. Resume ();_. thr. Abort
();. Resume ();. Abort ();. Text = "0";
}
{_. thr. Abort ();. Abort ();.
Text = "0";
}
}button1_Click_1 (object sender,
EventArgs e)
{(Build_. thr! = null)(Build_.
thr. ThreadState == System. Threading. ThreadState. Suspended)
{_. thr. Resume ();_. thr. Abort
();
}_. thr. Abort ();=
"Build";. Enabled = true;. Checked = false;. Checked = false;.
Visible = false;. Visible = false;. Visible = false;. Visible = true;
}button2_Click (object sender,
EventArgs e)
{= "Build";. Visible =
false;. Visible = true;. Visible = true;. Enabled = true;. Visible = true;.
Enabled = true;. Text = "0";. Text = "0";. Text =
"0";. Text = "0";
}button4_Click (object sender,
EventArgs e)
{(debug. Enabled). Enabled =
false;. Enabled = true;
}listView1_ColumnClick (object
sender, ColumnClickEventArgs e)
{
// Create an instance of the
ColHeader class.clickedCol = (ColHeader) this. listView1. Columns [e. Column];
// Set the ascending property to
sort in the opposite order.. ascending =! clickedCol. ascending;
// Get the number of items in
the list.numItems = this. listView1. Items. Count;
// Turn off display while data
is repoplulated.. listView1. BeginUpdate ();
// Populate an ArrayList with a
SortWrapper of each list item.SortArray = newArrayList ();(int i = 0; i <
numItems; i++)
{. Add (newSortWrapper (this.
listView1. Items [i], e. Column));
}
// Sort the elements in the
ArrayList using a new instance of the SortComparer
// class. The parameters are the
starting index, the length of the range to sort,
// and the IComparer
implementation to use for comparing elements. Note that
// the IComparer implementation
(SortComparer) requires the sort
// direction for its constructor;
true if ascending, othwise false.. Sort (0, SortArray. Count, newSortWrapper.
SortComparer (clickedCol. ascending));
// Clear the list, and
repopulate with the sorted items.. listView1. Items. Clear ();(int i = 0; i
< numItems; i++). listView1. Items. Add ( ( (SortWrapper) SortArray [i]).
sortItem);
// Turn display back on..
listView1. EndUpdate ();
}MainWindow_Load (object sender,
EventArgs e)
{
}MainWindow_Load_1 (object
sender, EventArgs e)
{
}RightPanel_Paint (object
sender, PaintEventArgs e)
{
}button3_Click (object sender,
EventArgs e)
{= (MainWindow) Form.
ActiveForm;. Visible = true;. Visible = false;. Enabled = true;. Visible =
true;. Visible = true;. Enabled = true;= "Tanks";
}checkBox3_CheckedChanged
(object sender, EventArgs e)
{(checkBox1. Checked)
{_. thr. Resume ();. Resume ();.
Visible = false;. Enabled = true;
}
{_. thr. Suspend ();. Suspend
();. Visible = true;. Enabled = false;
}
}groupBox1_Enter (object sender,
EventArgs e)
{
}richTextBox1_TextChanged
(object sender, EventArgs e)
{
}time ()
{time = 0;(true)
{();. Sleep (1000);++;_. Tank_.
score += 40;_. Tank_1. score += 40;(time % 60 == 0)
{. Text = (time / 60). ToString
() + ": " + "0";
}
{. Text = (time / 60). ToString
() + ": " + (time % 60). ToString ();
}
}
}gOver (string name)
{_. ClearTable ();. Checked =
false;. Show ("Танк " + name + " был убит!", "GameOver", MessageBoxButtons. OK, MessageBoxIcon.
Information);
}updateT ()
{(Tanks_ == null);. Text =
Tanks_. Tank_. health. ToString ();. Text = Tanks_. Tank_1. health. ToString
();. Text = Tanks_. Tank_. cheat. ToString ();. Text = Tanks_. Tank_1. cheat.
ToString ();. Text = Tanks_. Tank_. score. ToString ();. Text = Tanks_. Tank_1.
score. ToString ();();
}button5_Click (object sender,
EventArgs e)
{(Tanks_. thr! = null)(Tanks_.
thr. ThreadState == System. Threading. ThreadState. Suspended)
{_. thr. Resume ();_. thr. Abort
();. Resume ();. Abort ();
}
{_. thr. Abort ();. Abort ();
}= "Tanks";. Enabled =
true;. Checked = false;. Checked = false;. Visible = false;. Enabled = false;.
Visible = false;. Enabled = false;. Visible = false;. Visible = true;
}Pause_PreviewKeyDown (object
sender, PreviewKeyDownEventArgs e)
{(e. KeyCode)
{. Left:. Right:. Down:. Space:.
Up:. LShiftKey:. Shift:. ShiftKey:. RShiftKey:. Alt:. ControlKey:. IsInputKey =
true;;
}
}button1_PreviewKeyDown (object
sender, PreviewKeyDownEventArgs e)
{(e. KeyCode)
{. Left:. Right:. Down:. Space:.
Up:. LShiftKey:. Shift:. ShiftKey:. RShiftKey:. Alt:. ControlKey:. IsInputKey =
true;;
}
}checkBox2_PreviewKeyDown
(object sender, PreviewKeyDownEventArgs e)
{(e. KeyCode)
{. Left:. Right:. Down:. Space:.
Up:. LShiftKey:. Shift:. ShiftKey:. RShiftKey:. Alt:. ControlKey:. IsInputKey =
true;;
}
}checkBox3_PreviewKeyDown (object
sender, PreviewKeyDownEventArgs e)
{(e. KeyCode)
{. Left:. Right:. Down:. Space:.
Up:. LShiftKey:. Shift:. ShiftKey:. RShiftKey:. Alt:. ControlKey:. IsInputKey =
true;;
}
}button5_PreviewKeyDown (object
sender, PreviewKeyDownEventArgs e)
{(e. KeyCode)
{. Left:. Right:. Down:. Space:.
Up:. LShiftKey:. Shift:. ShiftKey:. RShiftKey:. Alt:. ControlKey:. IsInputKey =
true;;
}
}startTanks (object sender,
EventArgs e)
{(Tanks_ == null)
{. Text = "Stop";_ =
newTanks ();_. Start ();= newThread (newThreadStart (time));. Start ();.
Enabled = false;. Enabled = false;_. Tank_1. name = richTextBox2. Text;_.
Tank_. name = richTextBox1. Text;
}
{. Text = "Start";_.
thr. Abort ();_. ClearTable ();_ = null;. Abort ();. Text = "0";.
Enabled = true;. Enabled = true;
}
}
}
{sortItem;sortColumn;
// A SortWrapper requires the
item and the index of the clicked column.SortWrapper (ListViewItem Item, int
iColumn)
{= Item;= iColumn;
}
// Text property for getting the
text of an item.Text
{
{sortItem. SubItems
[sortColumn]. Text;
}
}
// Implementation of the
IComparer
// interface for sorting
ArrayList items.: IComparer
{ascending;
// Constructor requires the sort
order;
// true if ascending, otherwise
descending.SortComparer (bool asc)
{. ascending = asc;
}
// Implemnentation of the
IComparer: Compare
// method for comparing two
objects.
publicint Compare (object x,
object y)
{xItem = (SortWrapper) x;yItem =
(SortWrapper) y;xText = xItem. sortItem. SubItems [xItem. sortColumn].
Text;yText = yItem. sortItem. SubItems [yItem. sortColumn].
Text;xText.compareTo (yText) * (this. ascending? 1: - 1);
}
}
}: ColumnHeader
{ascending;ColHeader (string
text, int width, HorizontalAlignment align, bool asc)
{. Text = text;. Width = width;.
TextAlign = align;. ascending = asc;
}
}
}