Создание игровой системы "Тетрис": количество игр, режимы сложности, интерфейс пользователя, игровая статистика, обработка исключений. Структура входных и выходных данных. Диаграммы и описание классов. Блок-схема алгоритма программы, результаты ее работы.
Постановка задачи 1.2 Методы, которыми можно решить задачу 1.3 Выбранный метод решения задачи Структура входных и выходных данных 5.
Список литературы
Приложение А. Листинг программы
Введение
C# - объектно-ориентированный язык программирования. Разработан в 1998-2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft.net Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.
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. Блок-схема алгоритма
5.1 Блок-схема функции VOIDLINEREM () - функция удаляет заполненные линии в игре "стройка" и опускает "постройку" в низ
5.2 Блок-схема функции VOIDCHECKCOORD (int [,] m)
Блок-схема функции VOIDCHECKCOORD (int [,] m) - функция проверяет не вышли ли координаты фигурыза границы игровой доски.
6. Алгоритмы функций
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. if (Build_. thr! = null) если поток игры "стройка" запущен то выполняем пункт 4 иначе переходим к пункту 8. if (Build_. thr. THREADSTATE == System. Threading. THREADSTATE. Suspended) еслипотокнаходитсявсостоянии "паузы" то выполняем пункты 5-6 иначе переходим к пункту 7.
Build_. thr. Abort (); останавливаем поток полностью. if (game == “Tanks” &&Tanks_! = null) если текущая игра "гонки (танки)" и объект класса MAINWINDOWTANKS_ инициализирован то выполняем пункт 9 иначе переходим к пункту 19. if (Tanks_. thr! = null) если поток игры "гонки (танки)" инициализирован то выполняем 10 пункт иначе переходим к пункту 19. if (Tanks_. thr. THREADSTATE == System. Threading. THREADSTATE. Suspended) если поток находится в состоянии "паузы" то выполняем пункты 11 - иначе переходим к пункту 16.
АЛГОРИТМФУНКЦИИVOIDSTARTTANKS (objectsender, EVENTARGSE) - функциязапускает или останавливает игру гонки (танки).
Начало.
Входные данные: sender - системный объект типа objectкоторый вызвал событие. e - объект типа EVENTARGS - системные аргументы произошедшего события.
Tanks_ - объект класса MAINWINDOWТИПА Tanks для запуска игры "гонки (танки)".
THRTIME - объект класса MAINWINDOWТИПА Threadдля запуска таймера в отдельном потоке.
RICHTEXTBOX1, RICHTEXTBOX2 - объекты класса MAINWINDOWТИПА RICHTEXTBOX содержащие имена игроков. if (Tanks_ == null) если объект игры "гонки (танки)" не инициализирован то выполняем пункты 3-9 иначе переходим к 10 пункту.
CHECKBOX2. Text = “Stop”; помечаем кнопку запуска теперь как кнопку остановки.
Tanks_ = NEWTANKS (); инициализируем объект Tanks_.
Tanks_. Start (); запускаем игру "гонки (танки)".
RICHTEXTBOX1. Enabled = false; закрываем доступ для изменения имени игрока 1.
RICHTEXTBOX2. Enabled = false; закрываем доступ для изменения имени игрока 2.
Tanks_. Tank_1. name = RICHTEXTBOX2. Text; приваиваемимятанку 2.
Tanks_. Tank_. name = RICHTEXTBOX1. Text; приваиваемимятанку 1.
CHECKBOX2. Text = “Start”; помечаем кнопку остановки теперь как кнопку запуска.
Tanks_. thr. Abort (); останавливаем поток в котором выполняется игра "гонки (танки)".
Tanks_. CLEARTABLE (); чистим игровую доску.
Tanks_ = null; обнуляем объект игры "гонки (танки)".
THRTIME. Abort (); останавливаем поток в котором выполнялся таймер. label11. Text = “0”; обнуляем таймер
RICHTEXTBOX1. Enabled = true; открываем доступ для изменения имени игрока 1.
RICHTEXTBOX2. 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)
{ 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 Tank_1;
publicbool GOVER = false;
publicvoid Start ()
{
CLEARTABLE ();
thr = NEWTHREAD (NEWTHREADSTART (TABLEPROC));
thr. Start ();
} publicvoid TABLEPROC ()
{
Tank_ = NEWTANK ("down", true);
Tank_1 = 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;
// 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.
// 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.