Игровая система "Тетрис"

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


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

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

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

Введение

игровой система тетрис алгоритм

C# -- объектно-ориентированный язык программирования. Разработан в 1998--2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft. NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23 270.

C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.

Переняв многое от своих предшественников -- языков C++, Java, Delphi, Модула и Smalltalk -- С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# не поддерживает множественное наследование классов (в отличие от C++).

C# разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает BCL. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем. (Однако эта закономерность была нарушена с выходом C# 3. 0, представляющего собой расширения языка, не опирающиеся на расширения платформы. NET.) CLR предоставляет C#, как и всем другим. NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# точно так же, как это делается для программ на VB. NET, J# и др.

Название «Си шарп» (До диез) происходит от музыкальной нотации, где знак диез, прибавляемый к основному обозначению ноты, означает повышение соответствующего этой ноте звука на полутон. 4] Это аналогично названию языка C++, где «++» обозначает, что переменная должна быть увеличена на 1.

Вследствие технических ограничений на отображение (стандартные шрифты, браузеры и т. д.) и того обстоятельства, что знак диез Ѓт? не представлен на стандартной клавиатуре, знак номера # был выбран для представления знака диез при записи имени языка программирования. 5] Это соглашение отражено в Спецификации Языка C# ECMA-334. 6] Тем не менее, на практике (например, при размещении рекламы и коробочном дизайне[7]), Майкрософт использует предназначенный музыкальный знак.

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

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

1. 1 Условие задачи

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

1. 2 Методы, которыми можно решить задачу

Для решения данной задачи можно: использовать для долговременного хранения данных текстовые или бинарные файлы, для временного хранения элементов в памяти можно использовать один из следующих контейнеров: List, Vector, LinkedList, двумерный массив. Также для отображения элементов можно было использовать несколько ToolBox’ов отображения: Label, TextBox, ListBox, ComboBox, GroupBox, Panel, PictureBox, ListView.

1. 3 Выбранный метод решения задачи

Для работы с данными размещения фигур на игровом поле постоянно нужен индексированный доступ к элементам, поэтому был выбран двумерный массив, который предоставляет прямой и быстрый доступ к нужному элементу, что не могут обеспечить другие элементы хранения данных в оперативной памяти. Для хранения статистики игры был выбран текстовый файл, т.к. скрывать данные нет, также, если бы был выбран бинарный файл — не было бы возможности просмотреть статистику без запуска программы. Для отображения на экране фигур был выбран toolboxPictureBox, т.к. фигуры отображаются в постоянной динамике, нужна высокая производительность отображения, что другие ToolBox’ы позволить не могут. Для отображения статистики на экране был выбран ListView, т.к. он наиболее подходит по структуре для отображения данных такого типа. Отображение текущей статистики было решено сделать в Label’ах. Навигация в программе реализована через Button’ыи CheckBox’ы. Управление фигурами реализовано через клавиши клавиатуры.

2. Структура входных и выходных данных

Файлы для хранения данных:

Таблица. Структура файлаrecords. dat для хранения статистики игры «тетрис»:

Имя игрока

Очки

Уровень

Кол-во линий

Сложность

Nick

Name

2350

4032

5

7

21

34

2

3

ToolBox’ы для графического отображения данных, и взаимодействия с пользователем:

Временный объект — объект типа MainWindow, служит для отображения всех компонет программы в одном окне.

listView1 — экземпляр класса ListView, предоставляет возможность отображать данные в виде таблицы.

groupBox* - ToolBox позволяющий группировать для отображения ToolBox’ов в нем.

MessageBox — класс позволяющий вызывать диалог с предуприждением о некотором событии и реакции пользователя на него.

coords[4, 2] - двумерный массив типа intдля хранения, доступа и изменения координат фигуры.

table[10, 19] - двумерный массивтипа boolдля хранения, доступа и изменения фигур расположенных на игровой доске.

3. Диаграммы классов

Рис.

Рис.

4. Описание классов

Таблица

Экземпляр класса является фигурой на игровой доске

Shape

Экземпляр класса является основным обработчиком алгоритмов тетриса

Build

Экземпляр класса является танком на игровой доске

Tank

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

Shot

Экземпляр класса является основным обработчиком алгоритмов игры «Гонки (танки)»

Tanks

Экземпляр класса является главным GUIокном приложения

MainWindow

5. Блок-схема алгоритма

Блок-схема функции voidLineRem() — функция удаляет заполненные линии в игре «стройка» и опускает «постройку» в низ.

Рис.

Блок-схема функции voidcheckCoord(int[,] m) — функция проверяет не вышли ли координаты фигурыза границы игровой доски.

Рис.

6. Алгоритмы функций

Алгоритм функции voidMainWindow_FormClosing (objectsender, FormClosingEventArgse)-функция закрывает все активные потоки и закрывает программу.

1. Начало.

Входные данные:

sender- системный объект типа objectкоторый вызвал событие.

e — объект типа EventArgs- системные аргументы произошедшего события.

game- объект класса MainWindow типа stringхранящий название запущенной игры.

Buld_ -объект класса MainWindowтипа Buildдля запуска игры «стройка».

Tanks_- объект класса MainWindowтипа Tanks_ для запуска игры «гонки (танки)».

2. if (game == «Build») если текущая игра «стройка» то выполняем пункт 3 иначе переходим к пункту8.

3. if (Build_. thr ≠ null) если поток игры «стройка» запущен то выполняем пункт 4 иначе переходим к пункту 8.

4. if (Build_. thr. ThreadState == System. Threading. ThreadState. Suspended) еслипотокнаходитсявсостоянии «паузы» то выполняем пункты 5−6 иначе переходим к пункту 7.

5. Build_. thr. Resume (); восстанавливаем поток.

6. Build_. thr. Abort (); останавливаем поток полностью.

7. Build_. thr. Abort (); останавливаем поток полностью.

8. if (game == «Tanks» & &Tanks_ ≠ null) если текущая игра «гонки (танки)» и объект класса MainWindowTanks_ инициализирован то выполняем пункт 9 иначе переходим к пункту 19.

9. if (Tanks_. thr ≠ null) если поток игры «гонки (танки)» инициализирован то выполняем 10 пункт иначе переходим к пункту 19.

10. if (Tanks_. thr. ThreadState == System. Threading. ThreadState. Suspended) если поток находится в состоянии «паузы» то выполняем пункты 11 — иначе переходим к пункту 16.

11. Tanks_. thr. Resume (); восстанавливаем поток.

12. Tanks_. thr. Abort (); останавливаем поток полностью.

13. thrTime. Resume (); восстанавливаем поток.

14. thrTime. Abort (); останавливаем поток полностью.

15. label11. Text = «0»; обнуляем таймер.

16. Tanks_. thr. Abort (); останавливаем поток полностью.

17. thrTime. Abort (); останавливаем поток полностью.

18. label11. Text = «0»; обнуляем таймер.

19. Конец.

АлгоритмфункцииvoidStartTanks (objectsender, EventArgse) — функциязапускает или останавливает игру гонки (танки).

1. Начало.

Входные данные:

sender- системный объект типа objectкоторый вызвал событие.

e — объект типа EventArgs- системные аргументы произошедшего события.

Tanks_ -объект класса MainWindowтипа Tanks для запуска игры «гонки (танки)».

thrTime — объект класса MainWindowтипа Threadдля запуска таймера в отдельном потоке.

richTextBox1, richTextBox2 — объекты класса MainWindowтипа RichTextBox содержащие имена игроков.

2. if (Tanks_ == null) если объект игры «гонки (танки)» не инициализирован то выполняем пункты 3−9 иначе переходим к 10 пункту.

3. checkBox2. Text = «Stop»; помечаем кнопку запуска теперь как кнопку остановки.

4. Tanks_ = newTanks (); инициализируем объект Tanks_.

5. Tanks_. Start (); запускаем игру «гонки (танки)».

6. richTextBox1. Enabled = false; закрываем доступ для изменения имени игрока 1.

7. richTextBox2. Enabled = false; закрываем доступ для изменения имени игрока 2.

8. Tanks_. Tank1. name = richTextBox2. Text; приваиваемимятанку 2.

9. Tanks_. Tank_. name = richTextBox1. Text; приваиваемимятанку 1.

10. checkBox2. Text = «Start»; помечаем кнопку остановки теперь как кнопку запуска.

11. Tanks_. thr. Abort (); останавливаем поток в котором выполняется игра «гонки (танки)».

12. Tanks_. ClearTable (); чистим игровую доску.

13. Tanks_ = null; обнуляем объект игры «гонки (танки)».

14. thrTime. Abort (); останавливаем поток в котором выполнялся таймер.

15. label11. Text = «0»; обнуляем таймер

16. richTextBox1. Enabled = true; открываем доступ для изменения имени игрока 1.

17. richTextBox2. Enabled = true; открываем доступ для изменения имени игрока 2.

18. Конец

7. Результат работы программы

Рисунок 7.2 — начало игры в гонки

Рисунок 7.3 — игровой процесс

Рисунок 7.4 — конец игры

Рисунок 7.5 — начало игры в стройку

Рисунок 7.6 — игровой процесс

Рисунок 7.7 — конец игры

Приложение А

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

КлассShape — отвечает за падающую фигуру в игре «стройка».

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System. Threading. Tasks;

using System. Drawing;

using System. Drawing. Drawing2D;

namespace TetrixSystem

{

publicclassShape

{

staticpublicint lastShape = 0;

staticpublicint count = 0;

staticpublicint nextShape = 0;

staticpublicint state = 1;

staticpublicbool d = true;

staticpublicint[,] coord = {

{0,0}, //x, y

{0,0},

{0,0},

{0,0},

};

staticpublicint[,] tcoord = {

{0,0}, //x, y

{0,0},

{0,0},

{0,0},

};

publicvoid left ()

{

if (coord[0, 0] == 0 || coord[1, 0] == 0 || coord[2, 0] == 0 || coord[3, 0] == 0)

return;

int x = 0;

int y = 0;

int x1 = 0;

int y1 = 0;

bool f = false;

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

{

x = coord[i, 0];

y = coord[i, 1];

if (MainWindow. table[x — 1, y] == true)

{

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

{

x1 = coord[j, 0];

y1 = coord[j, 1];

if (x — 1 == x1 & & y == y1)

{

f = true;

break;

}

}

if (!f) return;

f = false;

}

}

remove ();

coord[0, 0]--;

coord[1, 0]--;

coord[2, 0]--;

coord[3, 0]--;

toTable ();

MainWindow. Inv ();

}

publicvoid right ()

{

if (coord[0, 0] == 9 || coord[1, 0] == 9 || coord[2, 0] == 9 || coord[3, 0] == 9)

return;

int x = 0;

int y = 0;

int x1 = 0;

int y1 = 0;

bool f = false;

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

{

x = coord[i, 0];

y = coord[i, 1];

if (MainWindow. table[x + 1, y] == true)

{

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

{

x1 = coord[j, 0];

y1 = coord[j, 1];

if (x + 1 == x1 & & y == y1)

{

f = true;

break;

}

}

if (!f) return;

f = false;

}

}

remove ();

coord[0, 0]++;

coord[1, 0]++;

coord[2, 0]++;

coord[3, 0]++;

toTable ();

MainWindow. Inv ();

}

publicbool down ()

{

if (coord[0, 1] == 18 || coord[1, 1] == 18 || coord[2, 1] == 18 || coord[3, 1] == 18)

returnfalse;

int x = 0;

int y = 0;

int x1 = 0;

int y1 = 0;

bool f = false;

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

{

x = coord[i, 0];

y = coord[i, 1];

if (MainWindow. table[x, y + 1] == true)

{

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

{

x1 = coord[j, 0];

y1 = coord[j, 1];

if (x == x1 & & y + 1 == y1)

{

f = true;

break;

}

}

if (!f)

returnfalse;

f = false;

}

}

remove ();

coord[0, 1]++;

coord[1, 1]++;

coord[2, 1]++;

coord[3, 1]++;

toTable ();

MainWindow. Inv ();

returntrue;

}

staticpublicint x (int index) { return coord[index, 0]; }

staticpublicint y (int index) { return coord[index, 1]; }

staticpublicvoid setX (int index, int x) { coord[index, 0] = x; }

staticpublicvoid setY (int index, int y) { coord[index, 1] = y; }

staticpublicvoid tmoveCoord (int id, string d, int c = 1)

{

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

{

switch (d)

{

case"Left":

tcoord[id, 0] = tcoord[id, 0] - 1; break;

case"Right":

tcoord[id, 0] = tcoord[id, 0] + 1; break;

case"Up":

tcoord[id, 1] = tcoord[id, 1] - 1; break;

case"Down":

tcoord[id, 1] = tcoord[id, 1] + 1; break;

}

}

}

staticpublicvoid setCoord (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)

{

coord[0, 0] = x1;

coord[0, 1] = y1;

coord[1, 0] = x2;

coord[1, 1] = y2;

coord[2, 0] = x3;

coord[2, 1] = y3;

coord[3, 0] = x4;

coord[3, 1] = y4;

}

staticpublicvoid copy (int[,] m1, int[,] m2)

{

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

{

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

{

m1[i, j] = m2[i, j];

}

}

}

staticpublicbool checkCoord (int[,] m)

{

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

{

if (m[i, 0] < 0 || m[i, 0] > 9)

returnfalse;

if (m[i, 1] < 0 || m[i, 1] > 18)

returnfalse;

if (MainWindow. table[m[i, 0], m[i, 1]] == true)

{

bool f = false;

for (int i_ = 0; i_ < 4; i_++)

{

if (m[i, 0] == coord[i_, 0] & & m[i, 1] == coord[i_, 1])

f = true;

}

if (!f)

returnfalse;

}

}

returntrue;

staticpublicvoid rotate_left ()

{

if (lastShape == 1)

return;

copy (tcoord, coord);

switch (lastShape)

{

case 2: // палка

if (state == 1)

{

tmoveCoord (2, «Down»);

tmoveCoord (2, «Left»);

tmoveCoord (1, «Down», 2);

tmoveCoord (1, «Right»);

tmoveCoord (0, «Down», 3);

tmoveCoord (0, «Right», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 2;

copy (coord, tcoord);

}

elseif (state == 2)

{

tmoveCoord (2, «Up»);

tmoveCoord (2, «Right»);

tmoveCoord (1, «Up», 2);

tmoveCoord (1, «Left»);

tmoveCoord (0, «Up», 3);

tmoveCoord (0, «Left», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 1;

copy (coord, tcoord);

}

break;

case 6: //левая

if (state == 1)

{

tmoveCoord (2, «Up»);

tmoveCoord (3, «Right», 2);

tmoveCoord (3, «Up»);

if (!checkCoord (tcoord))

return;

remove ();

state = 2;

copy (coord, tcoord);

}

elseif (state == 2)

{

tmoveCoord (2, «Down»);

tmoveCoord (3, «Left», 2);

tmoveCoord (3, «Down»);

if (!checkCoord (tcoord))

return;

remove ();

state = 1;

copy (coord, tcoord);

}

break;

case 7: //правая

if (state == 1)

{

tmoveCoord (0, «Right»);

tmoveCoord (3, «Right»);

tmoveCoord (3, «Up», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 2;

copy (coord, tcoord);

}

elseif (state == 2)

{

tmoveCoord (0, «Left»);

tmoveCoord (3, «Left»);

tmoveCoord (3, «Down», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 1;

copy (coord, tcoord);

}

break;

case 3: //_|_

if (state == 1)

{

tmoveCoord (1, «Right»);

tmoveCoord (1, «Up»);

tmoveCoord (2, «Right», 2);

tmoveCoord (2, «Up», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 2;

copy (coord, tcoord);

}

elseif (state == 2)

{

tmoveCoord (1, «Up»);

tmoveCoord (1, «Left»);

tmoveCoord (3, «Left», 2);

tmoveCoord (3, «Up», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 3;

copy (coord, tcoord);

}

elseif (state == 3)

{

tmoveCoord (1, «Left»);

tmoveCoord (1, «Down»);

tmoveCoord (2, «Down», 2);

tmoveCoord (2, «Left», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 4;

copy (coord, tcoord);

}

elseif (state == 4)

{

tmoveCoord (1, «Down»);

tmoveCoord (1, «Right»);

tmoveCoord (3, «Down», 2);

tmoveCoord (3, «Right», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 1;

copy (coord, tcoord);

}

break;

case 4:

if (state == 1)

{

tmoveCoord (2, «Right»);

tmoveCoord (3, «Left»);

tmoveCoord (0, «Right», 2);

tmoveCoord (0, «Down»);

tmoveCoord (1, «Right», 2);

tmoveCoord (1, «Down»);

if (!checkCoord (tcoord))

return;

remove ();

state = 2;

copy (coord, tcoord);

}

elseif (state == 2)

{

tmoveCoord (3, «Up», 2);

tmoveCoord (3, «Right»);

tmoveCoord (2, «Up», 2);

tmoveCoord (2, «Right»);

if (!checkCoord (tcoord))

return;

remove ();

state = 3;

copy (coord, tcoord);

}

elseif (state == 3)

{

tmoveCoord (0, «Left», 2);

tmoveCoord (0, «Up», 1);

tmoveCoord (1, «Left», 2);

tmoveCoord (1, «Up»);

if (!checkCoord (tcoord))

return;

remove ();

state = 4;

copy (coord, tcoord);

}

elseif (state == 4)

{

tmoveCoord (3, «Down», 2);

tmoveCoord (2, «Down», 2);

tmoveCoord (2, «Left», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 1;

copy (coord, tcoord);

}

break;

case 5:

if (state == 1)

{

tmoveCoord (2, «Left»);

tmoveCoord (2, «Up», 2);

tmoveCoord (3, «Left»);

tmoveCoord (3, «Up», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 2;

copy (coord, tcoord);

}

elseif (state == 2)

{

tmoveCoord (0, «Down»);

tmoveCoord (0, «Left», 2);

tmoveCoord (1, «Down»);

tmoveCoord (1, «Left», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 3;

copy (coord, tcoord);

}

elseif (state == 3)

{

tmoveCoord (2, «Down», 2);

tmoveCoord (3, «Right», 2);

tmoveCoord (3, «Down», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 4;

copy (coord, tcoord);

}

elseif (state == 4)

{

tmoveCoord (2, «Right»);

tmoveCoord (3, «Left»);

tmoveCoord (1, «Up»);

tmoveCoord (1, «Right», 2);

tmoveCoord (0, «Up»);

tmoveCoord (0, «Right», 2);

if (!checkCoord (tcoord))

return;

remove ();

state = 1;

copy (coord, tcoord);

}

break;

}

toTable ();

MainWindow. Inv ();

}

staticpublicvoid rotate_right ()

{

if (lastShape == 1)

return;

copy (tcoord, coord);

switch (lastShape)

{

case 2:

rotate_left ();

return;

case 6:

rotate_left ();

return;

case 7:

rotate_left ();

return;

case 3: //_|_

if (state == 1)

{

tmoveCoord (1, «Left»);

tmoveCoord (1, «Up»);

tmoveCoord (3, «Left», 2);

tmoveCoord (3, «Up», 2);

if (!checkCoord (tcoord))

return;

state = 4;

remove ();

copy (coord, tcoord);

}

elseif (state == 4)

{

tmoveCoord (1, «Up»);

tmoveCoord (1, «Right»);

tmoveCoord (2, «Right», 2);

tmoveCoord (2, «Up», 2);

if (!checkCoord (tcoord))

return;

state = 3;

remove ();

copy (coord, tcoord);

}

elseif (state == 3)

{

tmoveCoord (1, «Right»);

tmoveCoord (1, «Down»);

tmoveCoord (3, «Down», 2);

tmoveCoord (3, «Right», 2);

if (!checkCoord (tcoord))

return;

state = 2;

remove ();

copy (coord, tcoord);

}

elseif (state == 2)

{

tmoveCoord (1, «Down»);

tmoveCoord (1, «Left»);

tmoveCoord (2, «Down», 2);

tmoveCoord (2, «Left», 2);

if (!checkCoord (tcoord))

return;

state = 1;

remove ();

copy (coord, tcoord);

}

break;

case 4:

if (state == 1)

{

tmoveCoord (3, «Up», 2);

tmoveCoord (2, «Right», 2);

tmoveCoord (2, «Up», 2);

if (!checkCoord (tcoord))

return;

state = 4;

remove ();

copy (coord, tcoord);

}

elseif (state == 4)

{

tmoveCoord (0, «Down»);

tmoveCoord (1, «Down»);

tmoveCoord (0, «Right», 2);

tmoveCoord (1, «Right», 2);

if (!checkCoord (tcoord))

return;

state = 3;

remove ();

copy (coord, tcoord);

}

elseif (state == 3)

{

tmoveCoord (3, «Left»);

tmoveCoord (3, «Down», 2);

tmoveCoord (2, «Left»);

tmoveCoord (2, «Down», 2);

if (!checkCoord (tcoord))

return;

state = 2;

remove ();

copy (coord, tcoord);

}

elseif (state == 2)

{

tmoveCoord (0, «Up»);

tmoveCoord (1, «Up»);

tmoveCoord (0, «Left», 2);

tmoveCoord (1, «Left», 2);

tmoveCoord (2, «Left»);

tmoveCoord (3, «Right»);

if (!checkCoord (tcoord))

return;

state = 1;

remove ();

copy (coord, tcoord);

}

break;

case 5:

if (state == 1)

{

tmoveCoord (2, «Left»);

tmoveCoord (3, «Right»);

tmoveCoord (1, «Left», 2);

tmoveCoord (1, «Down»);

tmoveCoord (0, «Left», 2);

tmoveCoord (0, «Down»);

if (!checkCoord (tcoord))

return;

state = 4;

remove ();

copy (coord, tcoord);

}

elseif (state == 4)

{

tmoveCoord (2, «Up», 2);

tmoveCoord (3, «Up», 2);

tmoveCoord (3, «Left», 2);

if (!checkCoord (tcoord))

return;

state = 3;

remove ();

copy (coord, tcoord);

}

elseif (state == 3)

{

tmoveCoord (0, «Right», 2);

tmoveCoord (0, «Up»);

tmoveCoord (1, «Right», 2);

tmoveCoord (1, «Up»);

if (!checkCoord (tcoord))

return;

state = 2;

remove ();

copy (coord, tcoord);

}

elseif (state == 2)

tmoveCoord (2, «Down», 2);

tmoveCoord (2, «Right»);

tmoveCoord (3, «Down», 2);

tmoveCoord (3, «Right»);

if (!checkCoord (tcoord))

return;

state = 1;

remove ();

copy (coord, tcoord);

break;

}

toTable ();

MainWindow. Inv ();

}

staticprivatevoid remove ()

{

int x = 0;

int y = 0;

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

{

x = coord[i, 0];

y = coord[i, 1];

MainWindow. table[x, y] = false;

}

}

staticpublicvoid clear ()

{

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

{

coord[i, 0] = coord[i, 1] = 0;

}

lastShape = count = nextShape = 0;

}

staticpublicvoid toTable ()

{

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

MainWindow. table[coord[i, 0], coord[i, 1]] = true;

}

staticpublicint RandomShape ()

{

Random rand = newRandom ();

int type = 0;

do

{

type = rand. Next (1, 7);

if (type == lastShape)

{

count++;

if (count < 4)

break;

}

else

break;

} while (true);

return type;

}

staticpublicvoid createShape (int type)

{

switch (type)

case 1: //квадрат

setCoord (4, 0, 4, 1, 5, 0, 5, 1); break;

case 2: //палка

setCoord (5, 0, 5, 1, 5, 2, 5, 3); break;

case 3: //_

state = 1;

lastShape = type;

MainWindow. Inv ();

}

}

}

КлассBuild — отвечает за игровой процесс игры «стройка».

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System. Threading. Tasks;

using System. Windows. Forms;

using System. Threading;

namespace TetrixSystem

{

publicclassBuild

{

publicstaticint Level = 0;

publicstaticint Score = 0;

publicstaticint mode = 1;

publicstaticint Shapes = 0;

publicstaticint LinesRemoved = 0;

publicint speed = 600;

publicstaticbool space = false;

publicstaticbool isPaused = false;

publicThread thr = null;

publicvoid Start (int m)

{

ClearTable ();

Level = 1;

Score = 0;

Shapes = 0;

mode = m;

thr = newThread (newThreadStart (tableProc));

thr. Start ();

}

publicvoid tableProc ()

{

Shape. nextShape = Shape. RandomShape ();

for (;;)

{

Shape. createShape (Shape. nextShape);

Shape. nextShape = Shape. RandomShape ();

MainWindow. MF. nextPaint = true;

Shapes++;

switch (mode)

{

case 1:

if (Shapes % 60 == 0)

{

Level++;

speed -= 50;

MainWindow. MF. setLevel (Level);

}

break;

case 2:

if (Shapes % 30 == 0)

{

Level++;

speed -= 50;

MainWindow. MF. setLevel (Level);

}

break;

case 3:

if (Shapes % 20 == 0)

{

Level++;

speed -= 50;

MainWindow. MF. setLevel (Level);

}

break;

}

do

{

Thread. Sleep (speed);

} while (MainWindow. Shape_. down ());

space = false;

switch (mode)

{

case 1:

Score += 12;

break;

case 2:

Score += 15;

break;

case 3:

Score += 18;

break;

}

MainWindow. MF. setScoreShape (Score, Shapes);

LineRem ();

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

{

if (Shape. y (i) == 0)

{

MainWindow. MF. EndGame ();

return;

}

}

}

}

staticpublicvoid LineRem ()

{

bool f = true;

int y = 0;

for (y = 18; y ≠ 0; y--)

{

f = true;

for (int x = 0; x < 10; x++)

{

if (MainWindow. table[x, y] ≠ true)

f = false;

}

if (f == true)

{

for (int y_ = y; y_ ≠ 0; y_--)

{

for (int x_ = 0; x_ < 10; x_++)

{

MainWindow. table[x_, y_] = MainWindow. table[x_, (y_ - 1)];

}

}

y++;

LinesRemoved++;

Score += 100;

MainWindow. MF. setRemovLines (LinesRemoved);

MainWindow. MF. setScoreShape (Score, Shapes);

}

}

}

staticpublicvoid ClearTable ()

{

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

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

MainWindow. table[i, j] = false;

MainWindow. Inv ();

}

}

}

КлассShot — отвечает за пулю выпущенную из конкретного танка в игре «гоники (танки)».

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System. Threading. Tasks;

using System. Windows. Forms;

using System. Threading;

namespace TetrixSystem

{

publicclassShot

{

publicint time;

publicint x = 0,

y = 0;

Tank tank;

public Shot (Tank t, int t_ = 250)

{

tank = t;

time = t_;

x = tank. coord[0, 0];

y = tank. coord[0, 1];

}

publicvoid go ()

{

switch (tank. state)

{

case 1: y--; break;

case 2: x--; break;

case 3: y++; break;

case 4: x++; break;

}

if (!checkCoords ())

return;

int temp = tank. state;

while (true)

{

remove ();

switch (temp)

{

case 1:

y--;

if (!checkCoords ())

return;

break;

case 2:

x--;

if (!checkCoords ())

return;

break;

case 3:

y++;

if (!checkCoords ())

return;

break;

case 4:

x++;

break;

}

if (!checkCoords ())

return;

toTable ();

MainWindow. Inv ();

Thread. Sleep (time);

}

}

publicvoid toTable ()

{

MainWindow. table[x, y] = true;

}

publicvoid remove ()

{

MainWindow. table[x, y] = false;

}

publicbool checkCoords ()

{

if (y < 0)

{

y++;

remove ();

MainWindow. Inv ();

returnfalse;

}

elseif (y > 18)

{

y--;

remove ();

MainWindow. Inv ();

returnfalse;

}

elseif (x < 0)

{

x++;

remove ();

MainWindow. Inv ();

returnfalse;

}

elseif (x > 9)

{

x--;

remove ();

MainWindow. Inv ();

returnfalse;

}

if (MainWindow. table[x, y] == true)

{

remove ();

MainWindow. Inv ();

DestroyObj ();

returnfalse;

}

returntrue;

}

publicvoid DestroyObj ()

{

if (MainWindow. Tanks_. Tank_. inMe (x, y))

{

MainWindow. Tanks_. Tank_. wounded ();

return;

}

elseif (MainWindow. Tanks_. Tank1. inMe (x, y))

{

MainWindow. Tanks_. Tank1. wounded ();

return;

}

}

}

}

КлассTank — отвечает за танк в игре «гоники (танки)».

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System. Threading. Tasks;

using System. Windows. Forms;

using System. Threading;

namespace TetrixSystem

{

publicclassTank

{

public Tank (string p = null, bool ToTable = false, string n = «player»)

{

if (p ≠ null)

createTank (p);

if (ToTable)

toTable ();

name = n;

}

publicint health = 3;

publicint score = 0;

publicint cheat = 5;

publicstring name = ««;

publicint[,] coord = {

{0,0}, //x, y

{0,0},

{0,0},

{0,0}

};

publicint[,] tcoord = {

{0,0}, //x, y

{0,0},

{0,0},

{0,0}

};

publicint state = 1;

publicint speedShots = 0;

publicvoid setCoord (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)

{

coord[0, 0] = x1;

coord[0, 1] = y1;

coord[1, 0] = x2;

coord[1, 1] = y2;

coord[2, 0] = x3;

coord[2, 1] = y3;

coord[3, 0] = x4;

coord[3, 1] = y4;

}

publicvoid tmoveCoord (int id, string d, int c = 1)

{

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

{

switch (d)

{

case"Left":

tcoord[id, 0] = tcoord[id, 0] - 1; break;

case"Right":

tcoord[id, 0] = tcoord[id, 0] + 1; break;

case"Up":

tcoord[id, 1] = tcoord[id, 1] - 1; break;

case"Down":

tcoord[id, 1] = tcoord[id, 1] + 1; break;

}

}

}

publicbool checkCoord (int[,] m)

{

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

{

if (m[i, 0] < 0 || m[i, 0] > 9)

returnfalse;

if (m[i, 1] < 0 || m[i, 1] > 18)

returnfalse;

if (MainWindow. table[m[i, 0], m[i, 1]] == true)

{

bool f = false;

for (int i_ = 0; i_ < 4; i_++)

{

if (m[i, 0] == coord[i_, 0] & & m[i, 1] == coord[i_, 1])

f = true;

}

if (!f)

returnfalse;

}

}

returntrue;

}

privatevoid remove ()

{

int x = 0;

int y = 0;

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

{

x = coord[i, 0];

y = coord[i, 1];

MainWindow. table[x, y] = false;

}

}

publicvoid createTank (string pose)

{

switch (pose)

{

case"center":

setCoord (5, 8, 5, 9, 4, 9, 6, 9);

break;

case"down":

setCoord (4, 17, 4, 18, 3, 18, 5, 18);

break;

case"up":

setCoord (6, 1, 6, 0, 7, 0, 5, 0);

state = 3;

break;

case"left":

setCoord (1, 7, 0, 7, 0, 6, 0, 8);

state = 2;

break;

case"right":

setCoord (8, 9, 9, 9, 9, 10, 9, 8);

state = 4;

break;

}

}

publicvoid toTable ()

{

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

MainWindow. table[coord[i, 0], coord[i, 1]] = true;

MainWindow. Inv ();

}

publicvoid copy (int[,] m1, int[,] m2)

{

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

{

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

{

m1[i, j] = m2[i, j];

}

}

}

publicvoid left ()

{

if (coord[0, 0] == 0 || coord[1, 0] == 0 || coord[2, 0] == 0 || coord[3, 0] == 0)

return;

int x = 0;

int y = 0;

int x1 = 0;

int y1 = 0;

bool f = false;

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

{

x = coord[i, 0];

y = coord[i, 1];

if (MainWindow. table[x — 1, y] == true)

{

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

{

x1 = coord[j, 0];

y1 = coord[j, 1];

if (x — 1 == x1 & & y == y1)

{

f = true;

break;

}

}

if (!f) return;

f = false;

}

}

remove ();

coord[0, 0]--;

coord[1, 0]--;

coord[2, 0]--;

coord[3, 0]--;

toTable ();

MainWindow. Inv ();

}

publicvoid right ()

{

if (coord[0, 0] == 9 || coord[1, 0] == 9 || coord[2, 0] == 9 || coord[3, 0] == 9)

return;

int x = 0;

int y = 0;

int x1 = 0;

int y1 = 0;

bool f = false;

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

{

x = coord[i, 0];

y = coord[i, 1];

if (MainWindow. table[x + 1, y] == true)

{

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

{

x1 = coord[j, 0];

y1 = coord[j, 1];

if (x + 1 == x1 & & y == y1)

{

f = true;

break;

}

}

if (!f) return;

f = false;

}

}

remove ();

coord[0, 0]++;

coord[1, 0]++;

coord[2, 0]++;

coord[3, 0]++;

toTable ();

MainWindow. Inv ();

}

publicbool down ()

{

if (coord[0, 1] == 18 || coord[1, 1] == 18 || coord[2, 1] == 18 || coord[3, 1] == 18)

returnfalse;

int x = 0;

int y = 0;

int x1 = 0;

int y1 = 0;

bool f = false;

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

{

x = coord[i, 0];

y = coord[i, 1];

if (MainWindow. table[x, y + 1] == true)

{

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

{

x1 = coord[j, 0];

y1 = coord[j, 1];

if (x == x1 & & y + 1 == y1)

{

f = true;

break;

}

}

if (!f)

returnfalse;

f = false;

}

}

remove ();

coord[0, 1]++;

coord[1, 1]++;

coord[2, 1]++;

coord[3, 1]++;

toTable ();

MainWindow. Inv ();

returntrue;

}

publicbool up ()

{

if (coord[0, 1] == 0 || coord[1, 1] == 0 || coord[2, 1] == 0 || coord[3, 1] == 0)

returnfalse;

int x = 0;

int y = 0;

int x1 = 0;

int y1 = 0;

bool f = false;

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

{

x = coord[i, 0];

y = coord[i, 1];

if (MainWindow. table[x, y — 1] == true)

{

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

{

x1 = coord[j, 0];

y1 = coord[j, 1];

if (x == x1 & & y — 1 == y1)

{

f = true;

break;

}

}

if (!f)

returnfalse;

f = false;

}

}

remove ();

coord[0, 1]--;

coord[1, 1]--;

coord[2, 1]--;

coord[3, 1]--;

toTable ();

MainWindow. Inv ();

returntrue;

}

publicbool rightRot (string test = «no test»)

{

copy (tcoord, coord);

int stateBackup = state;

if (state == 1)

{

tmoveCoord (1, «Left»);

tmoveCoord (1, «Up»);

tmoveCoord (3, «Left», 2);

tmoveCoord (3, «Up», 2);

if (!checkCoord (tcoord))

returnfalse;

state = 4;

}

elseif (state == 4)

{

tmoveCoord (1, «Up»);

tmoveCoord (1, «Right»);

tmoveCoord (2, «Right», 2);

tmoveCoord (2, «Up», 2);

if (!checkCoord (tcoord))

returnfalse;

state = 3;

}

elseif (state == 3)

{

tmoveCoord (1, «Right»);

tmoveCoord (1, «Down»);

tmoveCoord (3, «Down», 2);

tmoveCoord (3, «Right», 2);

if (!checkCoord (tcoord))

returnfalse;

state = 2;

}

elseif (state == 2)

{

tmoveCoord (1, «Down»);

tmoveCoord (1, «Left»);

tmoveCoord (2, «Down», 2);

tmoveCoord (2, «Left», 2);

if (!checkCoord (tcoord))

returnfalse;

state = 1;

}

if (test == «no test»)

{

remove ();

copy (coord, tcoord);

toTable ();

MainWindow. Inv ();

}

else

state = stateBackup;

returntrue;

}

publicbool leftRot (string test = «no test»)

{

copy (tcoord, coord);

int stateBackup = state;

if (state == 1)

{

tmoveCoord (1, «Right»);

tmoveCoord (1, «Up»);

tmoveCoord (2, «Right», 2);

tmoveCoord (2, «Up», 2);

if (!checkCoord (tcoord))

returnfalse;

state = 2;

}

elseif (state == 2)

{

tmoveCoord (1, «Up»);

tmoveCoord (1, «Left»);

tmoveCoord (3, «Left», 2);

tmoveCoord (3, «Up», 2);

if (!checkCoord (tcoord))

returnfalse;

state = 3;

}

elseif (state == 3)

{

tmoveCoord (1, «Left»);

tmoveCoord (1, «Down»);

tmoveCoord (2, «Down», 2);

tmoveCoord (2, «Left», 2);

if (!checkCoord (tcoord))

returnfalse;

state = 4;

}

elseif (state == 4)

{

tmoveCoord (1, «Down»);

tmoveCoord (1, «Right»);

tmoveCoord (3, «Down», 2);

tmoveCoord (3, «Right», 2);

if (!checkCoord (tcoord))

returnfalse;

state = 1;

}

if (test == «no test»)

{

remove ();

copy (coord, tcoord);

toTable ();

MainWindow. Inv ();

}

else

state = stateBackup;

returntrue;

}

publicvoid go ()

{

switch (state)

{

case 1:

up (); break;

case 2:

left (); break;

case 3:

down (); break;

case 4:

right (); break;

}

}

publicvoid goBack ()

{

if (!rightRot («test»))

if (!leftRot («test»))

switch (state)

{

case 1: down (); break;

case 2: right (); break;

case 3: up (); break;

case 4: left (); break;

}

}

publicvoid push ()

{

Shot sh = newShot (this);

score -= 40;

Thread thr = newThread (sh. go);

thr. Start ();

}

publicbool inMe (int x, int y, bool fl = false)

{

if (y == 0 & & fl)

{

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

{

if (coord[i, 0] == x)

returntrue;

}

}

elseif (x == 0 & & fl)

{

for (int i = y + 1; i < 4; i++)

{

if (coord[i, 1] == y)

returntrue;

}

}

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

{

if (coord[i, 0] == x & & coord[i, 1] == y)

returntrue;

}

returnfalse;

}

publicvoid destroy ()

{

remove ();

MainWindow. Inv ();

}

publicvoid wounded ()

{

health--;

score -= 50;

toTable ();

if (health == 0)

{

MainWindow. Tanks_. GameOver (name);

}

MainWindow. MF. updateT ();

}

publicvoid cheatUse (string dir)

{

if (cheat == 0)

return;

cheat--;

if (cheat >= 0)

{

if (dir == «l»)

{

left ();

}

elseif (dir == «r»)

{

right ();

}

}

else

return;

score -= 200;

MainWindow. MF. updateT ();

}

}

}

КлассTanks — отвечает за игровой процесс игры «гоники (танки)».

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System. Threading. Tasks;

using System. Windows. Forms;

using System. Threading;

namespace TetrixSystem

{

publicclassTanks

{

publicThread thr;

publicTank Tank_;

publicTank Tank1;

publicbool gOver = false;

publicvoid Start ()

{

ClearTable ();

thr = newThread (newThreadStart (tableProc));

thr. Start ();

}

publicvoid tableProc ()

{

Tank_ = newTank («down», true);

Tank1 = newTank («up», true);

MainWindow. Inv ();

}

publicbool isTable (Tank t)

{

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

{

if (MainWindow. table[t. coord[i, 0], t. coord[i, 1]] == true)

returntrue;

}

returnfalse;

}

publicvoid ClearTable ()

{

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

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

MainWindow. table[i, j] = false;

MainWindow. Inv ();

}

publicvoid GameOver (string name)

{

gOver = true;

MainWindow. MF. gOver (name);

}

}

}

КлассMainWindow — отвечает за обработку всех событий устройств ввода, а так же отображения информации на экран пользователю текущей информации.

using System;

using System. Collections. Generic;

using System. ComponentModel;

using System. Data;

using System. Drawing;

using System. Drawing. Drawing2D;

using System. Linq;

using System. Text;

using System. Threading. Tasks;

using System. Collections;

using System. Windows. Forms;

using System. IO;

using System. Threading;

namespace TetrixSystem

{

publicpartialclassMainWindow: Form

{

staticpublicstring game = ««;

publicbool fullPaint = true;

publicbool nextPaint = false;

staticpublicMainWindow MF;

publicThread thrTime;

staticpublicBuild Build_ = newBuild ();

staticpublicShape Shape_ = newShape ();

staticpublicTanks Tanks_ = null;

staticpublicbool[,] table = newbool[10, 19];

publicstaticvoid Inv ()

{

MF. PanelPad. Invalidate ();

}

publicvoid EndGame ()

{

End_build End = newEnd_build ();

End. ShowDialog ();

}

publicvoid toRecords (string name)

{

listView1. Items. Add (name);

listView1. Items[listView1. Items. Count — 1]. SubItems. Add (Build. Score. ToString ());

listView1. Items[listView1. Items. Count — 1]. SubItems. Add (Build. Level. ToString ());

listView1. Items[listView1. Items. Count — 1]. SubItems. Add (Build. LinesRemoved. ToString ());

listView1. Items[listView1. Items. Count — 1]. SubItems. Add (Build. mode. ToString ());

Sort ();

saveRecords ();

}

publicvoid saveRecords ()

{

TextWriter tw = newStreamWriter («records. dat», false);

foreach (ListViewItem item inthis. listView1. Items)

{

foreach (ListViewItem. ListViewSubItem subItem in item. SubItems)

{

tw. WriteLine (subItem. Text);

}

}

tw. Close ();

}

publicvoid Sort (int e = 2)

{

// Create an instance of the ColHeader class.

ColHeader clickedCol = (ColHeader)this. listView1. Columns[e];

// Set the ascending property to sort in the opposite order.

clickedCol. ascending = !clickedCol. ascending;

// Get the number of items in the list.

int numItems = this. listView1. Items. Count;

// Turn off display while data is repoplulated.

this. listView1. BeginUpdate ();

// Populate an ArrayList with a SortWrapper of each list item.

ArrayList SortArray = newArrayList ();

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

{

SortArray. 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.

SortArray. Sort (0, SortArray. Count, newSortWrapper. SortComparer (clickedCol. ascending));

// Clear the list, and repopulate with the sorted items.

this. listView1. Items. Clear ();

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

this. listView1. Items. Add (((SortWrapper)SortArray[i]). sortItem);

// Turn display back on.

this. listView1. EndUpdate ();

}

publicvoid setScoreShape (int s, int s_)

{

label1. Text = s. ToString ();

label4. Text = s_. ToString ();

}

publicvoid setRemovLines (int l)

{

label2. Text = l. ToString ();

}

publicvoid setLevel (int l)

{

label3. Text = l. ToString ();

}

public MainWindow ()

{

InitializeComponent ();

this. listView1. Columns. Add (newColHeader («Name», 50, HorizontalAlignment. Left, true));

this. listView1. Columns. Add (newColHeader («Score», 46, HorizontalAlignment. Left, true));

this. listView1. Columns. Add (newColHeader («Level», 38, HorizontalAlignment. Left, true));

this. listView1. Columns. Add (newColHeader («Lines», 49, HorizontalAlignment. Left, true));

this. listView1. Columns. Add (newColHeader («Diff», 40, HorizontalAlignment. Left, true));

int i = 0;

TextReader tr = newStreamReader («records. dat»);

while (tr. Peek () ≠ -1)

{

listView1. Items. Add (tr. ReadLine ());

listView1. Items[i]. SubItems. Add (tr. ReadLine ());

listView1. Items[i]. SubItems. Add (tr. ReadLine ());

listView1. Items[i]. SubItems. Add (tr. ReadLine ());

listView1. Items[i]. SubItems. Add (tr. ReadLine ());

i++;

}

tr. Close ();

}

protectedoverridevoid OnPaint (PaintEventArgs e)

{

fullPaint = true;

Graphics gObj = Graphics. FromImage (PanelPad. Image);

gObj. SmoothingMode = SmoothingMode. HighSpeed;

if (debug. Enabled)

{

debug. Text = ««;

for (int x = 0; x < 19; x++)

{

for (int y = 0; y < 10; y++)

{

if (table[y, x] == true)

debug. Text += «1 «;

else

debug. Text += «0 «;

}

debug. Text += «n»;

}

}

if (nextPaint)

{

nextPaint = false;

int x1 = 0;

int x2 = 0;

int x3 = 0;

int x4 = 0;

int y1 = 0;

int y2 = 0;

int y3 = 0;

int y4 = 0;

Graphics gObj_ = panelNextShape. CreateGraphics ();

gObj_. Clear (SystemColors. Control);

switch (Shape. nextShape)

{

case 1:

x1 = 3;

y1 = 1; //.

x2 = 4;

y2 = 1;

x3 = 3;

y3 = 2;

x4 = 4;

y4 = 2;

break;

case 2:

x1 = 2;

y1 = 1; //.

x2 = 3;

y2 = 1;

x3 = 4;

y3 = 1;

x4 = 5;

y4 = 1;

break;

case 3:

x1 = 3;

y1 = 1; //.

x2 = 3;

y2 = 2;

x3 = 2;

y3 = 2;

x4 = 4;

y4 = 2;

break;

case 4:

x1 = 3;

y1 = 0; //.

x2 = 3;

y2 = 1;

x3 = 3;

y3 = 2;

x4 = 4;

y4 = 2;

break;

case 5:

x1 = 3;

y1 = 0; //.

x2 = 3;

y2 = 1;

x3 = 3;

y3 = 2;

x4 = 2;

y4 = 2;

break;

case 6:

x1 = 4;

y1 = 0; //.

x2 = 4;

y2 = 1;

x3 = 3;

y3 = 1;

x4 = 3;

y4 = 2;

break;

case 7:

x1 = 2;

y1 = 0; //.

x2 = 2;

y2 = 1;

x3 = 3;

y3 = 1;

x4 = 3;

y4 = 2;

break;

}

if (Shape. nextShape ≠ 0)

{

gObj_. FillRectangle (newLinearGradientBrush (newRectangle (x1 * 30, y1 * 30, 30, 30), Color. DarkRed, SystemColors. Control, LinearGradientMode. BackwardDiagonal), x1 * 30, y1 * 30, 30, 30);

gObj_. FillRectangle (newLinearGradientBrush (newRectangle (x2 * 30, y2 * 30, 30, 30), Color. DarkRed, SystemColors. Control, LinearGradientMode. BackwardDiagonal), x2 * 30, y2 * 30, 30, 30);

gObj_. FillRectangle (newLinearGradientBrush (newRectangle (x3 * 30, y3 * 30, 30, 30), Color. DarkRed, SystemColors. Control, LinearGradientMode. BackwardDiagonal), x3 * 30, y3 * 30, 30, 30);

gObj_. FillRectangle (newLinearGradientBrush (newRectangle (x4 * 30, y4 * 30, 30, 30), Color. DarkRed, SystemColors. Control, LinearGradientMode. BackwardDiagonal), x4 * 30, y4 * 30, 30, 30);

}

}

if (fullPaint)

{

gObj. Clear (Color. LightGray);

for (int x = 0; x < 10; x++)

{

for (int y = 0; y < 19; y++)

{

if (table[x, y] == true)

{

int px1 = x * 30;

int px2 = y * 30;

gObj. FillRectangle (newLinearGradientBrush (newRectangle (px1, px2, 30, 30), Color. DarkRed, Color. Gainsboro, LinearGradientMode. BackwardDiagonal), px1, px2, 30, 30);

}

}

}

//fullPaint = false;

}

else

{

int x = 0;

int y = 0;

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

{

x = Shape. coord[i, 0];

y = Shape. coord[i, 1];

if (x == 0 & & y == 0)

continue;

gObj. FillRectangle (newLinearGradientBrush (newRectangle (x * 30, y * 30, 30, 30), Color. DarkRed, Color. Gainsboro, LinearGradientMode. BackwardDiagonal), x * 30, y * 30, 30, 30);

}

}

}

privatevoid button1_Click (object sender, EventArgs e)

{

}

privatevoid Form1_KeyDown (object sender, KeyEventArgs e)

{

if (e. KeyCode == Keys. Left)

{

if (game == «Build»)

Shape_. left ();

else

Tanks_. Tank_. leftRot ();

e. SuppressKeyPress = true;

}

if (e. KeyCode == Keys. Right)

{

if (game == «Build»)

Shape_. right ();

else

Tanks_. Tank_. rightRot ();

e. SuppressKeyPress = true;

}

if (e. KeyCode == Keys. Space)

{

if (game == «Build»)

{

Build. space = true;

Shape_. down ();

}

else

{

Tanks_. Tank_. push ();

}

e. SuppressKeyPress = true;

}

if (e. KeyCode == Keys. Down)

{

if (game == «Build»)

Shape. rotate_left ();

else

Tanks_. Tank_. goBack ();

e. SuppressKeyPress = true;

}

if (e. KeyCode == Keys. Up)

{

if (game == «Build»)

Shape. rotate_right ();

else

Tanks_. Tank_. go ();

e. SuppressKeyPress = true;

}

if (e. KeyCode == Keys. W)

{

Tanks_. Tank1. go ();

e. SuppressKeyPress = true;

}

elseif (e. KeyCode == Keys. A)

{

Tanks_. Tank1. leftRot ();

e. SuppressKeyPress = true;

}

elseif (e. KeyCode == Keys. D)

{

Tanks_. Tank1. rightRot ();

e. SuppressKeyPress = true;

}

elseif (e. KeyCode == Keys. S)

{

Tanks_. Tank1. goBack ();

e. SuppressKeyPress = true;

}

elseif (e. KeyCode == Keys. ControlKey)

{

Tanks_. Tank1. push ();

e. SuppressKeyPress = true;

}

if (e. KeyCode == Keys. Q)

{

Tanks_. Tank1. cheatUse («l»);

e. SuppressKeyPress = true;

}

elseif (e. KeyCode == Keys. E)

{

Tanks_. Tank1. cheatUse («r»);

e. SuppressKeyPress = true;

}

if (e. KeyCode == Keys. End)

{

Tanks_. Tank_. cheatUse («r»);

e. SuppressKeyPress = true;

}

elseif (e. KeyCode == Keys. ShiftKey)

{

Tanks_. Tank_. cheatUse («l»);

e. SuppressKeyPress = true;

}

}

privatevoid Form1_KeyPress (object sender, KeyPressEventArgs e)

{

}

privatevoid Form1_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)

{

switch (e. KeyCode)

{

caseKeys. Left:

caseKeys. Right:

caseKeys. Down:

caseKeys. Space:

caseKeys. Up:

caseKeys. LShiftKey:

caseKeys. Shift:

caseKeys. ShiftKey:

caseKeys. RShiftKey:

caseKeys. Alt:

caseKeys. ControlKey:

e. IsInputKey = true;

break;

}

}

privatevoid checkBox1_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)

{

switch (e. KeyCode)

{

caseKeys. Left:

caseKeys. Right:

caseKeys. Down:

caseKeys. Space:

caseKeys. Up:

caseKeys. LShiftKey:

caseKeys. Shift:

caseKeys. ShiftKey:

caseKeys. RShiftKey:

caseKeys. Alt:

caseKeys. ControlKey:

e. IsInputKey = true;

break;

}

}

privatevoid checkBox1_CheckedChanged (object sender, EventArgs e)

{

if (Pause. Checked)

{

Build_. thr. Suspend ();

Build. isPaused = true;

label5. Visible = true;

PanelPad. Visible = false;

checkBox1. Enabled = false;

}

else

{

Build_. thr. Resume ();

fullPaint = true;

Build. isPaused = false;

PanelPad. Visible = true;

label5. Visible = false;

checkBox1. Enabled = true;

}

}

privatevoid radioButton2_CheckedChanged (object sender, EventArgs e)

{

}

privatevoid checkBox1_CheckedChanged1(object sender, EventArgs e)

{

startButton ();

}

privatevoid startButton ()

{

Graphics gObj = PanelPad. CreateGraphics ();

if (checkBox1. Checked)

{

MF = (MainWindow)Form. ActiveForm;

int mode = 0;

if (radioButton1. Checked)

mode = 1;

if (radioButton2. Checked)

mode = 2;

if (radioButton3. Checked)

mode = 3;

Build_. Start (mode);

checkBox1. Text = «Stop»;

groupBox7. Enabled = false;

label1. Text = Build. Score. ToString ();

label2. Text = Build. LinesRemoved. ToString ();

label3. Text = Build. Level. ToString ();

label4. Text = Build. Shapes. ToString ();

}

else

{

Build_. thr. Abort ();

gObj. Clear (Color. LightGray);

checkBox1. Text = «Start»;

groupBox7. Enabled = true;

}

}

privatevoid MainWindow_FormClosing (object sender, FormClosingEventArgs e)

{

if (game == «Build»)

if (Build_. thr ≠ null)

if (Build_. thr. ThreadState == System. Threading. ThreadState. Suspended)

{

Build_. thr. Resume ();

Build_. thr. Abort ();

}

else

Build_. thr. Abort ();

if (game == «Tanks"& & Tanks_ ≠ null)

if (Tanks_. thr ≠ null)

if (Tanks_. thr. ThreadState == System. Threading. ThreadState. Suspended)

{

Tanks_. thr. Resume ();

Tanks_. thr. Abort ();

thrTime. Resume ();

thrTime. Abort ();

label11. Text = «0»;

}

else

{

Tanks_. thr. Abort ();

thrTime. Abort ();

label11. Text = «0»;

}

}

privatevoid button1_Click1(object sender, EventArgs e)

{

if (Build_. thr ≠ null)

if (Build_. thr. ThreadState == System. Threading. ThreadState. Suspended)

{

Build_. thr. Resume ();

Build_. thr. Abort ();

}

else

Build_. thr. Abort ();

game = «Build»;

checkBox1. Enabled = true;

checkBox1. Checked = false;

Pause. Checked = false;

LeftPanel. Visible = false;

RightPanel. Visible = false;

PanelPad. Visible = false;

PanelMenu. Visible = true;

}

privatevoid button2_Click (object sender, EventArgs e)

{

game = «Build»;

PanelMenu. Visible = false;

PanelPad. Visible = true;

LeftPanel. Visible = true;

LeftPanel. Enabled = true;

RightPanel. Visible = true;

RightPanel. Enabled = true;

label1. Text = «0»;

label2. Text = «0»;

label3. Text = «0»;

label4. Text = «0»;

}

privatevoid button4_Click (object sender, EventArgs e)

{

if (debug. Enabled)

debug. Enabled = false;

else

debug. Enabled = true;

}

privatevoid listView1_ColumnClick (object sender, ColumnClickEventArgs e)

{

// Create an instance of the ColHeader class.

ColHeader clickedCol = (ColHeader)this. listView1. Columns[e. Column];

// Set the ascending property to sort in the opposite order.

clickedCol. ascending = !clickedCol. ascending;

// Get the number of items in the list.

int numItems = this. listView1. Items. Count;

// Turn off display while data is repoplulated.

this. listView1. BeginUpdate ();

// Populate an ArrayList with a SortWrapper of each list item.

ArrayList SortArray = newArrayList ();

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

{

SortArray. 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.

SortArray. Sort (0, SortArray. Count, newSortWrapper. SortComparer (clickedCol. ascending));

// Clear the list, and repopulate with the sorted items.

this. listView1. Items. Clear ();

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

this. listView1. Items. Add (((SortWrapper)SortArray[i]). sortItem);

// Turn display back on.

this. listView1. EndUpdate ();

}

privatevoid MainWindow_Load (object sender, EventArgs e)

{

}

privatevoid MainWindow_Load1(object sender, EventArgs e)

{

}

privatevoid RightPanel_Paint (object sender, PaintEventArgs e)

{

}

privatevoid button3_Click (object sender, EventArgs e)

{

MF = (MainWindow)Form. ActiveForm;

PanelPad. Visible = true;

PanelMenu. Visible = false;

panel2. Enabled = true;

panel2. Visible = true;

panel3. Visible = true;

panel3. Enabled = true;

game = «Tanks»;

}

privatevoid checkBox3_CheckedChanged (object sender, EventArgs e)

{

if (checkBox1. Checked)

{

Tanks_. thr. Resume ();

thrTime. Resume ();

label5. Visible = false;

checkBox2. Enabled = true;

}

else

{

Tanks_. thr. Suspend ();

thrTime. Suspend ();

label5. Visible = true;

checkBox2. Enabled = false;

}

}

privatevoid groupBox1_Enter (object sender, EventArgs e)

{

}

privatevoid richTextBox1_TextChanged (object sender, EventArgs e)

{

}

privatevoid time ()

{

int time = 0;

while (true)

{

updateT ();

Thread. Sleep (1000);

time++;

Tanks_. Tank_. score += 40;

Tanks_. Tank1. score += 40;

if (time % 60 == 0)

{

label11. Text = (time / 60). ToString () + «:» + «0»;

}

else

{

label11. Text = (time / 60). ToString () + «:» + (time % 60). ToString ();

}

}

}

publicvoid gOver (string name)

{

Tanks_. ClearTable ();

checkBox2. Checked = false;

MessageBox. Show («Танк «+ name + «был убит!», «GameOver», MessageBoxButtons. OK, MessageBoxIcon. Information);

}

publicvoid updateT ()

{

if (Tanks_ == null)

return;

label6. Text = Tanks_. Tank_. health. ToString ();

label12. Text = Tanks_. Tank1. health. ToString ();

label7. Text = Tanks_. Tank_. cheat. ToString ();

label8. Text = Tanks_. Tank1. cheat. ToString ();

label9. Text = Tanks_. Tank_. score. ToString ();

label10. Text = Tanks_. Tank1. score. ToString ();

Inv ();

}

privatevoid button5_Click (object sender, EventArgs e)

{

if (Tanks_. thr ≠ null)

if (Tanks_. thr. ThreadState == System. Threading. ThreadState. Suspended)

{

Tanks_. thr. Resume ();

Tanks_. thr. Abort ();

thrTime. Resume ();

thrTime. Abort ();

}

else

{

Tanks_. thr. Abort ();

thrTime. Abort ();

}

game = «Tanks»;

checkBox2. Enabled = true;

checkBox2. Checked = false;

checkBox3. Checked = false;

panel2. Visible = false;

panel2. Enabled = false;

panel3. Visible = false;

panel3. Enabled = false;

PanelPad. Visible = false;

PanelMenu. Visible = true;

}

privatevoid Pause_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)

{

switch (e. KeyCode)

{

caseKeys. Left:

caseKeys. Right:

caseKeys. Down:

caseKeys. Space:

caseKeys. Up:

caseKeys. LShiftKey:

caseKeys. Shift:

caseKeys. ShiftKey:

caseKeys. RShiftKey:

caseKeys. Alt:

caseKeys. ControlKey:

e. IsInputKey = true;

break;

}

}

privatevoid button1_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)

{

switch (e. KeyCode)

{

caseKeys. Left:

caseKeys. Right:

caseKeys. Down:

caseKeys. Space:

caseKeys. Up:

caseKeys. LShiftKey:

caseKeys. Shift:

caseKeys. ShiftKey:

caseKeys. RShiftKey:

caseKeys. Alt:

caseKeys. ControlKey:

e. IsInputKey = true;

break;

}

}

privatevoid checkBox2_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)

{

switch (e. KeyCode)

{

caseKeys. Left:

caseKeys. Right:

caseKeys. Down:

caseKeys. Space:

caseKeys. Up:

caseKeys. LShiftKey:

caseKeys. Shift:

caseKeys. ShiftKey:

caseKeys. RShiftKey:

caseKeys. Alt:

caseKeys. ControlKey:

e. IsInputKey = true;

break;

}

}

privatevoid checkBox3_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)

{

switch (e. KeyCode)

{

caseKeys. Left:

caseKeys. Right:

caseKeys. Down:

caseKeys. Space:

caseKeys. Up:

caseKeys. LShiftKey:

caseKeys. Shift:

caseKeys. ShiftKey:

caseKeys. RShiftKey:

caseKeys. Alt:

caseKeys. ControlKey:

e. IsInputKey = true;

break;

}

}

privatevoid button5_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e)

{

switch (e. KeyCode)

{

caseKeys. Left:

caseKeys. Right:

caseKeys. Down:

caseKeys. Space:

caseKeys. Up:

caseKeys. LShiftKey:

caseKeys. Shift:

caseKeys. ShiftKey:

caseKeys. RShiftKey:

caseKeys. Alt:

caseKeys. ControlKey:

e. IsInputKey = true;

break;

}

}

privatevoid startTanks (object sender, EventArgs e)

{

if (Tanks_ == null)

{

checkBox2. Text = «Stop»;

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